查看: 1174|回复: 1

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

[复制链接]

该用户从未签到

发表于 2016-11-17 10:46:00 | 显示全部楼层 |阅读模式
想实现的效果:坦克绕物体坐标系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. }
复制代码
  • TA的每日心情
    奋斗
    2019-11-7 20:26
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2020-6-17 20:52:30 | 显示全部楼层
    楼主你好,请问问题解决了吗?我也遇到了这个问题,setMatrix(osg::Matrix::rotate(d_Rotation[0], osg::X_AXIS, d_Rotation[2], osg::Z_AXIS, 0, osg::Y_AXIS)*osg::Matrix::translate(d_Position));只有第一个参数的轴是是物体坐标系的轴,后面两个轴既不是物体坐标系,也不是世界坐标系,怀疑可能受到第一个旋转的影响,把轴也转了,不知道怎么修正
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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

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

    联系我们

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