查看: 5134|回复: 6

osg中模型的移动问题

[复制链接]

该用户从未签到

发表于 2008-3-5 13:46:07 | 显示全部楼层 |阅读模式
下面是osg2.0中的一个例子osgviewerMFC,我稍微做了改动,希望读入的模型能够移动,
但是却达不到想要的效果,模型依然居中,该如何解决呢?
void cOSG::InitSceneGraph(void)
{
    // Init the main Root Node/Group
    mRoot  = new osg::Group;

    // Load the Model from the model name
    mModel = osgDB::readNodeFile(m_ModelName);
        osg::ref_ptr<osg::MatrixTransform> mt=new osg::MatrixTransform;
        osg::Matrix m;
        m.makeTranslate(20.f,0.f,0.f);    //平移20
        mt->setMatrix(m);
        mt->addChild(mModel.get());
    // Optimize the model
    osgUtil::Optimizer optimizer;
    optimizer.optimize(mt.get());
    optimizer.reset();

    // Add the model to the scene
    mRoot->addChild(mt.get());
}

该用户从未签到

发表于 2008-3-5 14:17:18 | 显示全部楼层
http://www.osgchina.org/projects ... s/BasicGeometry.php
这个网址上有个位置变换的例子,你参考一下

该用户从未签到

 楼主| 发表于 2008-3-5 17:45:59 | 显示全部楼层
用positionattitudetransform也不行,没反应

该用户从未签到

发表于 2008-3-5 18:42:19 | 显示全部楼层
原帖由 lawn 于 2008-3-5 13:46 发表
下面是osg2.0中的一个例子osgviewerMFC,我稍微做了改动,希望读入的模型能够移动,
但是却达不到想要的效果,模型依然居中,该如何解决呢?
void cOSG::InitSceneGraph(void)
{
    // Init the main Root Node ...


您是不是仅仅在场景中加载了一个模型,并且使用了TrackballManipulator?(直接使用viewer.run()的话,缺省漫游器就是TrackballManipulator)
那样的话,TrackballManipulator会自动将您的视角对准模型的正中,无论您如何平移,它都锲而不舍~~
验证的方法是再生成一个模型并将其放在场景的原点,或者尝试将模型进行旋转,以验证MatrixTranform的正确性,从您的代码看来应该是可用的
或者您可以自行编写场景漫游器……

该用户从未签到

 楼主| 发表于 2008-3-5 20:42:00 | 显示全部楼层
原帖由 array 于 2008-3-5 18:42 发表


您是不是仅仅在场景中加载了一个模型,并且使用了TrackballManipulator?(直接使用viewer.run()的话,缺省漫游器就是TrackballManipulator)
那样的话,TrackballManipulator会自动将您的视角对准模型的正中, ...

谢谢,明白了
还有一个问题是 mRoot  = new osg::Group;
             mModel = osgDB::readNodeFile(m_ModelName);
            mt=new osg::MatrixTransform;
            m.makeRotate(angle,axis);
            mt->setMatrix(m);
            mt->addChild(mModel.get());
            mRoot->addChild(mt.get());
旋转时我用了angle,axis两个参数,我在别的页面更改这两个参数,但是模型并没有旋转,Viewer-〉frame不能检测到这两个参数的变化并重新渲染吗?

该用户从未签到

发表于 2008-3-5 20:53:20 | 显示全部楼层
原帖由 lawn 于 2008-3-5 20:42 发表

谢谢,明白了
还有一个问题是 mRoot  = new osg::Group;
             mModel = osgDB::readNodeFile(m_ModelName);
            mt=new osg::MatrixTransform;
            m.makeRotate(angle,axis);
            mt->setMatrix( ...


这里当然是不可以的,传递给setMatrix的不是指针。而且,就算有些时候我们可以通过修改指针参数的方法实现动画效果(例如,实时修改多边形的顶点Vec3Array),也不可以直接这样实现,与用户线程彼此独立的渲染线程很可能会因此出现崩溃。
如果需要实现旋转的动画效果,请定义并使用场景回调:setUpdateCallback,可以参考《OpenSceneGraph快速入门指导》的第三章内容。

该用户从未签到

发表于 2008-3-6 14:53:33 | 显示全部楼层
原帖由 lawn 于 2008-3-5 20:42 发表

谢谢,明白了
还有一个问题是 mRoot  = new osg::Group;
             mModel = osgDB::readNodeFile(m_ModelName);
            mt=new osg::MatrixTransform;
            m.makeRotate(angle,axis);
            mt->setMatrix( ...


那个是检测不到的,除了用CALLBACK以外,还可以自己继承osgGA::GUIEventHandler然后重写Handler来对你的输入进行监听,通过这样来实时改变你的旋转平移等参数就可以了。
osg自带了很多摄像机,写得都很不错,自己可以去osgGA工程里面看看,改写源码或者仿照写一个都可以用。
TrackballManipulator适合用来改写第三人称视角,DriveManipulator适合用来改写第一人称视角。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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