查看: 1153|回复: 9

为什两个矩阵变化节点都旋转,结果位置一样了

[复制链接]

该用户从未签到

发表于 2012-7-25 11:55:39 | 显示全部楼层 |阅读模式
  1. #include <osgViewer/Viewer>
  2. #include <osg/Node>
  3. #include <osg/MatrixTransform>

  4. #include <osgDB/ReadFile>

  5. int _tmain(int argc, _TCHAR* argv[])
  6. {
  7.         osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
  8.         osg::ref_ptr<osg::Group> root = new osg::Group;
  9.         osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");
  10.        
  11.         //创建矩阵变化节点
  12.         osg::ref_ptr<osg::MatrixTransform> mt1 = new osg::MatrixTransform;
  13.         osg::Matrix m;
  14.         //在X方向平移10个单位
  15.         m.makeTranslate(osg::Vec3(10,0,0));
  16.         //绕X轴旋转45度
  17.         m.makeRotate(45,1,0,0);
  18.         //设置矩阵
  19.         mt1->setMatrix(m);
  20.         mt1->addChild(node.get());


  21.         //创建矩阵变化节点
  22.         osg::ref_ptr<osg::MatrixTransform> mt2 = new osg::MatrixTransform;
  23.         osg::Matrix t;
  24.         //在X方向平移10个单位
  25.         t.makeTranslate(osg::Vec3(-10,0,0));
  26.         //绕X轴旋转45度
  27.         t.makeRotate(45,1,0,0);
  28.         //设置矩阵
  29.         mt2->setMatrix(t);
  30.         mt2->addChild(node.get());


  31.         root->addChild(mt1.get());
  32.         root->addChild(mt2.get());

  33.         viewer->setSceneData(root.get());
  34.         viewer->run();
  35.         return 0;
  36. }
复制代码
单个节点设置旋转,位置没问题!这是肿么回事》????

该用户从未签到

发表于 2012-7-25 15:14:43 | 显示全部楼层
matrix 不能那么使用。必须用* 或者 preMult 才能叠加,你使用make是不能叠加的

该用户从未签到

 楼主| 发表于 2012-7-25 15:29:02 | 显示全部楼层
liuzhiyu123 发表于 2012-7-25 15:14
matrix 不能那么使用。必须用* 或者 preMult 才能叠加,你使用make是不能叠加的

分为用两个不同的矩阵给平移节点做旋转不行吗??可以平移的时候没问题啊!
  • TA的每日心情
    开心
    2019-11-11 10:36
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2012-7-25 16:17:06 | 显示全部楼层
    楼上的楼上是正解,看看下面的代码就明白了, make*的,都是不叠加的。

    1. void Matrix_implementation::makeScale( value_type x, value_type y, value_type z )
    2. {
    3. SET_ROW(0,    x, 0, 0, 0 )
    4. SET_ROW(1,    0, y, 0, 0 )
    5. SET_ROW(2,    0, 0, z, 0 )
    6. SET_ROW(3,    0, 0, 0, 1 )
    7. }
    复制代码

    该用户从未签到

     楼主| 发表于 2012-7-25 16:26:02 | 显示全部楼层
    FreeSouth 发表于 2012-7-25 16:17
    楼上的楼上是正解,看看下面的代码就明白了, make*的,都是不叠加的。

    还是不太明白分别对两个节点做平移旋转,跟*有关系吗?

    该用户从未签到

     楼主| 发表于 2012-7-25 16:32:32 | 显示全部楼层
    木子匕 发表于 2012-7-25 16:26
    还是不太明白分别对两个节点做平移旋转,跟*有关系吗?

    貌似有点明白了!是不是做平移和旋转时均对矩阵相应的点,做了变换,也就是说后面做旋转的时候把前面的覆盖了,位置都为(0,0,0)了吗

    该用户从未签到

     楼主| 发表于 2012-7-25 16:35:53 | 显示全部楼层
    1. //在X方向平移10个单位
    2.         a.makeTranslate(osg::Vec3(10,0,0));
    3.         //绕X轴旋转45度
    4.         b.makeRotate(45,1,0,0);
    5.         //设置矩阵
    6.         mt1->setMatrix(a*b);
    复制代码
    这样子就没问题了。

    该用户从未签到

    发表于 2012-7-25 20:37:44 | 显示全部楼层
    木子匕 发表于 2012-7-25 16:35
    这样子就没问题了。

    矩阵进行maketranslate或makescale或makerotate都是重新构造这个转换矩阵,freesouth把底层代码都给你贴出来了。。。

    该用户从未签到

     楼主| 发表于 2012-7-26 08:54:37 | 显示全部楼层
    buaahc 发表于 2012-7-25 20:37
    矩阵进行maketranslate或makescale或makerotate都是重新构造这个转换矩阵,freesouth把底层代码都给你贴出 ...

    明白了!嘿嘿我一直以为是2个节点相互之间影响了呢!原来如此

    该用户从未签到

    发表于 2012-8-2 08:16:14 | 显示全部楼层
    不懂的地方  多看看源码
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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

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

    联系我们

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