VTK可视化工具包之旅04-场景中的灯光

1,360 阅读2分钟

基于上面一节,我们研究了场景中是如何加入actor的,然后actor在我们VTK中的作用。这里我们会研究VTK中是如何给我们的场景添加光照的。

实现效果

image.png

实现步骤

  1. 创建一个网格
  2. 创建材质,并且将网格混合成材质
  3. 给场景设置渲染器,规定场景背景颜色,并将actor加入场景
  4. 设置场景大小,设置场景标题
  5. 添加灯光

添加灯光

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;
}