查看: 1199|回复: 4

多个旋转的合成

[复制链接]

该用户从未签到

发表于 2011-7-11 08:53:52 | 显示全部楼层 |阅读模式
本帖最后由 wangq 于 2011-7-11 08:59 编辑

程序运行效果

程序运行效果 想实现这样一个效果:模型原始状态为A,在A的基础上绕X轴旋转得到状态B,在A的基础上绕Z轴旋转得到状态C,最后想得到的状态效果DBC的合成。

现在用的是osg:o
sitionAttitudeTransform
这个类

osg::ref_ptr<osg::PositionAttitudeTransform> matrixst = new osg::PositionAttitudeTransform;

matrixst->setAttitude(osg:uat(osg::PI_2, osg::X_AXIS));
// (1)

matrixst->setAttitude(osg::Quat(osg::PI_2, osg::Z_AXIS));
//
2

但是看程序运行效果,好像只有 (2) 起作用了,(2)将(1)屏蔽了。

换一种写法:

osg::ref_ptr<osg::PositionAttitudeTransform> matrixnd = new osg::PositionAttitudeTransform;

matrixnd->setAttitude(osg::Quat(osg::PI_2, osg::X_AXIS) * osg::Q

  1. osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
  2. osg::ref_ptr<osg::Group> root = new osg::Group;
  3. osg::ref_ptr<osg::PositionAttitudeTransform> matrixst = new osg::PositionAttitudeTransform;
  4. osg::ref_ptr<osg::PositionAttitudeTransform> matrixnd = new osg::PositionAttitudeTransform;
  5. osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("dan.ive");
  6. //////////////////////////////////////////////////////////////////////////////////////////////////

  7. matrixst->addChild(node);
  8. matrixst->setPosition(osg::Vec3(20., 0., 0.));
  9. matrixst->setAttitude(osg::Quat(osg::PI_2, osg::X_AXIS));
  10. matrixst->setAttitude(osg::Quat(osg::PI_2, osg::Z_AXIS));

  11. //////////////////////////////////////////////////////////////////////////////////////////////////

  12. matrixnd->addChild(node);
  13. matrixnd->setPosition(osg::Vec3(40., 0.,0. ));
  14. matrixnd->setAttitude(osg::Quat(osg::PI_2, osg::X_AXIS) * osg::Quat(osg::PI_2, osg::Z_AXIS));
  15. ///////////////////////////////////////////////////////////////////////////////////////////////////

  16. root->addChild(node);
  17. root->addChild(matrixst);
  18. root->addChild(matrixnd);
  19. viewer->setSceneData(root);
  20. viewer->run();
复制代码
uat(osg::PI_2, osg::Z_AXIS));

这种效果好像是这样的:模型绕X轴得到状态B,然后在状态B的基础上绕Z轴旋转得到状态C,也不是我希望达到的。

上面两种效果都达不到我想要的,请问OSG如何才能实现旋转的合成呢?请大侠用代码解释

该用户从未签到

发表于 2011-7-11 09:08:22 | 显示全部楼层
不清楚你到底要实现什么效果

该用户从未签到

 楼主| 发表于 2011-7-11 09:14:47 | 显示全部楼层
可能是帖子的排版不是很清楚,想实现这样的效果:模型原始状态为A,在状态A的基础上绕X轴旋转得到状态B;然后在A的基础上绕Z轴旋转得到状态C,最后想得到的状态效果D为B与C的合成。不知道这样表述说清楚了吗?

该用户从未签到

 楼主| 发表于 2011-7-11 09:21:25 | 显示全部楼层
回复 2# FlySky


    可能是帖子的排版不是很清楚,想实现这样的效果:模型原始状态为A,在状态A的基础上绕X轴旋转得到状态B;然后在A的基础上绕Z轴旋转得到状态C,最后想得到的状态效果D为B与C的合成。不知道这样表述说清楚了吗?
OpenGL里面好像可以实现,但是现在OSG中的多次旋转的话好像每一次都是在前一次的状态基础上进行旋转而不是在最原始的状态基础上进行,是要加哪些命令呢?

该用户从未签到

发表于 2011-7-11 12:44:52 | 显示全部楼层
matrixst->setAttitude(osg:uat(osg:I_2, osg::X_AXIS));
matrixst->setAttitude(osg:uat(osg:I_2, osg::Z_AXIS));
这样显然会屏蔽掉,您完全应当用MatrixTransform来实现,传入一个级联的矩阵就全都解决了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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