当前位置: 首页 > news >正文

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,可以方便地在不同的坐标系统之间进行映射和变换,从而实现复杂的渲染效果。

  1. DISPLAY
   定义:X、Y 轴的取值为渲染窗口的像素值。原点位置:位于渲染窗口的左下角。特点:坐标单位为像素。是一个二维坐标系统。所有二维坐标系统都采用右手坐标系。方法:SetCoordinateSystemToDisplay()
  1. NORMALIZED DISPLAY
   定义:X、Y 轴的取值范围为 [0, 1]。特点:坐标是归一化的,表示相对于渲染窗口的比例。(0, 0) 表示左下角,(1, 1) 表示右上角。方法:SetCoordinateSystemToNormalizedDisplay()
  1. VIEWPORT
  定义:X、Y 的坐标值定义在视口或渲染器(Renderer)里。特点:坐标单位为像素。视口范围由 vtkRenderer::SetViewport() 设置。方法:SetCoordinateSystemToViewport()
  1. NORMALIZED VIEWPORT
   定义:X、Y 的坐标值定义在视口或渲染器里,取值范围为 [0, 1]。特点:坐标是归一化的,表示相对于视口的比例。(0, 0) 表示视口的左下角,(1, 1) 表示视口的右上角。方法:SetCoordinateSystemToNormalizedViewport()
  1. VIEW
    定义:X、Y、Z 坐标值定义在相机所在的坐标系统里。特点:X、Y、Z 的取值范围为 [-1, 1]。Z 值表示深度信息,通常用于表示物体到相机的距离。这是一个三维坐标系统。方法:SetCoordinateSystemToView()
  1. WORLD
   定义:X、Y、Z 坐标值定义在世界坐标系统中。特点:是全局的三维坐标系统。用于定位场景中的对象、光源和相机。方法:SetCoordinateSystemToWorld()
  1. 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); // 右上角视口

相关文章:

  • AI 提示词教程:从新手到高手的进阶之路
  • 运筹学之模拟退火
  • Python实例题:神经网络实现人脸识别任务
  • c++题目_P1443 马的遍历
  • [数学] 挑战nbc
  • WinForms开发基础:实现带X按钮的ClearableTextBox控件
  • 【数论】3260. 找出最大的 N 位 K 回文数|2370
  • 老婆是用来爱的,不是用来吼的
  • 探秘Python 工匠:案例、技巧与工程实践:解锁Python进阶的通关秘籍
  • Mixture-of-Experts with Expert Choice Routing:专家混合模型与专家选择路由
  • LeetCode 1365. 有多少小于当前数字的数字 java题解
  • @EnableAsync+@Async源码学习笔记之一
  • C语言格式化输入输出总结 (printf和scanf)
  • ubuntu18.04安装QT问题汇总
  • 【STM32单片机】#10 USART串口通信
  • Kubernetes 多主多从集群部署完整文档
  • 解码 Web Service:从技术原理到应用场景的深度剖析
  • (2)Vue事件绑定的使用
  • 测试第四课---------性能测试
  • JAVA IO、BIO、NIO、AIO及零拷贝
  • 白兰花香飘京城,上海文化体验项目点亮中华民族共同体之美
  • 老人在健身中心晕倒获AED急救,上海检察机关为何被感谢?
  • 季度市场叙事|时间已不在美国那边
  • 鲁比奥在法国只字不提关税,美国威胁下欧盟勉力维持统一战线
  • 全球建筑瞭望|与自然共呼吸的溪谷石舍与海边公共空间
  • 恒大汽车接获港交所复牌指引,还未披露公司2024年年报