查看: 2002|回复: 12

修改MatrixManipulator派生类的_rotation的问题

[复制链接]

该用户从未签到

发表于 2009-12-31 09:22:40 | 显示全部楼层 |阅读模式
打算通过修改MatrixManipulator派生类的_rotation,改变观测角度,但通过
HPRToQuat(0,0,0);得到的坐标轴方向是y指向平面,z轴向下,x轴向右。为什么得到的不是osg默认的坐标轴方向(z指向屏幕,x向右,y向上)?
osg:uat HPRToQuat(double heading, double pitch, double roll)

{         

    osg::Quat q(

        roll,osg::Vec3d(0.0, 1.0, 0.0),

        pitch,osg::Vec3d(1.0, 0.0, 0.0),

        heading,osg::Vec3d(0.0, 0.0, 1.0));

    return q;

}

该用户从未签到

发表于 2009-12-31 09:34:39 | 显示全部楼层
本帖最后由 qele 于 2009-12-31 09:35 编辑
osg默认的坐标轴方向(z指向屏幕,x向右,y向上)?

OPENGL初始视点是这个。
OSG的MatrixManipulator的初始视点是z向上的;可以通过重写computeHomePosition()改变初始视点

该用户从未签到

发表于 2009-12-31 10:19:32 | 显示全部楼层
事实上,这里有一个认知的误区:OpenGL和OSG本身都没有坐标系的概念,只是computeHomePosition()在计算漫游器的起始位置时,将观察者置于(X向右,Y指向屏幕内,Z向上)的世界坐标中

该用户从未签到

 楼主| 发表于 2009-12-31 11:20:05 | 显示全部楼层
computeHomePosition()是改变漫游初始位置的,达不到我需要的功能。我现在需要将坐标轴画出来,让z轴指向屏幕,x向右,y向上。如何?

该用户从未签到

 楼主| 发表于 2009-12-31 11:23:39 | 显示全部楼层
就是当应用_rotation = HPRToQuat(0,0,0)时,坐标系能呈现z轴指向屏幕,x向右,y向上的状态

该用户从未签到

发表于 2009-12-31 12:33:19 | 显示全部楼层
这里最大的问题是,我根本不知道您自己的漫游器是如何计算相机位置的,因此也就无从说如何改变_rotation的值,因为它只是您的类中设置的一个成员变量而已(基类MatrixManipulator并没有这个成员)。如果真的希望与大家进行讨论的话,您需要首先给出自己设计的漫游器的算法

该用户从未签到

 楼主| 发表于 2009-12-31 14:50:44 | 显示全部楼层
6# array
您好,我主体上是借用了TrackballManipulator,只是加了几个与工程有关的变量,应该没有什么影响。谢谢回答

该用户从未签到

发表于 2009-12-31 15:02:40 | 显示全部楼层
嗯~~那个就是osg的坐标系

该用户从未签到

发表于 2009-12-31 15:04:41 | 显示全部楼层
那么您在什么地方执行这个HPRToQuat呢?要知道TrackballManipulator使用Arcball算法来处理旋转动作,这可绝不是简单的欧拉角度就能变换得到的

该用户从未签到

 楼主| 发表于 2009-12-31 15:24:15 | 显示全部楼层
您好,我是在函数handle中,直接利用HPRToQuat修改_rotation的。这样修改,实验观察,看到能得到正确的旋转角度,但就是基准坐标系不是我想要的指向。HPRToQuat(0,0,0)的时候,y指向屏幕,z轴向下,x轴向右。而我期望能得到z指向屏幕,x向右,y向上。

该用户从未签到

发表于 2009-12-31 16:06:29 | 显示全部楼层
本帖最后由 qele 于 2009-12-31 16:08 编辑

你的_rotation可能是在初始视点的基础上旋转的,所以你看到的是Z向上;
正如array说的,对物体的操作基本上是两种情况:1)改变节点自身的matrix;2)改变视点在世界坐标系中的位置;两种操作是等价的

该用户从未签到

 楼主| 发表于 2009-12-31 17:05:03 | 显示全部楼层
不对,初始视点应该是z向上,而我通过_rotation = HPRToQuat(0,0,0)得到的z却向下。

我想得到的功能是能通过对x,y,z轴的旋转,改变观测角度

我的想法是通过修改漫游器中的_rotation , 达到目的。即_rotation = HPRToQuat(0,0,0)时,z指向屏幕,x向右,y向上,而当_rotation = _rotation = HPRToQuat(osg:egreesToRadians(90),0,0),则是对某一个轴旋转90度。实验中,的确可以旋转,但他是相对_rotation = HPRToQuat(0,0,0)得到的坐标系的某一轴旋转的90度。非我期望的对z指向屏幕,x向右,y向上的某一轴旋转90度。

不知道是不是我的思路错误,请各位大侠指正。

该用户从未签到

发表于 2009-12-31 17:15:38 | 显示全部楼层
您可以在getMatrix()函数中打印一下_rotation 的值,看看是否在别的地方被改变了,TrackballManipulator中对_rotation的操作很多,您能否保证除了您的HPRToQuat,其它的操作都已经被屏蔽了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表