VTK 三维场景的基本要素(相机) vtkCamera

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

1.与相机投影相关的要素主要有如下几个:

1)相机位置:

相机所处的位置,用vtkCamera::SetPosition()方法设置。

2)相机焦点:

用vtkCamera::SetFocusPoint()方法设置,默认的焦点位置在世界坐标系的原点。

3)朝上方向:

朝上方向即哪个方向为相机朝上的方向。就好比直立看东西,方向为头朝上,看到的东西也是直立的,如果倒立看某个东西,这时方向头朝下,看到的东西就是倒立的。相机位置、相机焦点和朝上方向三个因素确定了相机的实际方向,即确定相机的试图。

4)投影方向:

相机位置到相机焦点的向量方向即为投影方向。

5)投影方法: 该要素用于确定Actor是如何映射到像平面的。

vtkCamera定义了两种投影方法:

一种是正交投影(Orthographic Projection),也叫平行投影(Parallel Projection),即进入相机的光线与投影方向是平行的;

另一种是透视投影(Perspective Projection),即所有光线相较于一点。该投影方法最符合人类眼睛对于景物所产生的近大远小的视觉习惯。

6)视角:

透视投影时需要指定相机的视角(View Angle),默认的视角大小为30°,可以用vtkCamera::SetViewAngle()方法设置。

7)前后裁剪平面:

裁剪平面与投影方向相交,一般与投影方向也是垂直的。裁剪平面主要用于评估Actor与相机距离的远近,只有在前后裁剪平面之间的Actor才是可见的。裁剪平面的位置可以用vtkCamera::SetClippingRange()方法设置。

相机的视野范围是一个锥状体; 相机位置和焦点位置定义了相机的位置和投影方向,前裁剪平面与 后裁剪平面 之间为可见区域**;**

相机坐标

相机所在的位置坐标;

复制代码
   void SetPosition(double x, double y, double z);
   void SetPosition(const double a[3]) { this->SetPosition(a[0], a[1], a[2]); }
   vtkGetVector3Macro(Position, double);

相机焦点

相机焦点所在的位置坐标;

复制代码
   void SetFocalPoint(double x, double y, double z);
   void SetFocalPoint(const double a[3]) { this->SetFocalPoint(a[0], a[1], a[2]); }
   vtkGetVector3Macro(FocalPoint, double);

通过设置相机焦点与相机坐标的距离,来移动焦点坐标,注意:设置的值必须为正值。

复制代码
void SetDistance(double);
vtkGetMacro(Distance, double);  

朝上方向

使用SetViewUp设置相机的朝上方向;

一般默认朝上方向是Y轴正向:(0,1,0);

修改相机的朝上方向,可以实现相机绕XYZ轴旋转的功能;

一般情况都是写0或者1,如果是斜着旋转,就要输入0-1范围内的小数,大家可以动手自己实验一下;

复制代码
   void SetViewUp(double vx, double vy, double vz);
   void SetViewUp(const double a[3]) { this->SetViewUp(a[0], a[1], a[2]); }
   vtkGetVector3Macro(ViewUp, double);

投影方式

设置/获取ParallelProjection实例变量的值。

这决定了相机应该进行透视投影还是平行投影。

复制代码
   void SetParallelProjection(vtkTypeBool flag);
   vtkGetMacro(ParallelProjection, vtkTypeBool);
   vtkBooleanMacro(ParallelProjection, vtkTypeBool);

投影方向

投影方向是指从相机位置到焦点方向的矢量。

复制代码
double DirectionOfProjection[3];
vtkGetVector3Macro(DirectionOfProjection, double);

这通常与ViewPlaneNormal相反,即垂直于屏幕的向量,除非视图是倾斜的。

旋转

void Roll(double angle):围绕投影方向旋转相机

void Azimuth(double angle); 以焦点为中心,围绕朝上方向方向向量,即在焦点为中心,焦距为半径的圆球的维度线上水平旋转;

void Elevation(double angle); 以焦点为中心,在焦点为中心,焦距为半径的圆球的经度线方向上旋转垂直旋转;

复制代码
void Yaw(double angle); 同Azimuth相似,以相机为中心,移动焦点坐标;
void Pitch(double angle); 同Elevation相似,以相机为中心,移动焦点坐标;

调整裁剪平面距离

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

设置前裁剪平面和后裁剪平面,前裁剪平面就是距离相机较近的平面,后平面就是距离相机较远位置;

dNear和dFar是距离相机坐标的距离,在相机坐标向焦点方向上的距离;

复制代码
void SetClippingRange(double dNear, double dFar);
void SetClippingRange(const double a[2]) { this->SetClippingRange(a[0], a[1]); }
vtkGetVector2Macro(ClippingRange, double);

重置相机参数

vtkRenderer类可以重置使用的相机参数;

virtual void ResetCamera();

根据可见的vtkActor自动设置相机参数。使得相机会重新定位以观察演员的中心点,并沿其初始视图平面法线移动(即,从镜头位置到焦点),这样所有的vtkActor都可以在相机中看到。

从源码中可以看到ResetCamera()只会重置相机的焦点焦距朝上方向等信息,不会重置旋转角度,如果要从一个Renderer中获取多个旋转后图像,需要对角度进行修正后计算,每次ResetCamera()都会保留上一次旋转的角度;

相关推荐
BoBoZz196 小时前
FlatVersusGouraud 对比平面着色和高洛德着色
python·vtk·图形渲染·图形处理
BoBoZz191 天前
ColorEdges 动态有向图的动态渲染
python·vtk·图形渲染·图形处理
BoBoZz191 天前
AmbientSpheres 调整材质的环境光系数来控制3D物体的着色效果
python·vtk·图形渲染·图形处理
BoBoZz192 天前
ResetCameraOrientation 保存、修改和恢复摄像机的精确视角参数
python·vtk·图形渲染·图形处理
BoBoZz192 天前
MultipleRenderWindows 创建多个渲染窗口
python·vtk·图形渲染·图形处理
BoBoZz195 天前
3D 医学扫描同时显示患者的皮肤、骨骼的 3D 模型(通过等值面提取),以及三个正交切片
python·vtk·图形渲染·图形处理
欧特克_Glodon6 天前
基于Qt+VTK实现的CT/MR影像浏览工具,支持体渲染及体模型剪裁
c++·qt·vtk·体渲染·裁剪
BoBoZz196 天前
GenerateCubesFromLabels 提取和可视化特定标签所代表的 3D 结构
python·vtk·图形渲染·图形处理
BoBoZz197 天前
Vol 建一个 3D 隐式函数体积数据
python·vtk·图形渲染·图形处理
明洞日记7 天前
【VTK手册030】并行加速利器:vtkSMPTools 深度解析与应用指南
c++·图像处理·vtk·图形渲染