查看: 2779|回复: 15

[求助]关于自定义漫游器

[复制链接]

该用户从未签到

发表于 2010-5-26 01:42:55 | 显示全部楼层 |阅读模式
我自定义了一个漫游器,添加到了keyswitchManipulator里,但在切换时会返回初始化的视角,请问如何从别的漫游器切换回来时如何维持当前视角呢?

该用户从未签到

发表于 2010-5-26 08:23:23 | 显示全部楼层
正常情况下是会维持当前视角的,keyswitchManipulator内部会通过setByViewMatrix把上一个漫游器的矩阵值传递给下一个漫游器。但是有些漫游器,尤其是您自己定义的漫游器,可能并没有实现这个虚函数

该用户从未签到

发表于 2010-5-26 09:36:28 | 显示全部楼层
呀,这个要学习了

该用户从未签到

 楼主| 发表于 2010-5-26 13:45:31 | 显示全部楼层
正常情况下是会维持当前视角的,keyswitchManipulator内部会通过setByViewMatrix把上一个漫游器的矩阵值传递给下一个漫游器。但是有些漫游器,尤其是您自己定义的漫游器,可能并没有实现这个虚函数
array 发表于 2010-5-26 08:23


感谢解答~

呃,另外请问setByViewMatrix在源代码的哪里?
osgGA/KeySwitchMatrixManipulator.cpp里没找到啊OTZ

该用户从未签到

发表于 2010-5-26 16:23:11 | 显示全部楼层
它会使用 下一个漫游器的setByViewMatrix 来设置 上一个漫游器的矩阵值 orz

该用户从未签到

 楼主| 发表于 2010-5-27 00:33:17 | 显示全部楼层
它会使用 下一个漫游器的setByViewMatrix 来设置 上一个漫游器的矩阵值 orz
array 发表于 2010-5-26 16:23


谢谢……但我还是很茫然……O_O|||

请问能讲的再具体一些吗?为啥是下一个漫游器设置上一个漫游器的矩阵值?究竟怎么操作的?

那如果想让自定义漫游器保持视角,是不是还得自定义一个keyswitchManipulator?

该用户从未签到

发表于 2010-5-27 08:25:59 | 显示全部楼层
如果您按照我所说的,花上一分钟去看一下KeySwitchMatrixManipulator的实现的话,就不会有那种茫然出现了,源代码就在src/osgGA中

为啥是下一个漫游器设置上一个漫游器的矩阵值?究竟怎么操作的
这个需要回答吗,呵呵。我个人怎么觉得这个过程是显而易见的。

KeySwitchMatrixManipulator内部保存了多个漫游器,并且通过键盘对它们进行切换。因此我倒是想先知道:您是如何去理解这个工具的用途的?

该用户从未签到

发表于 2010-5-27 10:06:21 | 显示全部楼层
masuo是想让漫游器返回该漫游器的上一个视角,而不是当前视角吗?比如使用漫游器1,漫游到某处时的视角为V1,然后在这个视角时你切换到了另一个漫游器2, 经过一阵漫游后的视角为V2,接着你又想切换到漫游器1,此时你希望回到视角V1,而不是当前的视角V2? 不知道你说的是不是这个意思,但是一般情况下,是下一个漫游器紧接着上一个漫游器的视角。

我现在也遇到类似的问题,正在寻求解决。

该用户从未签到

发表于 2010-5-27 13:30:36 | 显示全部楼层
楼上的问题需要自己编写一个类似于KeySwitchMatrixManipulator的漫游器来解决,只要在恰当的时候保存内部变量,应该也不会十分复杂

该用户从未签到

 楼主| 发表于 2010-5-27 20:03:41 | 显示全部楼层
如果您按照我所说的,花上一分钟去看一下KeySwitchMatrixManipulator的实现的话,就不会有那种茫然出现了,源代码就在src/osgGA中

这个需要回答吗,呵呵。我个人怎么觉得这个过程是显而易见的。

KeySwitchMatr ...
array 发表于 2010-5-27 08:25


谢谢!><

抱歉我之前理解错了,现在大概弄明白了

其实自定义漫游器是书上的示例代码,其中有一段将osg::Vec3  m_vPosition和 osg::Vec3  m_vRotation转换为矩阵
  1. osg::Matrixd TravelManipulator::getMatrix() const
  2. {
  3. osg::Matrixd mat;
  4. mat.makeRotate(m_vRotation._v[0], osg::Vec3(1.0f, 0.0f, 0.0f),
  5. m_vRotation._v[1], osg::Vec3(0.0f, 1.0f, 0.0f),
  6. m_vRotation._v[2], osg::Vec3(0.0f, 0.0f, 1.0f));
  7. return mat * osg::Matrixd::translate(m_vPosition);
  8. }
复制代码


但是我自己写的从矩阵还原为m_vPosition和m_vRotation的逆向操作却总是得不到正确的视角

  1. void TravelManipulator::setByMatrix(const osg::Matrixd& matrix)   
  2. {   
  3. m_vPosition = matrix.getTrans();
  4. osg::Quat m_quat = matrix.getRotate();
  5. m_quat.getRotate(m_fAngle,m_vRotation);
  6. }
复制代码


我看您之前在这贴
http://bbs.osgchina.org/viewthread.php?tid=2243&highlight=MatrixManipulator
里说到
getRotate()取得的是四元数值,它的asVec3得到的不是XYZ轴的欧拉角度,而是四元数的三个实轴分量。如果您的rotation是用欧拉角度定义的,那么需要自己写转换函数
array 发表于 2009-9-11 17:29


请问是这个原因吗?

该用户从未签到

发表于 2010-5-28 08:43:39 | 显示全部楼层
大概是这个原因,注意Quat::getRotate是同时获得当前四元数对应的角度和旋转轴,而不是“根据某个旋转轴来获取角度”

该用户从未签到

发表于 2011-7-6 16:37:23 | 显示全部楼层
回复 10# masuo


    请问通过getRotate()来获得具体绕某个轴旋转的角度的方法有吗?

该用户从未签到

发表于 2011-7-7 08:29:20 | 显示全部楼层
Quat::getRotate是同时获得当前四元数对应的角度和旋转轴,而不是“根据某个旋转轴来获取角度”
如果您希望取得绕任意给定轴的旋转角度,我想没有那种好事情

该用户从未签到

发表于 2012-12-23 18:38:23 | 显示全部楼层
array 发表于 2011-7-7 08:29
如果您希望取得绕任意给定轴的旋转角度,我想没有那种好事情

km->addMatrixManipulator(osgGA::GUIEventAdapter::KEY_V,"Auto",am);
km->addMatrixManipulator(osgGA::GUIEventAdapter::KEY_B,"Building",bm);

如果我这样连续放进去两个漫游器 第一个放进去的是0 还是1?就是selectMatrixManipulator()的参数是从0开始还是从1开始?

该用户从未签到

发表于 2012-12-24 08:10:35 | 显示全部楼层
一大波蓝猫 发表于 2012-12-23 18:38
km->addMatrixManipulator(osgGA::GUIEventAdapter::KEY_V,"Auto",am);
km->addMatrixManipulator(osgGA ...

按照添加的顺序从0增加

该用户从未签到

发表于 2012-12-24 11:09:10 | 显示全部楼层
liuzhiyu123 发表于 2012-12-24 08:10
按照添加的顺序从0增加

哦了 谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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