VTK学习笔记--3 入门范例2

这本书中的例子是循序渐进的,第二个例子比第一个例子多加了相机功能。

写程序代码之前的操作就不赘述了。下面直接从程序代码开始。

#include "vtkConeSource.h"
#include "vtkRenderer.h"
#include "vtkPolyDataMapper.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderWindow.h"

int main()
{
	vtkConeSource *cone= vtkConeSource::New();
	cone->SetHeight(3.0);
	cone->SetResolution(10);;
	cone->SetRadius(1.0);

	vtkPolyDataMapper *coneMapper=vtkPolyDataMapper::New();
	coneMapper->SetInputConnection(cone->GetOutputPort());

	vtkActor *coneActor=vtkActor::New();
	coneActor->SetMapper(coneMapper);

	vtkRenderer *ren1 = vtkRenderer::New();
	ren1->AddActor(coneActor);
	ren1->SetBackground(0.1,0.2,0.4);

	vtkRenderWindow *renWin=vtkRenderWindow::New();
	renWin->AddRenderer(ren1);
	renWin->SetSize(300,300);
	//每旋转1度渲染一次,共旋转360度
	int i;
	for(i=0;i<360;i++)
	{
		renWin->Render();
		//获取自动创建的相机对象并将其旋转1度
		ren1->GetActiveCamera()->Azimuth(1);
	}
	return 0;

}

2.代码解释

本例比入门范例1多用了一个相机。所以头文件中多加了一个"vtkCamera.h"。

在本例的循环中,先是调用渲染器的方法GetActiveCamera()来获取自动创建的相机,然后调用相机的方法

Azimuth(1)

将镜头进行旋转。旋转的方式是将相机的位置绕着焦点位置上的视图垂直向量进行旋转。焦点的位置默认为坐标运点,相机位置默认在z轴,视图垂直向量默认为(0,1,00,因此相机是在xoz平面上旋转的。

扩展:

上例使用的是自动创建的相机,也可以实例化vtkCamera来手动创建一个相机,之后调用渲染器的方法SetActiveCamera()将相机选进渲染器中。

代码修改如下:

vtkCamera *camera=vtkCamera::New();

ren1->SetActiveCamera(camera);

//每旋转1度渲染一次,共旋转360度

int i;

for(i=0;i<360;i++)

{

renWin->Render();

//获取自动创建的相机对象并将其旋转1度

//ren1->GetActiveCamera()->Azimuth(1);

camera->Azimuth(1);

}


运行程序可以看到确实有旋转,但是图像是放大的,不如自带的效果好。所以,应该需要对相机的一些参数进行设置。具体的设置方式还要看后面对这个类的介绍。

2015.1.7 终于知道了为什么这个图像是放大的了。是因为没有对相机进行重置:

进行如下修改就可以了:

vtkCamera *camera=vtkCamera::New();

ren1->SetActiveCamera(camera);

camera->SetPosition(1,1,1);

camera->SetFocalPoint(0,0,0);

camera->ComputeViewPlaneNormal();

ren1->ResetCamera();

//每旋转1度渲染一次,共旋转360度

int i;

for(i=0;i<360;i++)

{

renWin->Render();

//获取自动创建的相机对象并将其旋转1度

//ren1->GetActiveCamera()->Azimuth(1);

camera->Azimuth(1);

}


你可能感兴趣的:(VTK学习笔记--3 入门范例2)