查看: 1372|回复: 1

OSG绕Z轴旋转总是世界坐标系?烦请看一下,就一下下

[复制链接]

该用户从未签到

发表于 2016-11-17 10:42:40 | 显示全部楼层 |阅读模式
想实现的效果:坦克绕物体坐标系PITCH,YAW,ROLL正常旋转
但现实的效果:坦克绕物体坐标系PITCH,YAW正常,ROLL总是以世界坐标系来旋转
使用的是MatrixTransform,
也用PositionAttitudeTransform试过,也是一样的效果,后来我用一个MatrixTransform表示位移,另一个表示旋转,还是无法解决问题

节点结构
MatrixTransform *tankLocalMT
----Node *tank
变量
double  pitch,yaw,roll;
Quat  _rotate;
Vec3d  _translate;
Vec3d  _scale;

烦请大神看一下,困扰很久了
代码:

  1. Matrix tankData::setState()
  2. {
  3.         _rotate.makeRotate(
  4.                 osg::DegreesToRadians(pitch), Vec3d(1, 0, 0),
  5.                 osg::DegreesToRadians(yaw), Vec3d(0, 1, 0),
  6.                 osg::DegreesToRadians(roll), Vec3d(0, 0, 1)
  7.                 );
  8.         return  Matrix(
  9.                 Matrix::scale(_scale)*
  10.                 Matrix::rotate(_rotate)*
  11.                 Matrix::translate(_translate)
  12.                 );
  13. }
复制代码

  1. //向前移动
  2. void tankData::moveForward()
  3. {
  4.         _translate=_translate+(distance*flySpeed);
  5.         tankLocalMT->setMatrix(setState());
  6. }


  7. //朝正后方移动
  8. void tankData::moveBack()
  9. {
  10.         _translate=_translate-(distance*flySpeed);
  11.         tankLocalMT->setMatrix(setState());
  12. }
  13. //Roll旋转
  14. void tankData::turnRoll()
  15. {
  16.         roll++;
  17.         if (roll == 180) roll = -180;
  18.         tankLocalMT->setMatrix(setState());
  19.        
  20. }
  21. void tankData::turnRoll_()
  22. {
  23.         roll--;
  24.         if (roll == 180) roll = -180;
  25.         tankLocalMT->setMatrix(setState());
  26. }

  27. //Pitch旋转
  28. void tankData::turnPitch()
  29. {
  30.         if (pitch < 90)
  31.         {
  32.                 pitch++;
  33.                 tankLocalMT->setMatrix(setState());
  34.         }
  35. }
  36. void tankData::turnPitch_()
  37. {
  38.         if (pitch >- 90)
  39.         {
  40.                 pitch--;
  41.                 tankLocalMT->setMatrix(setState());
  42.         }
  43.        
  44. }
  45. //Yaw旋转
  46. void tankData::turnYaw()
  47. {
  48.         yaw++;
  49.         if (yaw == 180) yaw = -180;
  50.         tankLocalMT->setMatrix(setState());
  51. }
  52. void tankData::turnYaw_()
  53. {
  54.         yaw--;
  55.         if (yaw == 180) yaw = -180;
  56.         tankLocalMT->setMatrix(setState());
  57. }
复制代码

该用户从未签到

 楼主| 发表于 2016-12-6 16:16:16 | 显示全部楼层
自顶!!
三次矩阵相乘
只有第一次旋转的矩阵能以物体坐标系旋转,后面两次都是全局坐标系
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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