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()都会保留上一次旋转的角度;

相关推荐
巴普蒂斯塔2 个月前
VTK+Qt+Cmake+VS的环境搭建
qt·vtk·cmake
noravinsc3 个月前
vtk.vtkXMLUnstructuredGridReader() 读取很耗内存
python·vtk
yiran_max3 个月前
vtkConnectivityFilter提取连通区域中的问题
vtk
stay hungry foolish4 个月前
PCL + Qt + Ribbon 风格(窗口自由组合) demo展示
c++·后端·spring cloud·ribbon·vtk·pcl
noravinsc4 个月前
paraview将raw数据转为vtk
python·vtk·raw
coco_1998_24 个月前
Ubuntu22.04 搭建 PCL 环境(VTK源码安装),PCL测试代码
linux·vtk·点云·pcl
hfmeet5 个月前
使用C++调用VTK库实现三维显示示例
c++·microsoft·vtk·三维显示
恋恋西风5 个月前
PolygonalSurfaceContourLineInterpolator 多边形交互器
vtk
leaf_csdn6 个月前
VTK9.2.0+QT5.14.0绘制三维显示背景
开发语言·qt·vtk
信必诺6 个月前
VTK —— 二、教程七 - 对点云进行操作(按下r键切换选取或观察模式)(附完整源码)
c++·vtk·点云