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

本文主要是介绍浅谈在操控器类中,为何要通过osgGA::CameraManipulator的逆矩阵改变视点位置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        在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

这篇关于浅谈在操控器类中,为何要通过osgGA::CameraManipulator的逆矩阵改变视点位置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/153888

相关文章

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

hdu 4565 推倒公式+矩阵快速幂

题意 求下式的值: Sn=⌈ (a+b√)n⌉%m S_n = \lceil\ (a + \sqrt{b}) ^ n \rceil\% m 其中: 0<a,m<215 0< a, m < 2^{15} 0<b,n<231 0 < b, n < 2^{31} (a−1)2<b<a2 (a-1)^2< b < a^2 解析 令: An=(a+b√)n A_n = (a +

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

hdu 6198 dfs枚举找规律+矩阵乘法

number number number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description We define a sequence  F : ⋅   F0=0,F1=1 ; ⋅   Fn=Fn

Linux Centos 迁移Mysql 数据位置

转自:http://www.tuicool.com/articles/zmqIn2 由于业务量增加导致安装在系统盘(20G)磁盘空间被占满了, 现在进行数据库的迁移. Mysql 是通过 yum 安装的. Centos6.5Mysql5.1 yum 安装的 mysql 服务 查看 mysql 的安装路径 执行查询 SQL show variables like

PDFQFZ高效定制:印章位置、大小随心所欲

前言 在科技编织的快节奏时代,我们不仅追求速度,更追求质量,让每一分努力都转化为生活的甜蜜果实——正是在这样的背景下,一款名为PDFQFZ-PDF的实用软件应运而生,它以其独特的功能和高效的处理能力,在PDF文档处理领域脱颖而出。 它的开发,源自于对现代办公效率提升的迫切需求。在数字化办公日益普及的今天,PDF作为一种跨平台、不易被篡改的文档格式,被广泛应用于合同签署、报告提交、证书打印等各个

浅谈PHP5中垃圾回收算法(Garbage Collection)的演化

前言 PHP是一门托管型语言,在PHP编程中程序员不需要手工处理内存资源的分配与释放(使用C编写PHP或Zend扩展除外),这就意味着PHP本身实现了垃圾回收机制(Garbage Collection)。现在如果去PHP官方网站(php.net)可以看到,目前PHP5的两个分支版本PHP5.2和PHP5.3是分别更新的,这是因为许多项目仍然使用5.2版本的PHP,而5.3版本对5.2并不是完

react笔记 8-18 事件 方法 定义方法 获取/改变数据 传值

1、定义方法并绑定 class News extends React.Component {constructor(props) {super(props)this.state = {msg:'home组件'}}run(){alert("我是一个run") //方法写在类中}render() {return (<div><h2>{this.state.msg}</h2><button onCli

线性代数|机器学习-P35距离矩阵和普鲁克问题

文章目录 1. 距离矩阵2. 正交普鲁克问题3. 实例说明 1. 距离矩阵 假设有三个点 x 1 , x 2 , x 3 x_1,x_2,x_3 x1​,x2​,x3​,三个点距离如下: ∣ ∣ x 1 − x 2 ∣ ∣ 2 = 1 , ∣ ∣ x 2 − x 3 ∣ ∣ 2 = 1 , ∣ ∣ x 1 − x 3 ∣ ∣ 2 = 6 \begin{equation} ||x