基于上面一节,我们研究了场景中是如何加入actor的,然后actor在我们VTK中的作用。这里我们会研究VTK中是如何给我们的场景添加光照的。
实现效果
实现步骤
- 创建一个网格
- 创建材质,并且将网格混合成材质
- 给场景设置渲染器,规定场景背景颜色,并将actor加入场景
- 设置场景大小,设置场景标题
- 添加灯光
添加灯光
1-4的步骤我们上篇文章已经实现过了,这里不再重复描述,我们重点研究下灯光
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可以分为位置光和方向光,位置光是指在光源位置在渲染场景中的某个位置,可以通过灯光的衰减值、锥角等;方向灯光即光源位置在无穷远,可以认为光线是平行的,比如自然界中的太阳光。光源位置和焦点链接的定义光线的方向。默认的vtkLight为方向灯光。
vtkLight的常用方法如下:
- SetColor():设置灯光的颜色,以RGB的形式指定颜色。
- SetPosition(): 设置光照位置
- SetFocalPoint(): 设置灯光焦点
- SetIntensity(): 设置灯光的强度
- SetSwitch()/SwitchOn()/SwitchOff(): 打开或者关闭对应的灯光
代码实现
#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 <vtkLight.h>
#include <vtkCamera.h>
#include <vtkProperty.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
int main()
{
vtkSmartPointer<vtkCylinderSource> cylinder =
vtkSmartPointer<vtkCylinderSource>::New();
cylinder->SetHeight(3.0);
cylinder->SetRadius(1.0);
cylinder->SetResolution(10);
vtkSmartPointer<vtkPolyDataMapper> cylinderMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
cylinderMapper->SetInputConnection(cylinder->GetOutputPort());
vtkSmartPointer<vtkActor> cylinderActor =
vtkSmartPointer<vtkActor>::New();
cylinderActor->SetMapper(cylinderMapper);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(cylinderActor);
renderer->SetBackground(1.0, 1.0, 1.0);
vtkSmartPointer<vtkRenderWindow> renWin =
vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(renderer);
renWin->SetSize(640, 480);
renWin->Render();
renWin->SetWindowName("RenderCylinder-Lights");
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin);
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
iren->SetInteractorStyle(style);
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);
iren->Initialize();
iren->Start();
return EXIT_SUCCESS;
}