查看: 824|回复: 8

有关漫游的问题

[复制链接]

该用户从未签到

发表于 2014-9-27 22:07:49 | 显示全部楼层 |阅读模式
我是初学者,请教一个有关漫游的问题。
在漫游的代码中有这样的代码:

case (osgGA::GUIEventAdapter :RAG ):

                if ( m_bLeftButtonDown)

                {
                        m_vRotation._v[2] -= osg::DegreesToRadians(m_fAngle * (mouseX-m_fpushX));

                        m_vRotation._v[0] += osg::DegreesToRadians(1.1*(mouseY-m_fpushY)) ;

                        if (m_vRotation._v [0] >= 3.14)
                        {
                                m_vRotation._v [0] = 3.14 ;
                        }

                        if (m_vRotation._v [0] <= 0)
                        {
                                m_vRotation._v [0] = 0 ;
                        }
                }

这里面m_vRotation._v [0] 与m_vRotation._v[2] 分别代表什么??看不太懂啊

该用户从未签到

发表于 2014-9-28 10:41:32 | 显示全部楼层
俯仰角+偏转角

该用户从未签到

 楼主| 发表于 2014-9-28 15:28:43 | 显示全部楼层

那您能解释一下这段代码的意思吗??最好画一下图说明,谢谢您了
//前进
if (ea.getKey() == 0xFF52 || ea.getKey () == 0x57 || ea.getKey () == 0x77)//up
                        {

                                ChangePosition(osg::Vec3 (0, m_fMoveSpeed * sinf(osg:I_2+m_vRotation._v[2]), 0)) ;

                                ChangePosition(osg::Vec3 (m_fMoveSpeed * cosf(osg::PI_2+m_vRotation._v[2]), 0, 0)) ;

                                return true;
                        }

该用户从未签到

 楼主| 发表于 2014-9-28 15:46:22 | 显示全部楼层
或者说为怎么不能这样呢?
if (ea.getKey() == 0xFF52 || ea.getKey () == 0x57 || ea.getKey () == 0x77)//up
                        {

                                ChangePosition(osg::Vec3 (0, m_fMoveSpeed , 0)) ;

                               

                                return true;
                        }

该用户从未签到

发表于 2014-9-28 16:37:47 | 显示全部楼层
我的理解是分成两句写是将前进的方向进行了正交分解,如果按照你所设想的ChangePosition(osg::Vec3 (0, m_fMoveSpeed , 0)) ;将会导致模型无法转向移动,也就是说就算你按使模型朝向发生旋转,但你按up键,模型依然只会朝y轴正方向移动而不是它自身正对的方向。

该用户从未签到

 楼主| 发表于 2014-9-28 17:17:07 | 显示全部楼层
冰舞胧煌 发表于 2014-9-28 16:37
我的理解是分成两句写是将前进的方向进行了正交分解,如果按照你所设想的ChangePosition(osg::Vec3 (0, m_f ...

恩,这样我也试过,和你说的一样,只是我就是不明白
ChangePosition(osg::Vec3 (0, m_fMoveSpeed * sinf(osg:I_2+m_vRotation._v[2]), 0)) ;

   ChangePosition(osg::Vec3 (m_fMoveSpeed * cosf(osg:I_2+m_vRotation._v[2]), 0, 0)) ;
这两段代码这么理解,你能画个图给我看看吗?或者你加我QQ287600742,麻烦您了

该用户从未签到

发表于 2014-9-28 18:06:44 | 显示全部楼层
我这边没什么能用的画图工具,ChangePosition获取了一个三维向量,这个向量在内部内部三个值分别代表其在xyz三个方向上的分量,现在由于只在平面上移动,因此不考虑z。m_fMoveSpeed是移动速度,也就是每次按下前进或后退所造成的位移,这个位移不一定刚好就在X轴或Y方向上,因此它需要用X,Y轴组合起来表示。假设你的是初始方向是在X轴正方向上单位向量,现在逆时针旋转45度,那么此时其在x轴上的分量就是1*cos(45°),Y轴上的分量就是1*sin(45°)。

该用户从未签到

 楼主| 发表于 2014-9-29 09:24:21 | 显示全部楼层
还是不太懂:第一,那为什么要加上osg:I_2呢?第二,m_vRotation._v[2]代表的是初始方向与x轴的方向吗?

该用户从未签到

发表于 2014-9-29 15:19:07 | 显示全部楼层
平平淡淡 发表于 2014-9-29 09:24
还是不太懂:第一,那为什么要加上osg:I_2呢?第二,m_vRotation._v[2]代表的是初始方向与x轴的方向吗?

加上一个固定角是要使你模型起始的朝向和你默认的前进方向吻合,具体起始是哪个方向我也记不清了,不过这都是小问题,你可以多试几个参数值,看看效果是不是和你想象中的吻合,这个过程走一遍之后,关于坐标系的问题基本就能搞清了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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