VTK相机类vtkCamera原理及用法

vtk是著名的开源三维渲染库,在三维渲染过程中的一个非常重要的内容就是相机即vtkCamera类的设置。在VTK中,相机的实质是一个观测点。VTK的官方Doc对vtkCamera写的十分简略,暗坑很多。在学习和使用vtkCamera的过程中,我走了很多弯路。在我的应用中,我希望能够根据现实中相机的Transform Matrix完全模拟设置vtkCamera。下面根据我的经验和理解,介绍一下vtkCamera,希望对被人能有帮助。

vtkCamera参数

VTK相机类vtkCamera原理及用法_第1张图片

上图是vtkCamera模型示意图,虽然这个图来自于另一个3D库的文档,但是原理一样。要注意的是虽然左边画了个摄像机,但是其实图示的包括焦点在内都是在相机内部的。下面利用这个图来解释一下vtkCamera的各个成员变量的含义。


WindowCenter

WindowCenter按照字面意思是窗口的中心。在相机制造过程中难免存在一定的装配误差,所以透镜的中心往往不能完全对准传感器的中心,而是有非常微小的误差。所以我们在用vtk相机模拟现实中相机时也应该体现这一现象。WindowCenter实质上就是成像的一个offset偏移量。在vtk中WindowCenter的坐标范围是([-1,+1], [-1,+1])。比方说,如果理想情况,图像成像中心(Focal Point)就在窗口的中心,那么WindowCenter就是(0, 0)。如果希望把成像平移到窗口的右上角,那么就应该设置成(1, 1)。根据官方文档,这个量一般在同一窗口显示多个渲染器时才需要设置。但实际上,如果你需要vtk完全模拟现实相机,也要考虑设置这个量,否则永远有一个偏移量。反过来,如果希望图像平移也可以修改这个参数。

这里要注意的是,WindowCenter的正方向是向右向上的。而成像平面的坐标系往往是向右向下的。小心正负号的设置。另外,平移的对象是图像,而不是在三维空间移动相机。


FocalPoint

FocalPoint即焦点位置。在现实相机中焦点在成像平面中心,即在光心的后面(与被摄物体在光心的两侧)。但是在建模时为了简化我们往往对称到光心前面(与被摄物体在光心同侧)。注意这里要求的是焦点的三维坐标,而不仅仅是焦距。因为焦点不仅确定了成像平面的位置,还与光心位置Position一同确定了相机镜头的朝向。


Position

这里的Position指的实际上是光心的位置,或者说对应小孔相机模型中小孔的位置。


ViewUp

ViewUp指图像的正方向。由Position和FocalPoint我们可以确定5个自由度,相机仍然可以沿着主光轴任意旋转。所以这里要指定正方向,即ViewUp。这里注意,ViewUp是一个方向向量,不存在位置,或者说起点永远在原点。


ViewAngle

ViewAngle是视角。默认是30°。其实这个是一个很重要的参数,它决定了图像中内容的比例大小。或者说,通过设置这一变量可以实现图像的放缩。


ClippingRange

ClippingRange即剪切平面,分为前后两个。只有在这两个剪切平面之间的内容才会被渲染和显示。默认值是(0.1,1000)。这个量一般不需要修改,而是在vtkRenderer对象中调用ResetCameraClippingRange()方法来自动重设渲染范围。如果你的图像显示不完整,但是稍微用鼠标旋转或平移一下又变完整了。建议试一下调用一次这个方法。


ParallelProjection

如果为True那么按照平行投影进行渲染,否则默认是按照透视投影PerspectiveProjection进行渲染。透视投影即近大远小的投影,平行投影即用平行光照射得到的投影,没有近大远小的透视效应。如图所示:
VTK相机类vtkCamera原理及用法_第2张图片
VTK相机类vtkCamera原理及用法_第3张图片


DirectionOfProjection

DirectionOfProjection即一个三维矢量,从光心位置Position指向焦点位置FocalPoint。


ViewPlaneNormal

ViewPlaneNormal是投影面(成像面)的法向量。与DirectionOfProjection矢量正好相反。


Distance

Distance即焦距,即上面两个向量的模长。如果使用SetDistance()会沿着主光轴移动焦点FocalPoint,从而使FocalPoint与Position达到给定距离。


ModelTransformMatrix

这个变换矩阵将移动场景里除了相机的所有物体,然后渲染。理论上可以通过“ 相机不动物体动” 获得与 “物体不动相机动”一样的图片。但是标准的方法应该还是使相机移动,这样更符合实际。


ViewTransform

这个矩阵是相机矩阵的逆矩阵。相机矩阵是相机坐标系(原点Position,Z轴指向FocalPoint,Y轴与ViewUp平行)相对于世界坐标系的位置,而这个矩阵是世界坐标系相对于相机坐标系的位置。如果相机矩阵

T=[0R

你可能感兴趣的:(学习笔记,VTK,三维渲染,vtkCamera)