查看: 2668|回复: 5

关于MatrixTransform的问题

[复制链接]

该用户从未签到

发表于 2009-5-21 09:09:57 | 显示全部楼层 |阅读模式
这是《OSG编程入门指南》中关于MatrixTransform例子的代码节选:
  1.        
  2.                     osg::Node* node = new osg::Node();     
  3.                     node = osgDB::readNodeFile("cow.osg");  
  4.                      osg::MatrixTransform* mt1 = new osg::MatrixTransform() ;
  5.         osg::Matrix m;
  6.         //在X方向平移10个单位
  7.         m.makeTranslate(osg::Vec3(10.0f,0.0f,0.0f));//语句一         
  8.         m.makeRotate(45.0f,1.0f,0.0f,0.0f);//语句二
  9.         mt1->setMatrix(m);
  10.         mt1->addChild(node);

  11.         //创建矩阵变换节点mt2
  12.         osg::MatrixTransform* mt2 = new osg::MatrixTransform();
  13.         osg::Matrix t ;
  14.         t.makeTranslate(osg::Vec3(-10.0f,0.0f,0.0f));
  15.         mt2->setMatrix(t);
  16.         mt2->addChild(node);
复制代码
问题:在语句一处,我把10.0f改成任意数值,结果都是只执行了mt2 的平移-10。似乎语句一不执行。如果跟后面的旋转45度的语句二对调,则只执行平移,而就不执行旋转了。怎么会这样,如何解决。谢谢。

该用户从未签到

发表于 2009-5-21 09:16:43 | 显示全部楼层
我不清楚这段代码的具体实现结果,不过要注意MatrixTransform的矩阵设置方法,和OpenGL中的空间变换手段类似,通常都是采取SRT矩阵的形式,即,矩阵按照S(放缩) * R(旋转) * T(平移)的顺序连乘。例如:
  1. mt->setMatrix( Matrix::scale(...) * Matrix::rotate(...) * Matrix::translate(...) );
复制代码

该用户从未签到

 楼主| 发表于 2009-5-21 10:37:25 | 显示全部楼层
谢谢阿Ray,按照你的写法搞定。

该用户从未签到

发表于 2009-5-21 16:36:03 | 显示全部楼层
m.makeTranslate(osg::Vec3(10.0f,0.0f,0.0f));//语句一        
m.makeRotate(45.0f,1.0f,0.0f,0.0f);//语句二
相当于 m = osg::Matrix::rotate(45.0f,1.0f,0.0f,0.0f);
在执行语句二时,矩阵m的当前值不会被累积

该用户从未签到

发表于 2011-2-19 10:46:34 | 显示全部楼层
每次调用时,矩阵都会被变换为单位矩阵,所以表示的只有最后一个效果

该用户从未签到

发表于 2011-2-19 11:02:52 | 显示全部楼层
哈哈,太好了,我也有这样的疑问,楼主帮我问了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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