怎么建造个人网站,郑州做网站推广电,汕头做网站优化公司,手机建站程序源码观众的眼睛好比三维渲染场景中的相机#xff0c;在VTK中用vtkCamera类来表示。vtkCamera负责把三维场景投影到二维平面#xff0c;如屏幕#xff0c;相机投影示意图如下图所示。
1.与相机投影相关的要素主要有如下几个#xff1a;
1#xff09;相机位置:
相机所处的位置…观众的眼睛好比三维渲染场景中的相机在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()都会保留上一次旋转的角度