查看: 1345|回复: 7

为什么两头牛重合了

[复制链接]

该用户从未签到

发表于 2011-6-20 09:07:32 | 显示全部楼层 |阅读模式
#include <osgViewer/Viewer>
#include <osg/Node>
#include <osg/Group>
#include <osg/Geode>
#include <osg/MatrixTransform>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgUtil/Optimizer>
/************************************************************************/
/* 当mt1设置为45度,沿X轴正向移动100个距离
/* 当mt2设置为90度时,沿X轴负向移动100个距离  

/* 两头牛重合????
/************************************************************************/
int main()
{
        osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
        osg::ref_ptr<osg::Group> root = new osg::Group;

        osg::ref_ptr<osg::Node> cowNode = osgDB::readNodeFile("cow.osg");

        //矩阵变换节点1
        osg::ref_ptr<osg::MatrixTransform> mt1 = new osg::MatrixTransform;
        //创建一个矩阵
        osg::Matrix m;
        //沿X轴正向移动10个距离
        m.makeTranslate(osg::Vec3(100.0f,0.0f,0.0f));
        //绕X轴旋转45度
        m.makeRotate(45.0f,1.0f,0.0f,0.0f);
        //设置矩阵
        mt1->setMatrix(m);
        mt1->addChild(cowNode.get());


        //矩阵变换节点1
        osg::ref_ptr<osg::MatrixTransform> mt2 = new osg::MatrixTransform;
        //创建一个矩阵
        osg::Matrix t;
        //沿X轴负向移动10个距离
        t.makeTranslate(osg::Vec3(-100.0f,0.0f,0.0f));
        //绕X轴旋转45度
        t.makeRotate(90.0f,1.0f,0.0f,0.0f);
        //设置矩阵
        mt2->setMatrix(t);
        mt2->addChild(cowNode.get());

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

        viewer->setSceneData(root.get());
        viewer->realize();
        viewer->run();

        return 0;
}

该用户从未签到

发表于 2011-6-20 09:29:19 | 显示全部楼层
//沿X轴负向移动10个距离
        t.makeTranslate(osg::Vec3(-100.0f,0.0f,0.0f));
        //绕X轴旋转45度
        t.makeRotate(90.0f,1.0f,0.0f,0.0f);

得到得是旋转矩阵

该用户从未签到

 楼主| 发表于 2011-6-20 09:36:37 | 显示全部楼层
本帖最后由 david850911 于 2011-6-20 09:44 编辑

t.makeTranslate(osg::Vec3(-100.0f,0.0f,0.0f));不是沿X负轴移动100单位么???

//t.makeRotate(90.0f,1.0f,0.0f,0.0f);
为什么注释了上面这一行就是正确的了?不是按照先平移,再旋转的顺序执行的吗?

该用户从未签到

 楼主| 发表于 2011-6-20 09:52:59 | 显示全部楼层
把两个矩阵的makeRotate方法都注释,运行结果如下: 2.jpg


注释下面那个矩阵的makeRotate后运行结果如下: 3.jpg


我想问的是为什么两头牛之间的距离会有这么明显的差别???

该用户从未签到

发表于 2011-6-20 10:24:24 | 显示全部楼层
回复 3# david850911

怎么会是先平移再旋转呢?如果没有特殊的操作,平移应该最后一步操作

该用户从未签到

 楼主| 发表于 2011-6-20 10:43:12 | 显示全部楼层
谢谢“朽木”

还有一个问题将矩阵m和t的
       //沿X轴正向移动10个距离
        m.makeTranslate(osg::Vec3(10.0f,0.0f,0.0f));
        //绕X轴旋转45度
        m.makeRotate(45.0f,1.0f,0.0f,0.0f);

      //沿X轴正负向移动10个距离
        t.makeTranslate(osg::Vec3(-10.0f,0.0f,0.0f));
        //绕X轴旋转45度
        t.makeRotate(90.0f,1.0f,0.0f,0.0f);

运行结果会是两头牛之间没有距离了???运行如图: 4.jpg

该用户从未签到

发表于 2011-6-20 12:30:39 | 显示全部楼层
        //沿X轴正向移动10个距离
        m.makeTranslate(osg::Vec3(10.0f,0.0f,0.0f));
        //绕X轴旋转45度
        m.makeRotate(45.0f,1.0f,0.0f,0.0f);


这个问题也老生常谈了无数次了……make*()是重设矩阵的意思,因此您后设置的旋转值会覆盖之前的平移值!请使用postMult*(),或者直接连乘即可

该用户从未签到

 楼主| 发表于 2011-6-20 14:02:02 | 显示全部楼层
谢谢 array
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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