【VTK-Rendering::Core】第一期 vtkCoordinate坐标系统

很高兴在雪易的CSDN遇见你 

VTK技术爱好者 QQ:870202403


前言

本文分享vtkCoordinate源码解析,并对VTK中的各种坐标变换进行分析,希望对各位小伙伴有所帮助!

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的点赞就是我的动力(^U^)ノ~YO


1. vtkCoordinate

        在VTK的各种坐标系统中,执行坐标变换,并表示位置(Position)。也可以创建一个相互引用的vtkCoordinate对象。

        vtkCoordinate对象允许引用,即一个vtkCoordinate对象A可以引用另一个vtkCoordinate对象B,vtkCoordinate对象B也可以引用其他vtkCoordinate对象,依此类推,但是不能形成自循环。这允许你创建像vtkActor2D这样的组合组,它们的位置相对于另一个。注意,在级联序列中,每个vtkCoordinate对象可以在不同的坐标系中指定!。例如在vtkCaptionActor2D的定义中AttachmentPointCoordinate在WORLD坐标系中指定;PositionCoordinate在DISPLAY坐标系中指定。

        VTK中的坐标系统有如下几种:

DISPLAY坐标系统:表示在窗口上的x,y的像素值

        最小值:(0, 0)表示左下角的第一个像素。

        最大值:(Size,Size)表示右上角的最后一个像素

NORMALIZED DISPLAY坐标系统:表示归一化后的窗口像素值。

        最小值:(0, 0)表示左下角的第一个像素。

        最大值:(1,1)表示右上角的最后一个像素

VIEWPORT坐标系统:表示Viewport上的x,y像素值

        最小值:(0, 0)表示左下角的第一个像素。

        最大值:(Size,Size)表示右上角的最后一个像素

NORMALIZED VIEWPORT坐标系统:表示归一化后的Viewport的像素值

        最小值:(0, 0)表示左下角的第一个像素。

        最大值:(1,1)表示右上角的最后一个像素

POSE坐标系统:WORLD坐标系统相对于相机位置和View方向进行的移动和旋转坐标系统。

VIEW坐标系统:相机所看到的坐标系统,取值为【-1,1】。x,y值表示像平面上的位置,Z值表示到相机的距离。相机负责将WORLD坐标系变换到VIEW坐标系。

WORLD坐标系统:世界坐标系

USERDEFINED坐标系统:表示在用户定义的坐标系统下的值。

2. VTK中各坐标系统关系

Model坐标系统:指定义模型时所采用的坐标系统。

World坐标系统:放置Actor的三维空间系统。

vtkActor负责将模型从Model坐标系转化到World坐标系。

VTK中一个窗口可以放置多个Renderer(即ViewPort)。

renderer1->SetViewport(0.,0.,0.5,0.5);
renderer1->SetViewport(0.,0.5,0.5,1.0);
renderer1->SetViewport(0.5,0.,1.,0.5);
renderer1->SetViewport(0.5,0.5,1.0,1.0);

3. vtkCoordinate重要参数

3.1 设置/获取当前的坐标系统

  //@{/*** Set/get the coordinate system which this coordinate* is defined in. The options are Display, Normalized Display,* Viewport, Normalized Viewport, View, and World.*/vtkSetMacro(CoordinateSystem, int);vtkGetMacro(CoordinateSystem, int);void SetCoordinateSystemToDisplay() { this->SetCoordinateSystem(VTK_DISPLAY); }void SetCoordinateSystemToNormalizedDisplay(){this->SetCoordinateSystem(VTK_NORMALIZED_DISPLAY);}void SetCoordinateSystemToViewport() { this->SetCoordinateSystem(VTK_VIEWPORT); }void SetCoordinateSystemToNormalizedViewport(){this->SetCoordinateSystem(VTK_NORMALIZED_VIEWPORT);}void SetCoordinateSystemToView() { this->SetCoordinateSystem(VTK_VIEW); }void SetCoordinateSystemToPose() { this->SetCoordinateSystem(VTK_POSE); }void SetCoordinateSystemToWorld() { this->SetCoordinateSystem(VTK_WORLD); }//@}const char* GetCoordinateSystemAsString();

3.2 设置/获取坐标值

 //@{/*** Set/get the value of this coordinate. This can be thought of as* the position of this coordinate in its coordinate system.*/vtkSetVector3Macro(Value, double);vtkGetVector3Macro(Value, double);void SetValue(double a, double b) { this->SetValue(a, b, 0.0); }//@}

3.3 设置/获取参考坐标系

  //@{/*** If this coordinate is relative to another coordinate,* then specify that coordinate as the ReferenceCoordinate.* If this is NULL the coordinate is assumed to be absolute.* 若该坐标A关联其他坐标B,则将坐标B设置为参考坐标;* 若参考坐标为孔,则该坐标A是绝对坐标系统下的坐标*/virtual void SetReferenceCoordinate(vtkCoordinate*);vtkGetObjectMacro(ReferenceCoordinate, vtkCoordinate);//@}

3.4 设置关联的Viewport

  //@{/** 设置关联的viewport* If you want this coordinate to be relative to a specific* vtkViewport (vtkRenderer) then you can specify that here.* NOTE: this is a raw pointer, not a weak pointer nor a reference counted* object, to avoid reference cycle loop between rendering classes and filter* classes.*/void SetViewport(vtkViewport* viewport);vtkGetObjectMacro(Viewport, vtkViewport);//@}

3.5 获取各坐标系下的值

  //@{/*** Return the computed value in a specified coordinate system.*/double* GetComputedWorldValue(vtkViewport*) VTK_SIZEHINT(3);int* GetComputedViewportValue(vtkViewport*) VTK_SIZEHINT(2);int* GetComputedDisplayValue(vtkViewport*) VTK_SIZEHINT(2);int* GetComputedLocalDisplayValue(vtkViewport*) VTK_SIZEHINT(2);//@}double* GetComputedDoubleViewportValue(vtkViewport*) VTK_SIZEHINT(2);double* GetComputedDoubleDisplayValue(vtkViewport*) VTK_SIZEHINT(2);/*** GetComputedValue() will return either World, Viewport or* Display based on what has been set as the coordinate system.* This is good for objects like vtkLineSource, where the* user might want to use them as World or Viewport coordinates.*/double* GetComputedValue(vtkViewport*) VTK_SIZEHINT(3);/*** GetComputedUserDefinedValue() is to be used only when* the coordinate system is VTK_USERDEFINED. The user* must subclass vtkCoordinate and override this function,* when set as the TransformCoordinate in 2D-Mappers, the user* can customize display of 2D polygons*/virtual double* GetComputedUserDefinedValue(vtkViewport*) VTK_SIZEHINT(3) { return this->Value; }

4. vtkViewport进行坐标变换

上面RenderWindow的尺寸为(300,300),白色方框的Display坐标为(150,150),执行下面代码为:

  double XF = eventPos[0]; //XF = 150double YF = eventPos[1]; //YF = 150// convert to normalized viewport coordinatesthis->Renderer->DisplayToNormalizedDisplay(XF, YF); //XF = 150/300.=0.5;YF = 0.5;this->Renderer->NormalizedDisplayToViewport(XF, YF);//XF = 150;YF=150this->Renderer->ViewportToNormalizedViewport(XF, YF);//XF=0.5;YF=0.5;
void vtkViewport::DisplayToNormalizedDisplay(double& u, double& v)
{if (this->VTKWindow){/* get physical window dimensions */const int* size = this->VTKWindow->GetSize();if (size && size[0] != 0 && size[1] != 0){u = u / size[0];v = v / size[1];}}
}//----------------------------------------------------------------------------
void vtkViewport::NormalizedDisplayToViewport(double& u, double& v)
{if (this->VTKWindow){// get the pixel value for the viewport origindouble vpou, vpov;vpou = this->Viewport[0];vpov = this->Viewport[1];this->NormalizedDisplayToDisplay(vpou, vpov);// get the pixel value for the coordinatethis->NormalizedDisplayToDisplay(u, v);// subtract the vpou = u - vpou;v = v - vpov;}
}//----------------------------------------------------------------------------
void vtkViewport::ViewportToNormalizedViewport(double& u, double& v)
{if (this->VTKWindow){/* get physical window dimensions *//*double vpsizeu, vpsizev;const int *size = this->VTKWindow->GetSize();vpsizeu = size[0]*(this->Viewport[2] - this->Viewport[0]);vpsizev = size[1]*(this->Viewport[3] - this->Viewport[1]);u = u/(vpsizeu - 1.0);v = v/(vpsizev - 1.0);*/const int* size = this->GetSize();if (size && size[0] != 0 && size[1] != 0){u = u / size[0];v = v / size[1];}}
}

结论:

        理解坐标变换是VTK用好的基础,小伙伴一定要理解。

感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步!

你的赞赏是我的最最最最大的动力(^U^)ノ~YO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2661986.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

AIGC时代下,结合ChatGPT谈谈儿童教育

引言 都2024年了,谈到儿童教育,各位有什么新奇的想法嘛 我觉得第一要务,要注重习惯养成,我觉得聊习惯养成这件事情范围有点太大了,我想把习惯归纳于底层逻辑,我们大家都知道,在中国式教育下&a…

Glary Utilities Pro - 电脑系统优化全面指南:详尽使用教程

软件简介: Glary Utilities Pro 是一款全面的电脑优化工具,它旨在帮助用户提升计算机的性能和稳定性。这款软件提供了多种功能,包括系统清理、优化、修复以及保护。通过一键扫描,它可以识别并清除无用文件、临时数据、注册表错误等…

AIGC开发:调用openai的API接口

简介 开始进行最简单的使用:通过API调用openai的模型能力 OpenAI的能力如下图: 文本生成模型 OpenAI 的文本生成模型(通常称为生成式预训练 Transformer 或大型语言模型)经过训练可以理解自然语言、代码和图像。这些模型提供文…

这是蛰伏的第 1 年 —— 2023 年度总结

时间过得老快了,一下子就到 2023 年年底了,感觉自己好像什么都没做似的。 不过,又到了年终总结季了,正好跟大家唠唠嗑,我就想到啥说啥了。 工作淡如水 先聊聊工作的事情。回顾过去一年的工作,我最大的感…

微软CEO纳德拉当选2023年度CEO,AI大模型崛起成重要趋势;Mixtral 8x7B 真的击败了 GPT 3.5 Turbo 吗?

🦉 AI新闻 🚀 微软CEO纳德拉当选2023年度CEO,AI大模型崛起成重要趋势 摘要:2023年被认为是AI大模型崛起之年,微软CEO纳德拉凭借对AI的投资和领导力当选2023年度CEO。纳德拉将AI技术融入微软的产品和服务中&#xff0…

【解决问题】pyinstaller打包python应用进行快速分发

pyinstaller打包python应用进行快速分发 问题起因先利其器再善其事试用运行 问题起因 有同学问我要接口的应用,于是试了一下python打包成exe的过程。 先利其器 主要使用pyinstaller,可以通过pip安装 pip install pyinstaller安装过程如图 再善其事…

微服务全链路灰度方案介绍

目录 一、单体架构下的服务发布 1.1 蓝绿发布 二、微服务架构下的服务发布 三、微服务场景下服务发布的问题 四、全链路灰度解决方案 4.1 物理环境隔离 4.2 逻辑环境隔离 4.3 全链路灰度方案实现技术 4.3.1 标签路由 4.3.2 节点打标 4.3.3 流量染色 4.3.4 分布式链路…

力扣题目学习笔记(OC + Swift)19. 删除链表的倒数第 N 个结点

19. 删除链表的倒数第 N 个结点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 此题目为链表题,拿出我们的杀手锏,链表解题经典三把斧: 哑巴节点栈快慢指针 关于内存问题:由于Swift及…

无论男孩女孩都要尽情打扮

这款柔软又细腻的开衫外套 上身体验感很不错的哈 舒适软糯百搭还透气,抗起球的面料 黑灰两色简单大方 胸前加上了流行的刺绣设计,可爱又精致 单穿内搭都可,现在天气还比较冷 外面可以套个羽绒服之类的 时尚叠穿风,韩系范儿…

Web自动化测试:Selenium入门到精通

前言 说到自动化测试,就不得不提大名鼎鼎的Selenium。Selenium 是如今最常用的自动化测试工具之一,支持快速开发自动化测试框架,且支持在多种浏览器上执行测试。 Selenium学习难度小,开发周期短。对测试人员来说,如果…

模版匹配历劫之路1-匹配点太多如何解决

1测试图片 2初步推测是否是提取的点太多而导致匹配时间很长 2.1通过canny的算法来提取检测点 import numpy as np import cv2 import time import matplotlib.pyplot as pltclass GeoMatch:def __init__(self):self.noOfCordinates0 # 坐标数组中元素的个数self.cordinates…

ArcGIS批量计算shp面积并导出shp数据总面积(建模法)

在处理shp数据时, 又是我们需要知道许多个shp字段的批量计算,例如计算shp的总面积、面积平均值等,但是单个查看shp文件的属性进行汇总过于繁琐,因此可以借助建模批处理来计算。 首先准备数据:一个含有多个shp的文件夹。…

C++ Qt开发:SqlRelationalTable关联表组件

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍SqlRelationalTable关联表组件的常用方法及灵…

想畅游在全球顶级金融学识的海洋——人民大学与加拿大女王大学金融硕士

金融职场的你是否想象过有朝一日能够畅游在全球顶级金融学识的海洋中呢?在那里,你可以尽情探索和领略全球顶尖的金融学识的魅力与深度,与来自世界各地的专业人士共同交流和分享经验。这样的场景让人感到兴奋和向往,准备好了吗&…

Goal-Auxiliary Actor-Critic for 6D Robotic Grasping with Point Clouds

题目:基于点云的 6D 机器人抓取目标-辅助行为-评价 摘要:6D 机 器 人 抓 取超 越 自上 而 下捡 垃 圾桶 场 景是 一 项具 有 挑战 性 的任 务 。 以往基于 6 D 抓 取综 合和 机器 人运 动 规划 的解 决方 案 通常 在开 环设 置下 运 行, 对抓…

轻松实现电脑对iPhone应用管理

目录 摘要 引言 用户登录工具和连接设备 电脑可对手机应用程序批量操作 运行APP和查看APP日志 IPA包安装测试 摘要 本文介绍了如何使用克魔助手工具实现电脑对手机应用的管理操作。通过简单的步骤,用户可以批量操作手机应用、运行应用、查看应用日志以及安装测…

企业如何做好内容?媒介盒子分享

在个性化算法的支持下,企业通过创作优质内容使消费者主动选择企业的时代已经来临,对于中小企业来说,这是能够低成本进行营销的好机会。但是有许多企业对内容的理解依旧是片面的,今天媒介盒子就来和大家聊聊:企业如何做…

autosar SJBWY 开发

第一天: 解决tasking 增加任意目录源文件的问题; 展开 Advanced 下面 Browse...选你的源文件目录就好了;

彭涛:2023年终复盘,工作,团队,个人!

眨眼2023即将结束,2024即将开启,每年这个时候,都会简单总结下自己这一年,既是对今年的一个复盘和回顾,也是对新一年的向往和期待。 我的2023年,大概分为 「个人」,「家庭」,「团队」…

第二证券:道指再创历史新高,国际油价大跌超2.5%

当地时间周四,美股收盘涨跌不一,道指再创前史新高,标普500指数进一步迫临前史纪录。到收盘,道指涨53.58点,涨幅为0.14%,报37710.10点;标普500指数涨1.77点,涨幅为0.04%,报…