7.vtk坐标系
文章目录
- vtkCoordinate
- 示例
- 使用 vtkRenderer::SetViewport() 设置视口范围
-
Model坐标系统:这是定义模型本身的坐标系。它是一个局部坐标系,允许设计师以一种直观的方式创建对象,例如球体、立方体等。在这个坐标系中,对象的位置通常是相对于自身的中心或某个特定点来定义的。
-
World坐标系统:将多个Model坐标系统中的对象统一放置在一个共同的空间中,这个空间就是World坐标系统。通过缩放、旋转和平移等变换,可以将对象从其原始的Model坐标系移动到World坐标系中的指定位置。此坐标系也是光源和相机所在的坐标系。
-
View坐标系统:也称为Camera坐标系统,它是从虚拟相机的角度来看待整个世界的结果。在这个坐标系中,X、Y、Z轴的取值范围通常为[-1, 1],其中X、Y代表图像平面上的位置,而Z则表示距离相机的距离。从World坐标系到View坐标系的转换涉及到视图变换,即根据相机的位置和方向重新定位场景。
-
Display坐标系统:最终的坐标系,用于表示屏幕上实际显示的内容。与View坐标系不同的是,这里的坐标是基于屏幕分辨率的实际像素值。因此,从View坐标系到Display坐标系的转换涉及到投影变换和视口变换,以确保场景能够正确地适应不同的屏幕尺寸和比例。
vtkCoordinate
在VTK(Visualization Toolkit)中,vtkCoordinate 类是一个非常重要的工具,用于管理不同坐标系统之间的转换。通过 vtkCoordinate,可以方便地在不同的坐标系统之间进行映射和变换,从而实现复杂的渲染效果。
- DISPLAY
定义:X、Y 轴的取值为渲染窗口的像素值。原点位置:位于渲染窗口的左下角。特点:坐标单位为像素。是一个二维坐标系统。所有二维坐标系统都采用右手坐标系。方法:SetCoordinateSystemToDisplay()
- NORMALIZED DISPLAY
定义:X、Y 轴的取值范围为 [0, 1]。特点:坐标是归一化的,表示相对于渲染窗口的比例。(0, 0) 表示左下角,(1, 1) 表示右上角。方法:SetCoordinateSystemToNormalizedDisplay()
- VIEWPORT
定义:X、Y 的坐标值定义在视口或渲染器(Renderer)里。特点:坐标单位为像素。视口范围由 vtkRenderer::SetViewport() 设置。方法:SetCoordinateSystemToViewport()
- NORMALIZED VIEWPORT
定义:X、Y 的坐标值定义在视口或渲染器里,取值范围为 [0, 1]。特点:坐标是归一化的,表示相对于视口的比例。(0, 0) 表示视口的左下角,(1, 1) 表示视口的右上角。方法:SetCoordinateSystemToNormalizedViewport()
- VIEW
定义:X、Y、Z 坐标值定义在相机所在的坐标系统里。特点:X、Y、Z 的取值范围为 [-1, 1]。Z 值表示深度信息,通常用于表示物体到相机的距离。这是一个三维坐标系统。方法:SetCoordinateSystemToView()
- WORLD
定义:X、Y、Z 坐标值定义在世界坐标系统中。特点:是全局的三维坐标系统。用于定位场景中的对象、光源和相机。方法:SetCoordinateSystemToWorld()
- USER DEFINED
定义:用户自定义的坐标系统。特点:提供灵活性,允许开发者根据需求定义自己的坐标系统。方法:需要手动设置相关参数。
示例
#include <iostream>
#include <vtkSmartPointer.h>
#include <vtkCoordinate.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>using namespace std;int main() {// 创建一个 vtkCoordinate 对象vtkSmartPointer<vtkCoordinate> coordinate = vtkSmartPointer<vtkCoordinate>::New();// 设置坐标系统为 NORMALIZED DISPLAYcoordinate->SetCoordinateSystemToNormalizedDisplay();coordinate->SetValue(0.5, 0.5); // 设置坐标为 (0.5, 0.5)// 创建一个 vtkRenderer 对象vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();// 创建一个 vtkRenderWindow 对象vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();// 将 renderer 添加到 renderWindow 中renderWindow->AddRenderer(renderer);// 假设渲染窗口的大小为 800x600renderer->SetViewport(0.0, 0.0, 1.0, 1.0); // 设置视口范围renderWindow->SetSize(800, 600); // 设置渲染窗口大小// 获取渲染窗口中的像素坐标int* displayPosition = coordinate->GetComputedDisplayValue(renderer);std::cout << "Display Position: ("<< displayPosition[0] << ", "<< displayPosition[1] << ")" << std::endl;while (1);return 0;
}
使用 vtkRenderer::SetViewport() 设置视口范围
通过 SetViewport() 方法,可以在同一个渲染窗口中创建多个视口,每个视口对应一个渲染器。例如:
renderer1->SetViewport(0.0, 0.0, 0.5, 0.5); // 左下角视口
renderer2->SetViewport(0.5, 0.0, 1.0, 0.5); // 右下角视口
renderer3->SetViewport(0.0, 0.5, 0.5, 1.0); // 左上角视口
renderer4->SetViewport(0.5, 0.5, 1.0, 1.0); // 右上角视口