当前位置: 首页 > news >正文

4.vtk光照vtkLight

文章目录

  • VTK中的光照
    • 1. vtkLight 的两种类型:位置光照和方向光照
    • 2. vtkLight 的常用方法
    • 3. 方法命名风格
    • 4. vtkProp 的可见性与 vtkLight 的开关
  • 示例

VTK中的光照

vtkLight: 用于定义一个或多个光源。每个光源可以有其颜色、位置、焦点等属性。
vtkActor: 每个vtkActor对象(代表场景中的一个对象)都有自己的属性,包括材质属性(material properties),这些属性决定了该对象如何响应光。
vtkRenderer: 负责管理场景中的所有元素,包括光源和actor,并且控制着场景的最终渲染。

1. vtkLight 的两种类型:位置光照和方向光照

位置光照 (Positional Light):也称为聚光灯(Spotlight)。光源的位置在渲染场景中的某个具体点。可以指定光源的衰减值、锥角等参数,模拟现实世界中的灯光效果。示例:台灯、手电筒等。方向光照 (Directional Light):光源位于无穷远处,光线被认为是平行的。常用于模拟自然界的太阳光。默认情况下,vtkLight 是方向光照。

关键点: 光源的方向由其位置 (SetPosition) 和焦点 (SetFocalPoint)
的连线决定。如果光源是方向光照,则它的位置可以看作是无穷远,而方向由焦点决定。

2. vtkLight 的常用方法

以下是 vtkLight 提供的一些常用方法及其作用: (1) 设置光照颜色

SetColor(double r, double g, double b):设置光源的颜色,使用 RGB 格式。参数范围通常是 [0.0, 1.0]。示例:light->SetColor(1.0, 0.0, 0.0); 将光源颜色设置为红色。

(2) 设置光源位置

SetPosition(double x, double y, double z):设置光源的位置。对于位置光照,这是光源的具体坐标。对于方向光照,这是光源的方向向量。

(3) 设置焦点

SetFocalPoint(double x, double y, double z):设置光源的焦点。光源的方向是从光源位置指向焦点。

(4) 设置光照强度

SetIntensity(double intensity):设置光源的强度,默认值为 1.0。强度越高,光照越亮。

(5) 打开或关闭光源

SetSwitch(int onOff) / SwitchOn() / SwitchOff():控制光源的开关状态。SetSwitch(1) 或 SwitchOn() 表示打开光源。SetSwitch(0) 或 SwitchOff() 表示关闭光源。GetSwitch() 返回当前光源的开关状态。

3. 方法命名风格

VTK 中的方法命名遵循一定的模式,便于理解和使用。以下是常见的命名风格:

SetXXX() 和 GetXXX():SetXXX() 用于设置某个属性的值。GetXXX() 用于获取某个属性的当前值。

示例

light->SetIntensity(2.0);  // 设置光照强度为 2.0
double intensity = light->GetIntensity();  // 获取当前光照强度

XXXOn() 和 XXXOff():

XXXOn() 等价于 SetXXX(1),表示开启某个属性。
XXXOff() 等价于 SetXXX(0),表示关闭某个属性。

示例

light->SwitchOn();  // 打开光源
light->SwitchOff(); // 关闭光源

SetPositional() 和 GetPositional():

SetPositional(int) 用于设置光源是否为位置光照。SetPositional(1) 表示启用位置光照。SetPositional(0) 表示禁用位置光照(即使用方向光照)。
GetPositional() 返回当前光源是否为位置光照。

示例:

 light->SetPositional(1);  // 启用位置光照
bool isPositional = light->GetPositional();  // 检查是否为位置光照

4. vtkProp 的可见性与 vtkLight 的开关

在 VTK 中,类似的命名风格不仅适用于 vtkLight,还适用于其他类,例如 vtkProp(所有可视化对象的基类)。以下是一些类比:

vtkProp 的可见性控制:SetVisibility(int) / GetVisibility() / VisibilityOn() / VisibilityOff()。

示例:

actor->VisibilityOn();  // 显示对象
actor->VisibilityOff(); // 隐藏对象

vtkLight 的开关控制:

SetSwitch(int) / GetSwitch() / SwitchOn() / SwitchOff()。

示例:

light->SwitchOn();  // 打开光源
light->SwitchOff(); // 关闭光源

示例

#include <iostream>
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkCylinderSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkProperty.h>
#include <vtkAutoInit.h>
#include <vtkSphereSource.h>
#include <vtkLineSource.h>
#include <vtkPlaneSource.h>
#include <vtkLight.h>
#include <vtkNamedColors.h>
using namespace std;VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);int main()
{vtkNew<vtkNamedColors> colors;// 创建球体数据源vtkNew<vtkSphereSource> sphereSource;sphereSource->SetCenter(0.0, 0.0, 0.0);sphereSource->SetRadius(1.0);// 映射器vtkNew<vtkPolyDataMapper> mapper;mapper->SetInputConnection(sphereSource->GetOutputPort());// 创建演员vtkNew<vtkActor> actor;actor->SetMapper(mapper);actor->GetProperty()->SetColor(colors->GetColor3d("MistyRose").GetData());// 渲染器vtkNew<vtkRenderer> renderer;renderer->AddActor(actor);renderer->SetBackground(0.0, 1.0, 0.0);// 添加光源vtkNew<vtkLight> light;light->SetPositional(1);  // 设置为位置光照light->SetPosition(1, 1, 1);light->SetFocalPoint(0, 0, 0);light->SetConeAngle(30);light->SetDiffuseColor(colors->GetColor3d("White").GetData());light->SetSpecularColor(colors->GetColor3d("White").GetData());light->SetIntensity(2.0);  // 设置光照强度light->SwitchOn();         // 打开光源//light->SwitchOff();renderer->AddLight(light);// 渲染窗口vtkNew<vtkRenderWindow> renderWindow;renderWindow->AddRenderer(renderer);renderWindow->SetSize(640, 480);renderWindow->SetWindowName("LightingExample");// 渲染窗口交互器vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;renderWindowInteractor->SetRenderWindow(renderWindow);// style风格vtkNew<vtkInteractorStyleTrackballCamera> style;renderWindowInteractor->SetInteractorStyle(style);  // 修正:通过交互器设置样式// 开始渲染renderWindow->Render();renderWindowInteractor->Start();return 0;
}

在这里插入图片描述

相关文章:

  • 使用Python爬取豆瓣电影Top250并保存到Excel完整教程
  • 测试基础笔记第四天(html)
  • 交换机与路由器的默契配合:它们的联系与区别
  • Zookeeper 命令返回数据的含义
  • 【软考-架构】13.4、质量属性-架构评估
  • 【HDFS入门】HDFS核心组件Failover Controller:高可用保障机制解析
  • K8s 生产落地
  • 计算机网络:实验五路由器的应用
  • 360壁纸如何卸载
  • 阿里云 MSE Nacos 发布全新“安全防护”模块,简化安全配置,提升数据保护
  • 关于SQLite轻量数据库的研究
  • 控制理论与应用Latex模版/中文Latex
  • 教你如何创建Maven项目
  • 基于uniapp 实现画板签字
  • (EtherCAT 转 EtherNet/IP)EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关
  • day26 学习笔记
  • 关于vxe-select得filter-method 自定义方法得使用,忽略大小写匹配
  • 【LLM】Llama-Index 架构
  • 【三维重建与生成】GenFusion:SVD统一重建和生成
  • Java版本对应关系表
  • 滨江集团:一季度营收225.07亿元,净利润9.75亿元
  • 马克思主义理论研究教学名师系列访谈|杜玉华:马克思主义是“认识世界”和“改变世界”的思维工具
  • 中方拟解除对5名欧洲议会议员制裁?外交部:望中欧立法机构相向而行
  • 日菲同意扩大安全合作,外交部:反对任何在本地区拉帮结派的做法
  • 屠呦呦当选美国科学院外籍院士
  • 上海科创的三种品格