VTK的显示原理梳理

坐标系

VTK中的坐标系转换

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值