查看: 1276|回复: 5

看了杨老师的osg场景操控器,求解释!

[复制链接]

该用户从未签到

发表于 2011-5-17 11:08:24 | 显示全部楼层 |阅读模式
TravelManipulator::TravelManipulator()
{
//初始化视点
m_vPosition=osg::Vec3(0,0,0);
//初始化朝向
m_vRotation=osg::Vec3(osg::PI_2,0,0);
m_vStep=1;//步长
m_vRotateStep=0;//这个是什么??
}

请问m_vRotation[0],m_vRotation[1],m_vRotation[2]都是什么意思???????????


bool TravelManipulator::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& us)
{
switch(ea.getEventType())
{
  case osgGA::GUIEventAdapter::KEYDOWN:
  {
   if((ea.getKey()=='w') || (ea.getKey()=='W') || (ea.getKey()==osgGA::GUIEventAdapter::KEY_Up))
   {

    //下边这句话中为何用m_vRotation[2]指的是什么呢?为何要加上pi_2呢,我看了视频,可是这块讲的有点快了,不理解
  //为何要用osg::PI_2加上m_vRotation[2]呢?这块当时讲的一扫而过,不太理解,求解释,感谢!!

    ChangePosition(osg::Vec3d(m_vStep*cosf(osg::PI_2 + m_vRotation[2]),m_vStep*::sinf(osg::PI_2+m_vRotation[2]),0));
    return true;
   }
   else if((ea.getKey()=='s') || (ea.getKey()=='S') || (ea.getKey()==osgGA::GUIEventAdapter::KEY_Down))
   {
    ChangePosition(osg::Vec3d(-m_vStep*cosf(osg::PI_2 + m_vRotation[2]),-m_vStep*::sinf(osg::PI_2+m_vRotation[2]),0));
    return true;
   }
   else if((ea.getKey()=='a') || (ea.getKey()=='A'))
   {
    ChangePosition(osg::Vec3d(-m_vStep*sinf(osg::PI_2 + m_vRotation[2]),m_vStep*::cosf(osg::PI_2+m_vRotation[2]),0));
    return true;
   }
   else if((ea.getKey()=='d') || (ea.getKey()=='D'))
   {
    ChangePosition(osg::Vec3d(m_vStep*sinf(osg::PI_2 + m_vRotation[2]),-m_vStep*::cosf(osg::PI_2+m_vRotation[2]),0));
    return true;
   }
   else if(ea.getKey()==osgGA::GUIEventAdapter::KEY_Left)
   {
    m_vRotation[2]+=0.2;
    return true;
   }
   else if(ea.getKey()==osgGA::GUIEventAdapter::KEY_Right)
   {
    m_vRotation[2]-=0.2;
    return true;
   }
   else if(ea.getKey()==osgGA::GUIEventAdapter::KEY_Home)
   {
    ChangePosition(osg::Vec3d(0,0,m_vStep));//向上,Z轴加正的m_vStep
    return true;
   }
   else if(ea.getKey()==osgGA::GUIEventAdapter::KEY_End)
   {
    ChangePosition(osg::Vec3d(0,0,-m_vStep));//向下,Z轴加负的m_vStep
    return true;
   }
   else
   {
   
   }
  }

}
return false;
}
void TravelManipulator::ChangePosition(osg::Vec3d &delta)
{
m_vPosition+=delta;

}

该用户从未签到

 楼主| 发表于 2011-5-17 11:28:08 | 显示全部楼层
刚才又细看了一次,发现m_vRotateStep指的是旋转步长,
请问
m_vStep=1;//步长

m_vRotateStep//旋转步长
有何区别?
可不可以就视频讲解中的那个PPT上的那个关于夹角,步长那一块帮我解释一下?
我想了又想,可还是想不通!!
求解!!在线等

非常感谢!

该用户从未签到

 楼主| 发表于 2011-5-17 11:57:06 | 显示全部楼层
为何无人问津呢??
请教array老师!

该用户从未签到

发表于 2011-5-17 15:07:11 | 显示全部楼层
回复 2# cyscsharp


    步长好像是指视点前进或者后退时候它每次前进/后退的长度,而旋转步长是指在视点转动过程中每次偏转的角度

该用户从未签到

 楼主| 发表于 2011-5-17 17:02:46 | 显示全部楼层
//下边这句话中为何用m_vRotation[2]指的是什么呢?为何要加上pi_2呢,我看了视频,可是这块讲的有点快了,不理解
  //为何要用osg::PI_2加上m_vRotation[2]呢?这块当时讲的一扫而过,不太理解,求解释,感谢!!

    ChangePosition(osg::Vec3d(m_vStep*cosf(osg::PI_2 + m_vRotation[2]),m_vStep*::sinf(osg::PI_2+m_vRotation[2]),0));
    return true;

由于m_vRotation是一个osg::Vec3类型的值,那么m_vRotation[2]不就是Z了吗,我觉得应该是Y吧
这是为什么呢?

该用户从未签到

发表于 2011-5-21 23:26:55 | 显示全部楼层
我不知道这里的ChangePosition函数的具体内容和参数的含义,因此也就无从解释这段程序的原理是什么
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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