03-VTK基础概念(2)

本文介绍了VTK中的光照、相机、颜色和坐标系统概念。vtkLight表示光照,分为位置光照和方向光照,可用SetColor、SetPosition等方法设置属性。相机vtkCamera用于场景投影,通过SetPosition、SetFocalPoint等控制。颜色可使用RGB或HSV系统描述,vtkProperty和vtkLookupTable等类管理。坐标系统包括Model、World、View和Display,它们之间的转换由vtkCoordinate处理。
摘要由CSDN通过智能技术生成

3.3 光照

剧场里有各式各样的灯光,三维渲染场景中也一样,可以有多个光照存在。光照和相机是三维渲染场景必备的因素,如果没有指定(像3.1.1_RenderCylinder例子,我们没有给Renderer指定相机和光照),vtkRenderer会自动地创建默认的光照和相机。VTK里用类vtkLight来表示渲染场景中的光照。与现实中的灯光类似,VTK中的vtkLight实例也可以打开、关闭,设置光照的颜色,照射位置(即焦点),光照所在的位置,强度等等。

vtkLight可以分为位置光照(Positional Light,即聚光灯)和方向光照(Direction Light)。位置光照是光源位置在渲染场景中的某个位置,可以指定光照的衰减值、锥角等;方向光照即光源位置在无穷远,光线可以认为是平行的,比如自然界中的太阳光。光源的位置和焦点的连线定义光线的方向,默认的vtkLight即为方向光照。

vtkLight常的方法有:

SetColor() — 设置光照的颜色,以RGB的形式指定颜色。

SetPosition() — 设置光照位置。

SetFocalPoint() — 设置光照焦点。

SetIntensity() — 设置光照的强度。

SetSwitch() / SwitchOn()/ SwitchOff()— 打开或关闭对应的光照。

我们在讲vtkProp的时候,该类有方法SetVisibility (int) / GetVisibility() /VisibilityOn() /VisibilityOff()等来控制vtkProp对象的可见与不可见的属性。同样,vtkLight里也有类似命名风格的方法:SetSwitch() /GetSwitch()/SwitchOn()/ SwitchOff()。不难发现,在VTK里,某个属性的设置都是采取这一类方法,以vtkLight为例,SwitchOn()跟SetSwitch(1)实现的效果是一样,SwitchOff()则与SetSwitch(0)是一样的,GetSwitch()则是用于获取vtkLight对象关闭或打开这个属性的值。如果某个类有提供SetXXX()方法,一般也会提供GetXXX()方法来获取相应的值,这个我们在前面的内容也已经有一些了解。再比如,vtkLight还提供:SetPositional() / GetPositional()/ PositionalOn()/PositionalOff()一类方法来设置位置光照。

在类vtkLight的头文件vtkLight.h里,找不到类似SetSwitch()/GetSwitch()等方法的原型,但是可以看到以下几行:

vtkSetMacro(Switch,int);

vtkGetMacro(Switch,int);

vtkBooleanMacro(Switch,int);

顾名思义,vtkSetMacro/vtkGetMacro/vtkBooleanMacro都是宏,展开这几个宏以后就是以上函数的原型。为了保证代码的整洁与复用性,VTK在文件vtkSetGet.h里定义了大量了宏,当你找不到某个函数的原型时,可能这些函数就是由宏展开以后所定义的,所以,在阅读VTK源码的时候,不妨多右击一下某个函数或者关键字,然后点击弹出菜单中的“Go to Definition…”,也就一目了然了。

光照vtkLight的使用方法(程序执行结果如图3.5所示):

vtkSmartPointer<vtkLight> myLight= vtkSmartPointer<vtkLight>::New();

myLight->SetColor(0,1,0);

myLight->SetPosition(0,0,1);

myLight->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());

renderer->AddLight(myLight);

 

vtkSmartPointer<vtkLight> myLight2= vtkSmartPointer<vtkLight>::New();

myLight2->SetColor(0,0,1);

myLight2->SetPosition(0,0,-1);

myLight2->SetFocalPoint(renderer->GetActiveCamera()->GetFocalPoint());

renderer->AddLight(myLight2);

上述定义了两个vtkLight对象,一个为绿色光,位置在(0,0,1),焦点对着相机的焦点;另一个为蓝色光,位置在(0,0,-1),焦点也是对着相机的焦点,最后两个光照调用vtkRenderer的方法AddLight()加入到渲染场景中,因为Renderer里可以有多个灯照,所以,VTK提供的接口是AddLight()而不是SetLight()。

 

图3.5例3.1.1_R

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值