VTK 三维场景基本要素:相机

1.VTK中相机原理及控制属性

观众的眼睛就好比三维渲染场景中的相机,VTK则是用vtkCamera类来表示三维渲染场景中的相机。vtkCamera负责把三维场景投影到二维平面,如屏幕、图像等。下图为相机投影示意图:

从上图可以看出与相机投影相关的因素主要有:
相机位置:即相机所在的位置,用方法vtkCamera::SetPosition()设置。
相机焦点:用方法vtkCamera::SetFocusPoint()设置, 默认的焦点位置在世界坐标系的原点。
朝上方向:即哪个方向为相机朝上的方向。就好比我们直立看东西,方向为头朝上,看到的东西也是直立的,如果我们倒立看某个东西,这时方向为头朝下,看到的东西当然就是倒立的。相机位置、相机焦点和朝上方向三个因素确定了相机的实际方向,即确定相机的视图。
投影方向:相机位置到相机焦点的向量方向即为投影方向。
投影方法:确定Actor是如何映射到像平面的。vtkCamera定义了两种投影方法,一种是正交投影(OrthographicProjection),也叫平行投影(Parallel Projection),即进入相机的光线与投影方向是平行的。另一种是透视投影(PerspectiveProjection),即所有的光线相交于一点。
视角:透视投影时需要指定相机的视角(View Angle),默认的视角大小为30º,可以用方法vtkCamera::SetViewAngle()设置。
前后裁剪平面:裁剪平面与投影方向相交,一般与投影方向也是垂直的。裁剪平面主要用于评估Actor与相机距离的远近,只有在前后裁剪平面之间的Actor才是可见的。裁剪平面的位置可以用方法vtkCamera::SetClippingRange()设置。

2.相机使用方法示例

首先要记住一点的是Camera是Renderer(三维场景)的构成要素。
如果想获取vtkRenderer里默认的相机,可以用方法vtkRenderer::GetActiveCamera()。
相机vtkCamera的使用方法:
1 vtkSmartPointer<vtkCamera>myCamera = vtkSmartPointer<vtkCamera>::New();
2 myCamera->SetClippingRange(0.0475,2.3786); //这些值随便设置的,东灵提供的
3 myCamera->SetFocalPoint(0.0573,-0.2134, -0.0523);
4 myCamera->SetPosition(0.3245,-0.1139, -0.2932);//是否要保证相机位置-焦点向量 与 相机位置-向上方向 正交??
5 myCamera->ComputeViewPlaneNormal();//重新计算视平面法向量  平行于 相机-焦点
6 myCamera->SetViewUp(-0.2234,0.9983, 0.0345);
7 renderer->SetActiveCamera(myCamera); //激活新生成的相机
上述用SetClippingRange();SetFocalPoint();SetPosition()分别设置相机的前后裁剪平面,焦点和位置。ComputeViewPlaneNormal()方法是根据设置的相机位置、焦点等信息,重新计算视平面(View Plane)的法向量。一般该法向量与视平面是垂直的,如果不是垂直的话,Actor等看起来会有一些特殊的效果,如错切。SetViewUp()方法用于设置相机朝上方向。最后用方法vtkRenderer::SetActiveCamera()把相机设置到渲染场景中。
vtkCamera除了提供设置与相机投影因素相关的方法之外,还提供了大量的控制相机运动的方法,如:vtkCamera::Dolly(),vtkCamera::Roll(),vtkCamera::Azimuth(),vtkCamera::Yaw(),vtkCamera::Elevation(),vtkCamera::Pitch(),vtkCamera::Zoom()。这些方法具体表示相机是怎么运动,以及相对哪个位置或者方向运动。

3.相机运动方向示意图

关于控制相机的运动更详细的方法应该参考Camera说明文档。

4.相机简单测试

1     vtkSmartPointer<vtkCamera> mycamera =
2         vtkSmartPointer<vtkCamera>::New();
3     mycamera->SetFocalPoint(0,0,0);
4     mycamera->SetPosition(-5,0,0);
5     mycamera->SetClippingRange(5.5,6.5);
6     mycamera->ComputeViewPlaneNormal();
7     mycamera->SetViewUp(0,1,0);
8     renderer->SetActiveCamera(mycamera);
1     vtkSmartPointer<vtkCamera> mycamera =
2         vtkSmartPointer<vtkCamera>::New();
3     mycamera->SetFocalPoint(0,0,0);
4     mycamera->SetPosition(-10,0,0);
5     mycamera->SetClippingRange(10.5,11.5);
6     mycamera->ComputeViewPlaneNormal();
7     mycamera->SetViewUp(0,1,0);
8     renderer->SetActiveCamera(mycamera);
1     vtkSmartPointer<vtkCamera> mycamera =
2         vtkSmartPointer<vtkCamera>::New();
3     mycamera->SetFocalPoint(0,0,0);
4     mycamera->SetPosition(-10,0,0);
5     mycamera->SetClippingRange(5,9);
6     mycamera->ComputeViewPlaneNormal();
7     mycamera->SetViewUp(0,1,0);
8     renderer->SetActiveCamera(mycamera);
前后裁剪平面不合法。
原文地址:https://www.cnblogs.com/ybqjymy/p/14240979.html