VTK光照属性基本介绍与演示

环境光:

物体的光照属性包含了:环境光系数、漫反射光系数、镜反射光系数和镜面指数,设置他们的相应函数如下:

环境光系数:SetAmbient(  );

漫反射光系数:SetDiffuse();

镜反射光系数:SetSpecular();

镜面指数:SetSpecularPower();

介绍:

环境光系数:各种光线照射到物体材质上,经过多次反射后最终遗留再环境的光照强度。

漫反射光系数:光线照射在物体材质上,经过漫反射后形成的光线强度;

镜反射光系数:光线照射到物体材质上,经过镜面反射后形成的光线强度;

镜面指数的取值范围是0~128.取值越小,表示材质越粗糙,点光源发射的光线照射在上面也可以产生较大的亮点;取值越大,表示材质越类似于镜面,光源照射到上面后,产生较小的亮点;

vs2015+vtk7.0 console下实例如下:

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
#include<vtkSmartPointer.h>
#include<vtkSphereSource.h>
#include<vtkPolyDataMapper.h>
#include<vtkActor.h>
#include<vtkRenderer.h>
#include<vtkRenderWindow.h>
#include<vtkRenderWindowInteractor.h>
#include<vtkProperty.h>
#include<vtkCamera.h>
#include<vtkLight.h>
int main()
{
	vtkSmartPointer<vtkSphereSource>sphere = vtkSmartPointer<vtkSphereSource>::New();
	sphere->SetThetaResolution(100);
	sphere->SetPhiResolution(50);

	vtkSmartPointer<vtkPolyDataMapper>sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
	sphereMapper->SetInputConnection(sphere->GetOutputPort());

	vtkSmartPointer<vtkActor>sphere1 = vtkSmartPointer<vtkActor>::New();
	sphere1->SetMapper(sphereMapper);
	sphere1->GetProperty()->SetColor(1, 0, 0);
	sphere1->GetProperty()->SetAmbient(0.125);
	sphere1->GetProperty()->SetDiffuse(0.0);
	sphere1->GetProperty()->SetSpecular(0.0);

	vtkSmartPointer<vtkActor>sphere2 = vtkSmartPointer<vtkActor>::New();
	sphere2->SetMapper(sphereMapper);
	sphere2->GetProperty()->SetColor(1, 0, 0);
	sphere2->GetProperty()->SetAmbient(0.25);
	sphere2->GetProperty()->SetDiffuse(0.0);
	sphere2->GetProperty()->SetSpecular(0.0);
	sphere2->AddPosition(1.25, 0, 0);

	vtkSmartPointer<vtkActor>sphere3 = vtkSmartPointer<vtkActor>::New();
	sphere3->SetMapper(sphereMapper);
	sphere3->GetProperty()->SetColor(1.0, 0, 0);
	sphere3->GetProperty()->SetAmbient(0.375);
	sphere3->GetProperty()->SetDiffuse(0.0);
	sphere3->GetProperty()->SetSpecular(0.0);
	sphere3->AddPosition(2.5, 0, 0);

	vtkSmartPointer<vtkActor>sphere4 = vtkSmartPointer<vtkActor>::New();
	sphere4->SetMapper(sphereMapper);
	sphere4->GetProperty()->SetColor(1.0, 0, 0);
	sphere4->GetProperty()->SetAmbient(0.5);
	sphere4->GetProperty()->SetDiffuse(0.0);
	sphere4->GetProperty()->SetSpecular(0.0);
	sphere4->AddPosition(3.75, 0, 0);

	vtkSmartPointer<vtkActor>sphere5 = vtkSmartPointer<vtkActor>::New();
	sphere5->SetMapper(sphereMapper);
	sphere5->GetProperty()->SetColor(1.0, 0, 0);
	sphere5->GetProperty()->SetAmbient(0.625);
	sphere5->GetProperty()->SetDiffuse(0.0);
	sphere5->GetProperty()->SetSpecular(0.0);
	sphere5->AddPosition(0.0, 1.25, 0);

	vtkSmartPointer<vtkActor>sphere6 = vtkSmartPointer<vtkActor>::New();
	sphere6->SetMapper(sphereMapper);
	sphere6->GetProperty()->SetColor(1.0, 0, 0);
	sphere6->GetProperty()->SetAmbient(0.75);
	sphere6->GetProperty()->SetDiffuse(0.0);
	sphere6->GetProperty()->SetSpecular(0.0);
	sphere6->AddPosition(1.25, 1.25, 0);

	vtkSmartPointer<vtkActor>sphere7 = vtkSmartPointer<vtkActor>::New();
	sphere7->SetMapper(sphereMapper);
	sphere7->GetProperty()->SetColor(1.0, 0, 0);
	sphere7->GetProperty()->SetAmbient(0.875);
	sphere7->GetProperty()->SetDiffuse(0.0);
	sphere7->GetProperty()->SetSpecular(0.0);
	sphere7->AddPosition(2.5, 1.25, 0);

	vtkSmartPointer<vtkActor>sphere8 = vtkSmartPointer<vtkActor>::New();
	sphere8->SetMapper(sphereMapper);
	sphere8->GetProperty()->SetColor(1.0, 0, 0);
	sphere8->GetProperty()->SetAmbient(1.0);
	sphere8->GetProperty()->SetDiffuse(0.0);
	sphere8->GetProperty()->SetSpecular(0.0);
	sphere8->AddPosition(3.75, 1.25, 0);

	vtkSmartPointer<vtkRenderer>ren1 = vtkSmartPointer<vtkRenderer>::New();
	vtkSmartPointer<vtkRenderWindow>renWin = vtkSmartPointer<vtkRenderWindow>::New();
	vtkSmartPointer<vtkRenderWindowInteractor>iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	
	ren1->AddActor(sphere1);
	ren1->AddActor(sphere2);
	ren1->AddActor(sphere3);
	ren1->AddActor(sphere4);
	ren1->AddActor(sphere5);
	ren1->AddActor(sphere6);
	ren1->AddActor(sphere7);
	ren1->AddActor(sphere8);
	ren1->SetBackground(0.1, 0.2, 0.4);
	
	vtkSmartPointer<vtkLight>light = vtkSmartPointer<vtkLight>::New();
	light->SetFocalPoint(1.875, 0.6125, 0);
	light->SetPosition(0.875, 1.6125, 1);
	ren1->AddLight(light);
	ren1->GetActiveCamera()->SetFocalPoint(0, 0, 0);
	ren1->GetActiveCamera()->SetPosition(0, 0, 1);
	ren1->GetActiveCamera()->SetViewUp(0, 1, 0);
	ren1->GetActiveCamera()->ParallelProjectionOn();
	ren1->ResetCamera();
	ren1->GetActiveCamera()->SetParallelScale(1.5);

	renWin->AddRenderer(ren1);
	renWin->SetSize(800, 400);
	renWin->Render();
	renWin->SetWindowName("light test");

	iren->SetRenderWindow(renWin);
	iren->Start();
	return 0;
}

由图可以看出,随着环境光属性值的增加,演员越来越亮。

virtual void vtkProperty::SetAmbient (double )

Set/Get the ambient lighting coefficient.


猜你喜欢

转载自blog.csdn.net/thecentry/article/details/79178633