QOpenglWidget屏幕坐标系转到vtk世界坐标系

2023-11-18

原文

QOpenglWidget屏幕坐标系转到vtk世界坐标系

QOpenglWidget屏幕坐标系转到vtk世界坐标系

前两天看到有人问vtk的坐标系和qt的坐标系不同,之前有用qt实现了下vtk的测量距离和测量角度,其中就用到了QOpenglWidget屏幕坐标系转到vtk世界坐标系。这边记录一下:

xxx

本身是非计算机专业的本科,计算机视觉更是没有了解过,只记录下自己在工作中利用vtk实现可视化的实际应用经验。

我自己大概接触到这么几个坐标系:

  1. qt的屏幕坐标系(paintEvent绘制用的)二维的,原点在左上
  2. vtk的display坐标系 (vtk屏幕绘制的坐标系)二维的,原点在左下(右手坐标系)
  3. vtk的 normalized display坐标系 (display的归一化,用在:有多个render时屏幕分割、屏幕指示控件vtkOrientationMarkerWidget的位置)
  4. vtk相机的 view坐标系 (x,y,z相对相机位置,范围 -1~1 )
  5. vtk的word坐标系 (x,y,z实际位置)
  6. vtk的viewport和 normalized viewport。(就是vtk的renderer)
  • 世界坐标、
  • 视图坐标(计算机图形渲染坐标系)
  • 显示坐标(显示设备上的实际屏幕坐标)

角度测量

这个直接测量三个点的角度就行,不需要转到vtk的坐标系下,用qt的屏幕点计算即可


double GeneralAlgorithm::IncludedAngleLine(
  QPointF pos1, QPointF pos2, QPointF pos3, QPointF pos4)
{
    double k1 = (pos2.y() - pos1.y()) / (pos2.x() - pos1.x());
    double k2 = (pos4.y() - pos3.y()) / (pos4.x() - pos3.x());
    return atan(abs((k2 - k1) / (1 + k1 * k2))) * 57.29578;
}

距离测量

需要从QOpenglWidget屏幕坐标系转到vtk世界坐标系。

qt的屏幕坐标和vtk的屏幕坐标原点位置一个左上一个左下,所以y轴需要处理下 1023 - pos1.y(),1024是vtk窗口的大小。

vtk屏幕坐标转vtk空间坐标,如果确定是在焦平面上则直接用 viewportWorldToDisplay即可。
如果有偏移则需要判断是平行投影还是透视投影。

其实可以看到很多vtk自带的rep和handle都分2d和3d,区别就在于平行投影还是透视投影。
翻源码可以看出:

  • 2d(平行投影)直接使用现成的vtkCoordinate
  • 3d(平行或透视)都是根据ActiveCamera自己判断,比如下边注释的部分
double GeneralAlgorithm::ComputeWorldPosition(
  vtkRenderer *ren, double displayPos[], double worldPos[])
{
    double fp[4];
    ren->GetActiveCamera()->GetFocalPoint(fp);
    fp[3] = 1.0;

    ren->SetWorldPoint(fp);
    ren->WorldToDisplay();
    ren->GetDisplayPoint(fp);

    double tmp[4];
    tmp[0] = displayPos[0];
    tmp[1] = displayPos[1];
    tmp[2] = fp[2];
    ren->SetDisplayPoint(tmp);
    ren->DisplayToWorld();
    ren->GetWorldPoint(tmp);

    // 沿观察方向从焦平面“偏移”平移焦点。(我这里测量距离不需要)
    //    double Offset = 0.0;
    //    double focalPlaneNormal[3];
    //    ren->GetActiveCamera()->GetDirectionOfProjection(focalPlaneNormal);
    //    if (ren->GetActiveCamera()->GetParallelProjection()) {
    //        tmp[0] += (focalPlaneNormal[0] * Offset);
    //        tmp[1] += (focalPlaneNormal[1] * Offset);
    //        tmp[2] += (focalPlaneNormal[2] * Offset);
    //    } else {
    //        double camPos[3], viewDirection[3];
    //        ren->GetActiveCamera()->GetPosition(camPos);
    //        viewDirection[0] = tmp[0] - camPos[0];
    //        viewDirection[1] = tmp[1] - camPos[1];
    //        viewDirection[2] = tmp[2] - camPos[2];
    //        vtkMath::Normalize(viewDirection);
    //        double costheta = vtkMath::Dot(viewDirection, focalPlaneNormal)
    //          / (vtkMath::Norm(viewDirection) * vtkMath::Norm(focalPlaneNormal));
    //        if (costheta != 0.0) // 透视投影中0.0不可能
    //        {
    //            tmp[0] += (viewDirection[0] * Offset / costheta);
    //            tmp[1] += (viewDirection[1] * Offset / costheta);
    //            tmp[2] += (viewDirection[2] * Offset / costheta);
    //        }
    //    }

    worldPos[0] = tmp[0];
    worldPos[1] = tmp[1];
    worldPos[2] = tmp[2];
    return 1;
}

double GeneralAlgorithm::GetDistance(
  QPointF pos1, QPointF pos2, vtkRenderer *renderer)
{
    double p1[3], p2[3];
    double display1[2] { pos1.x(), 1023 - pos1.y() },
      display2[2] { pos2.x(), 1023 - pos2.y() };
    ComputeWorldPosition(renderer, display1, p1);
    ComputeWorldPosition(renderer, display2, p2);
    double distance = sqrt(vtkMath::Distance2BetweenPoints(p1, p2));
    return distance;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QOpenglWidget屏幕坐标系转到vtk世界坐标系 的相关文章

  • 网站虚拟主机是什么?(什么是虚拟主机空间)

    刚入行的新手用户肯定会接触一个叫虚拟主机的空间 特别是建站行业和个人用户使用的很多 不过很多新手用户对虚拟主机空间还是理解的不太明白 下面我们就来聊聊什么是网站虚拟主机空间 什么是虚拟主机 虚拟主机又称虚拟空间 网站空间 它是由单台物理服务
  • Hadoop学习:深入解析MapReduce的大数据魔力(二)

    Hadoop学习 深入解析MapReduce的大数据魔力 二 3 3 Shuffle 机制 3 3 1 Shuffle 机制 3 3 2 Partition 分区 3 3 3 Partition 分区案例实操 3 3 4 WritableC
  • odoo安装启动遇到的问题

    问题 在第一次加载odoo配置文件的时候 启动失败 方法 1 先检查odoo conf的内容 尤其是路径 options This is the password that allows database operations admin
  • 【前端面试】taro面试题总结

    Taro是一个开放式跨端跨框架解决方案 支持使用React Vue js Nerv等框架来开发小程序 H5 react Native等应用 特性 多端转换支持 可以转换到h5 任意app小程序平台 父子组件通信 父组件用import引入子组
  • Python 中的 sscanf() 函数

    文章目录 Python 中的 sscanf 功能 使用 re 库中的正则表达式 使用Neuron库 函数 sscanf 来自编程语言 C 和 C 虽然 Python 没有为此方法提供任何完全等效的方法或库 但可能有其他方法来执行此功能 这篇
  • Flutter依赖注入

    依赖注入 依赖注入 Dependency Injection 简称DI 是一种软件设计模式 它的主要目的是将对象之间的依赖关系解耦 使得代码更加可维护 可测试 可扩展 使得代码更易于维护和测试 在Flutter中 DI可以帮助我们管理应用程
  • 设置 Oracle 监听器密码(LISTENER) .

    设置 Oracle 监听器密码 LISTENER 监听器也有安全 Sure 在缺省的情况下 任意用户不需要使用任何密码即通过lsnrctl 工具对Oracle Listener进行操作或关闭 从 而造成任意新的会话都将无法建立连接 在Ora
  • C51流水灯 running water lamp

    include
  • 百度智能云 × 火星人丨厨电智能化,从动“手”到动“口”

    家电智能化时代已至 厨电智能化怎甘落后 火星人厨具股份有限公司 简称 火星人 是一家致力改善人们厨房环境 解决厨房油烟危害的高科技公司 2010年成立以来 火星人集成灶凭借核心技术 目前已在全国发展专卖店达一千七百多家 销售额每年快速增长
  • 区块链技术与应用环境部署day-02

    区块链技术与应用环境部署 关于作者 作者介绍 博客主页 作者主页 简介 云计算领域优质创作者 在校期间参与众多计算机相关的省赛 国赛 斩获系列荣誉 考取华为资深工程师 红帽工程师等系列认证 关注我 简历模板 学习资料 文档下载 技术支持 都
  • python sorted函数详解2023.9.11

    sorted函数详解 1 输入和输出 2 key传入函数 1 输入和输出 help sorted Help on built in function sorted in module builtins sorted iterable key
  • VisualBrush画刷

    VisualBrush派生于TileBrush TileBrush可以用来重复填充目标区域 若要使用图像进行绘制 请使用 ImageBrush 若要通过绘图绘制 请使用 DrawingBrush 若要通过 Visual 进行绘制 请使用 V
  • va_list的原理及用法

    va list原理及用法 分类 编程2010 10 20 11 22 1426人阅读 评论 1 收藏 举报 list编译器平台语言x86编程 VA LIST 是在C语言中解决变参问题的一组宏 变参问题是指参数的个数不定 可以是传入一个参数也
  • 如何设置无需fn直接按F1~F10(HP Pavilion Notebook )

    在Windows10下F1 F12都有特定的功能 必须按Fn F1才可以输出F1功能 给我们游戏玩家带来一定的困扰 网上说Fn esc就可以 实际上win10的多数的都不可以实现这功能 电脑概览 电脑型号 HP HP Pavilion No
  • C#Excel文件加密实现,支持xlsx、docx、pptx(C#/NET/Asp.Net)

    C Excel文件加密实现 支持xlsx docx pptx C Net Asp Net 读在最前面 1 Excel文件加密实现 本文以 Microsoft Office 2007 为案例进行说明 2 Microsoft Office 20
  • 离散型制造业如何做生产质量管控和智能追溯?

    离散型制造业做生产质量管控和智能追溯应该做到完善的质量追踪体系和生产过程中的防错防呆来保证质量 首先质量管理应该建立完善的质量跟踪体系 建立产品的全生命周期的管理 从原材料的采购 入库 批次到生产 装配 完工 销售等一个环节都不能漏掉 比如

随机推荐

  • 前后端交互的两种方式

    方式一 表单提交 表单 form 表单用于收集用户输入信息 并将数据提交给服务器 是一种常见的与服务端数据交互的一种方式 1 action 指定表单的提交地址 2 method 指定表单的提交方式 get post 默认get 3 inpu
  • webshell与防范

    1 WebShell的概念和危害性 WebShell就是以asp php jsp或者cgi等网页文件形式存在的 种命令执行环境 也可以称为 种网页后门 黑客在入侵网站后 通常会将WebShell后门文件与网站服务器WEB目录下正常的网页文件
  • python语法基础学习-有感而发

    基于本次的python学习 我想我大致了解清楚了python内的部分基础模块 总体而言python语法简洁移动 容易上手 值得进一步学习 为之后的AI方向打下一定基础
  • [Python]调用pytdx的代码示例

    安装pytdx pip install pytdx 简单示范 from pytdx hq import TdxHq API api TdxHq API 数据获取接口一般返回list结构 with api connect 119 147 21
  • vue常用面试题(三)

    1 计算属性computed是一个对象的时候 他有哪些选项 有get和set俩个选项 2 computed和methods有什么区别 计算属性具有缓存机制 methods中的方法每使用一次方法就会被调用一次 不管里面的数据是否发生变化 而使
  • 电机系统标幺值基准值的选取

    电机系统标幺化的好处 对于不同功率 电压值的设备标幺值在一定范围内 具有可比性 而测量值则随之变化 定点DSP控制 可有效防止数据溢出 各个基值的选取方式如下 转载于 https www cnblogs com derek32 p 3855
  • React入门小册(六) 状态提升与状态共享

    React 状态提升指的是将多个组件所共享的状态提升到它们的公共父组件中 以便于修改和同步这些数据的变化 一般而言 状态提升对于多个组件的功能需求相似 并且存在一定的层次结构时 是非常有用的 在实际应用开发中 我们经常会遇到需要将数据传递给
  • 问卷数据怎么处理、分析?

    调查问卷分析是一门很系统很成熟的科学 无论是基于何种目的的调查 学术 市场调研 产品调研 用户调研 还是哪种方式发放的问卷 纸质问卷 电子问卷 面对回收的庞杂的问卷 最重要的事情就是如何处理 得出我想想要的结论呢 1 准备工作 在发放问卷前
  • 常见汇编指令整理

    本文会整理在逆向中常见的指令汇总 目录 汇编符号 汇编指令的组成 mov movzx lea xchg 加法指令 减法指令 带进位加法 带进位减法 自增自减 乘法运算 除法运算 and or xor not shl shr 逻辑指令 字符串
  • Tesseract学习(四)

    本文将介绍如何在C 下调用Tesseract OCR 由于现在已经有编译好的dll文件 所以只需添加引用到项目中即可 dll文件可在此处下载 下载后添加到项目中 另外需要自己下载语言库 注意版本为3 01 此处为英文语言库 与在C 下添加引
  • 日常开发中,提升技术的13个建议

    最近有位好友问我 日常开发中 都是在做业务需求 如何提升自己的技术呢 因此 本文小黑整理了提升技术的13个建议 小伙伴们 一起加油 1 打好基础 深入学习语言特性 比如 对于Java程序员来说 要了解Java语言的基本概念和核心特性 包括面
  • 100天精通Python(基础篇)——第11天:面向对象基本概念

    作者介绍 Python领域优质创作者 数据开发工程师 励志成为Python全栈工程师 关注我发现更多精彩 本文已收录于Python全栈系列专栏 100天精通Python从入门到就业 欢迎订阅 订阅后可私聊进Python全栈VIP交流群 手把
  • 从理论到实践,让你全面看懂OKR!

    转自 http blog mingdao com 3934 html OKR资料全集已上线 你可以点击这里获取下载 文 明道 夏英凯 去年4月份 明道开了第一次OKR会议 那是我第一次接触OKR 当时就从心里喜欢上了这种管理方法 没想到后来
  • 电脑删除的文件如何找回?找回删除的文件有3个方法…

    大家的电脑存放着各种各样的文件 不能说每个文件都非常重要 但如果丢失了的话 电脑删除的文件如何找回 对于找回删除的文件这一块大家估计也花了不少心思 倒不是说一定要非要找回不可 电脑中的文件即便不是非常重要的 但是如果到了想要用的时候又得重新
  • 【log4j2】下载、安装、使用

    目录 1 下载 2 安装 3 使用 1 下载 https logging apache org log4j 2 x download html 下载文件名 apache log4j 2 14 1 bin zip 2 安装 1 解压 apac
  • 用VScode+anaconda搭建Python环境

    Python的IDE有很多 自带的IDLE spyder pycharm等都可以 但我目前用得最上手的是VScode 搭载anaconda 优点就是写代码效率高 第三方库导入一次性到位 下面介绍安装和配置教程 安装VS code 细节可以参
  • iPhone手机连接蓝牙鼠标和蓝牙键盘

    iPhone手机升级了IOS13之后 无意中发现了一个有趣的功能 iPhone手机可以连接蓝牙鼠标 具体方式如下 首先 要买一个支持蓝牙功能的鼠标 我用的罗技M590 建议再买一个蓝牙键盘 打开手机蓝牙 和蓝牙鼠标建立连接 这一步鼠标的说明
  • lVS+keepalived集群

    lvs keepalived 需要四台虚拟机 LVS 主 DIP 10 0 0 31 VIP 10 0 0 99 LVS 备 DIP 10 0 0 32 VIP 10 0 0 99 WEB1 RIP 10 0 0 33 VIP 10 0 0
  • 好看视频在线下载

    有时候在网上看到漂亮的小姐姐 想下载下来怎么办 比如这位漂亮的小姐姐 点击下面的示例地址就可以看到 https haokan baidu com videoui page videoland context 7B 22nid 22 3A 2
  • QOpenglWidget屏幕坐标系转到vtk世界坐标系

    原文 QOpenglWidget屏幕坐标系转到vtk世界坐标系 QOpenglWidget屏幕坐标系转到vtk世界坐标系 前两天看到有人问vtk的坐标系和qt的坐标系不同 之前有用qt实现了下vtk的测量距离和测量角度 其中就用到了QOpe