浅谈在操控器类中,为何要通过osgGA::CameraManipulator的逆矩阵改变视点位置

news2024/12/25 12:18:30

        在osg代码目录下的include\osgGA目录存放了很多osg自带的操控器类,这些操控器类都派生自osgGA::CameraManipulator,而这个CameraManipulator又派生自osgGA::GUIEventHandler,可见其本质上是个事件处理类。因此它首先会接收事件,比如鼠标一拖,场景就动。场景动与不动是受视点的位置、朝向来决定的,也就是观察矩阵,因此CameraManipulator必有处理事件的接口和输出矩阵的接口,处理事件的接口是函数bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter &aa);所以每个操作器类必须要对这个函数大书特书来达到按自己的操作目的。这个handle的被调用的地方是在一帧绘制的事件遍历阶段,是在void Viewer::eventTraversal()中,viewer.cpp的第1125行(以osg 3.6.2为例,下同):

_cameraManipulator->handle( event, 0, _eventVisitor.get());

虽然入参不一样,但是跟踪一下会发现会调用过去的。事件处理之后,就要根据处理的事件改变视点位置来达到操作场景的目的。这个是通过osgGA::CameraManipulator的如下函数:

virtual osg::Matrixd getInverseMatrix()

来实现的,它的调用时机是在更新阶段void Viewer::updateTraversal()中,viewer.cpp的第1212行:

_cameraManipulator->updateCamera(*_camera);

它会调用至:

camera.setViewMatrix(getInverseMatrix());

这个时候就有人不明白了,为什么要使用逆矩阵呢?原因这里有点绕,大家认真理解一下,世界坐标下,一个盒子在A点(xa,ya,za),视点在B点(xb,yb,zb),先不管朝向不朝向的。我们要输出此时在B点的人看到A点的图像,做法有很多,实际上图形学界是这么做的:把A点先转换为以B点为局部坐标的坐标系下,然后再进行一系列操作。这个变换的过程其实相当于需要求出把B点移回世界坐标原点的矩阵,A点再乘以这个矩阵就可以,这个移回的矩阵是这样计算的,把人从世界坐标原点移到B点的变换是Matrix,而把B点移回世界坐标原点的变换就是InverseMatrix,现在我们要把A点放在以B点为局部坐标下,则需要变换的就是InverseMatrix。下图是以二维坐标来讲解:(三维不好画出第三个轴,其实原理都一样)

假设在世界坐标系XOY下,A点、B点的变换矩阵分别为MatrixA、MatrixB。如果以B点为原点的坐标系为基准,则原来的世界坐标系原点O的变换矩形则为 MatrixB的逆矩阵,记为InverseMatrixB。因为如果在以B点为原点的坐标系下,A点不能直接转到B坐标系下,必须通过世界坐标系转到B为原点的坐标系才行,即如果以B点为原点的坐标系为基准,则必须按B->O->A来算出A在B坐标系下的坐标。而A点在世界坐标下的变换矩阵为MatrixA(即对应O->A), 世界坐标系的原点O在以B点为原点的坐标系下的变换矩阵为InverseMatrixB(即对应B->O),那么这反应到数学上,就是矩阵的级联相乘,即为如下:

InverseMatrixB * MatrixA

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

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

相关文章

月薪20k的软件测试工程师都要具备什么能力?你跟大佬的差距在哪?

第一,强大的业务能力:很熟悉业务流程,熟悉业务模块、数据、架构,测试所需资源。了解测试所需时间。 第二,发现bug能力:一般问题发现的能力,隐性问题发现能力,连带问题发现能力&…

专为实现最高性能和效率而设计,SQN3242UCKGTA、SQN3220SC、SQN3220 LTE-A Cat 6 模块【SKY85735-11射频前端】

一、SQN3242UCKGTA、SQN3220SC、SQN3220 LTE-A Cat 6 模块 1、简介 Sequans 的 Cassiopeia 是 Cat4 和 Cat6 LTE-Advanced 平台系列,包括集成了高性能网络和应用 CPU 的 SQN3220 Cat6 基带 SoC 和 SQN3220SC Cat4 基带 SoC、Sequans 的 SQN3242 LTE 优化收发器、经…

Pyhon-每日一练(1)

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

大华智慧园区前台任意文件上传(1day)

声明 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 漏洞简介 大华智慧园区综合管理平台是一个集智能化、信息化、网络化、…

3D人脸生成的论文

一、TECA 1、论文信息 2、开源情况:comming soon TECA: Text-Guided Generation and Editing of Compositional 3D AvatarsGiven a text description, our method produces a compositional 3D avatar consisting of a mesh-based face and body and NeRF-based ha…

总结三:计算机网络面经

文章目录 1、简述静态路由和动态路由?2、说说有哪些路由协议,都是如何更新的?3、简述域名解析过程,本机如何干预域名解析?4、简述 DNS 查询服务器的基本流程是什么?DNS 劫持是什么?5、简述网关的…

CCS安装和运行TMS320F28004x第一个程序

1. CCS安装 TI 的MCU或者DSP,官方的集成开发环境是 Code Composer Studio™ ,要开发TI的芯片,首先需要安装 CCS 环境。 CCS 软件可以到下面的 TI 官网下载: https://www.ti.com.cn/tool/cn/CCSTUDIO 下载完之后,点击…

Pandas vs SQL全面对比

前一段时间给大家详解过 Pandas 的用法,今天再来分享下 Pandas 与 SQL 的对比。 Pandas 和 SQL 有很多相似之处,都是对二维表的数据进行查询、处理,都是数据分析中常用的工具。 对于只会 Pandas 或只会 SQL 的朋友,可以通过今天…

【QT5-程序控制电源-RS232-SCPI协议-上位机-基础样例【1】】

【QT5-程序控制电源-RS232-SCPI协议-上位机-基础样例【1】】 1、前言2、实验环境3、自我总结1、基础了解仪器控制-熟悉仪器2、连接SCPI协议3、选择控制方式-程控方式-RS2324、代码编写 4、熟悉协议-SCPI协议5、测试实验-测试指令(1)硬件连接(…

学习记忆——图像篇——记忆古诗词

《长歌行》 青青园中葵,朝露待日晞。 阳春布德泽,万物生光辉。 常恐秋节至,焜黄华叶衰。 百川东到海,何时复西归? 少壮不努力,老大徒伤悲!

wisemodel 始智AI - 小记

文章目录 关于 wisemodel 始智AI 关于 wisemodel 始智AI https://www.wisemodel.cn/home 旨在打造中国版 “HuggingFace” 该社区汇聚了清华 / 智谱 chatglm2-6B、Stable Diffusion V1.5、alphafold2、seamless m4t large 等模型,以及 shareGPT、ultrachat、moss-…

80%测试员被骗,关于jmeter 的一个弥天大谎!

jmeter是目前大家都喜欢用的一款性能测试工具,因为它小巧、简单易上手,所以很多人都愿意用它来做接口测试或者性能测试,因此,在目前企业中,使用各个jmeter的版本都有,其中以jmeter3.x、4.x的应该居多。 但是…

网络安全行业真的内卷了吗?网络安全就业必看

前言 有一个特别流行的词语叫做“内卷”: 城市内卷太严重了,年轻人不好找工作;教育内卷;考研内卷;当然还有计算机行业内卷…… 这里的内卷当然不是这个词原本的意思,而是“过剩”“饱和”的替代词。 按照…

c++ 学习 之 运算符重载 知识要点

我们要好好分清楚一些运算符的结果为 左值还是 右值 赋值与调用

5. Mysql卸载

Mysql卸载 已经成功安装mysql,没有必要卸载,卸载之后不一定再次会安装成功。 双击安装包 检查如下三个目录是否有mysql,有的话,删除掉即可(前提,电脑只有Mysql8,否则mysql其他版本也会被删除)…

c#设计模式-行为型模式 之 状态模式

🚀简介 状态模式是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,我们可以通过创建一个状态接口和一些实现了该接口的状态类来实现状态模式。然后,我们可以创建一个上下文类,它会根据其当前的状态对象来改…

跨境电商卖家必知:如何提升订单好评的技巧大揭秘

随着跨境电商行业的不断发展,订单好评对于卖家来说变得越发重要。好评不仅能够提升产品和店铺的声誉,还能增加购买者的信任度,提高销售额。但是,如何获取更多的订单好评却是一个令卖家头疼的问题。下面将为您分享几个跨境电商订单…

PyTorch 深度学习实战

文章目录 前言1. 环境安装1.Anaconda2.pytorch cuda 环境3.测试 前言 1. 环境安装 1.Anaconda 可以参考这里:Anaconda学习 2.pytorch cuda 环境 我是按照下面的博客一步步完成,亲测有效 Pytorch安装教程(最全最详细版) 我的…

比特米盒子刷CoreELEC

CoreELEC就晶辰定制的Kodi版本,比特米盒子在刷入ATV后通过切换卡载系统可以安装CoreELEC即可安装,实现影音播放自由 1、U盘启动CoreELEC 1.1 、安装【安卓】切换卡载系统 通过U盘在已经刷好atv6.0的比特米盒子安装“切换卡载系统”。比特米盒子刷atv6.…

【C语言】善于利用指针(二)

💗个人主页💗 ⭐个人专栏——C语言初步学习⭐ 💫点击关注🤩一起学习C语言💯💫 ​ 目录 导读:1. 字符指针1.1 字符串的引用方式1.2 有趣的面试题 2. 数组指针2.1 一维数组指针的定义2.2 一维数组…