坐标系
Model坐标系统
Model坐标系统是定义模型时所用采用的坐标系统,通常是局部的笛卡尔坐标系。(在我实验中,我觉得在读取数据后,对数据进行矩阵变换改变的是物体在这个坐标系中的位置。)
World坐标系统
World坐标系统是放置Actor、相机和光照的三维空间坐标系。Actor的一个功能就是负责将Model坐标系统变换到World系统。World坐标系统只有一个,每个Actor必须通过放缩、旋转、平移等操作将Model坐标系变换到World坐标系。
View坐标系统
View坐标系统表示的是相机所看见的坐标系统。由x,y值组成,范围位于(-1,1),z值表示深度坐标。x,y值指定物体在图像平面的位置,而z值表示的是离照相机的距离。
相机的位置信息是由一个4*4的矩阵来表示的,这个矩阵用于将Word坐标系统变换到View坐标系。
ViewPort坐标系统
ViewPort坐标系统是把不同的渲染场景放在同一个窗口进行显示。用vtkRenderer::SetViewPort()来设置视口的范围。视口的x,y取值为(0, 1)。
Display坐标系统
Display坐标系统跟View坐标系统类似,但是各坐标轴的取值不是[-1, 1],而是使用屏幕像素值。z值表示深度信息。屏幕上显示的不同窗口的大小会影响View坐标系的坐标值[-1, 1]到Display坐标系的映射
VTK中的坐标转换
在vtk中,类vtkCoordinate可以实现不同坐标系之间的转换。也可以通过vtkRenderer进行部分坐标的转换。
- DISPLAY — X、Y轴的坐标取值为渲染窗口的像素值。坐标原点位于渲染窗口的左下角,这个对于VTK里所有的二维坐标系统都是一样的,且VTK里的坐标系统都是采用右手坐标系。
- NORMALIZEDDISPLAY — X、Y轴坐标取值范围为[0, 1],跟DISPLAY一样,也是定义在渲染窗口里的。
- VIEWPORT— X、Y的坐标值定义在视口或者渲染器(Renderer)里。
- NORMALIZEDVIEWPORT — X、Y坐标值定义在视口或渲染器里,取值范围为[0, 1]。
- VIEW— X、Y、Z坐标值定义在相机所在的坐标系统里,取值范围为[-1, 1],Z值表示深度信息。
- WORLD — X、Y、Z坐标值定义在世界坐标系统,参考图3.9。
- USERDEFINED— 用户自定义坐标系统。
示例
//display坐标转换成world坐标
double displayX = 10.1;
double displayY = 3.1;
double displayZ = 0.0;
vtkRenderer* renderer = vtkRenderer::New();
renderer->SetDisplayPoint(displayX ,displayY ,displayZ );
renderer->DisplayToWorld();
double* worldPoint = renderer->GetWorldPoint();
cout<<"world x = "<<worldPoint[0]<<"y = "<<worldPoint[1]<<"z = "<<worldPoint[2]<<endl;
总结函数值对应的坐标系
总结依据VTK源码中的注释
函数 | 坐标系 | 其他 |
---|---|---|
vtkImageData::GetBounds() | World坐标系。 | 返回值为{Xmin,Xmax,Ymin,Ymax,Zmin,Zmax}。经验推论:2D得到像素值,3D得到帧数乘间距的值 |
vtkCamera::GetPosition(); | World坐标系。 | 相机所在的坐标。 |
vtkCamera::GetFocalPoint(); | World坐标系。 | 相机焦点坐标。 |
vtkCamera::GetClippingRange(); | World坐标系。 | 相机前后裁剪平面坐标。用处详见参考文章[2] |
vtkCamera::GetParallelScale(); | World坐标系 | 视口在世界坐标系中的高度 |
vtkActor::GetPosition(); | World坐标系 | actor在世界坐标系中的位置 |
vtkRenderer::GetSize(); | Display坐标系 | renderer的大小 |
vtkRenderer::GetOrigin(); | Display坐标系 |
梳理
投影方式
vtkCamera主要有两种投影方式:平行投影(Orthographic Projection)和透视投影(Perspective Projection)。
平行投影(Orthographic Projection)
平行投影中,物体的尺寸不随距离变化。无论物体距离摄像机多远,它们在投影平面上的大小都保持不变。这种投影方式常用于工程制图和二维视图。
在VTK中,可以通过设置vtkCamera的ParallelProjection属性来启用平行投影:
camera->SetParallelProjection(1);
需要注意的是,一旦使用平行投影,后面对camera的setpostion()、zoom()、视角等操作都无法正常生效,想要改变大小只能通过SetParallelScale(int temp)这个数表示着camera到图像距离越小图像就越大
平行尺度(Parallel Scale):平行投影的一个重要参数是平行尺度,可以通过SetParallelScale方法设置。这决定了摄像机视图的大小。
平行尺度(Parallel Scale)
平行尺度决定了摄像机视图的高度范围,即从摄像机视角看出去的视图的高度的一半。在平行投影模式下,视图的高度范围是 2 * ParallelScale,而宽度范围则根据视口的宽高比自动调整。
透视投影(Perspective Projection)
透视投影中,物体的尺寸随距离变化。离摄像机越远的物体显得越小,近大远小的效果更符合人类视觉感受。这种投影方式常用于三维图形和动画。
在VTK中,透视投影是默认投影方式,可以通过设置vtkCamera的ParallelProjection属性来禁用平行投影:
camera->SetParallelProjection(0);
视角(View Angle):透视投影有一个视角参数,可以通过SetViewAngle方法设置。视角决定了摄像机的视野范围,通常以度数表示。
参考文章
1、链接: VTK基本概念之坐标系统
2、链接: VTK笔记-相机vtkCamera
3、链接: VTK入门——VTKCamera