查看: 1465|回复: 5

请问怎样对一个节点同时进行旋转和平移操作

[复制链接]

该用户从未签到

发表于 2010-6-24 13:52:51 | 显示全部楼层 |阅读模式
我是用MatrixTransform节点



  1. osg::ref_ptr<osg::MatrixTransform> mt = dynamic_cast<osg::MatrixTransform*>(root->getChild(0));
  2.   osg::Matrix m;
  3.   m.makeTranslate(10.0f, 0.0f, 0.0f);
  4.   m.makeRotate(1.5f,0.0f,0.0f,1.0f);
  5.   mt->setMatrix(m);

复制代码


这样不行,如果先m.makeTranslate然后m.makeRotate
就只能旋转不能平移

如果把m.makeRotate放在前面就只能平移不能旋转。


我也试了创建两个MatrixTransform节点分别控制平移和旋转,也不行。。。

请问该怎么做啊,谢谢!

该用户从未签到

发表于 2010-6-24 14:40:06 | 显示全部楼层
矩阵联乘

该用户从未签到

发表于 2010-6-24 15:20:52 | 显示全部楼层
楼主你的这段旋转代码没问题,建议旋转角度变为45等大角度,以便观察。再就是为了root->getchild(0)后,不知道接下来你又怎么处理的。建议这样写:node=……
                                        ……
                                          mt->setMatrix(m);
                                                               mt->addchild(node);
                                                               root->addchild(mt);
                                                              ……这样写没问题,我试验过了

该用户从未签到

发表于 2010-6-24 15:30:41 | 显示全部楼层
makeTranslate()或者makeRotate()都是“重置为平移/旋转值”的意思,也就是说,将矩阵当前的内容清空,然后赋予新的内容。因此连续的make*()只有最后一个有效

正确的方法是直接进行矩阵的乘法操作符运算,例如matrix = mat1 * mat2
或者使用postMult*()方法也可以

该用户从未签到

 楼主| 发表于 2010-6-24 16:34:07 | 显示全部楼层
果然,把两个矩阵相乘就可以了

而且必须是 旋转*平移
平移*旋转会使旋转中心改变

还有3L的写法确实比我这样好~~

谢谢大家了

该用户从未签到

发表于 2010-6-24 17:09:33 | 显示全部楼层
注意OpenGL的经典空间变换计算方式:S*R*T,即缩放*旋转*平移,这样可以直观的解释每个计算矩阵的意义
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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