查看: 1249|回复: 1

请教:对场景中已有节点的变换问题

[复制链接]

该用户从未签到

发表于 2010-5-21 11:27:20 | 显示全部楼层 |阅读模式
我在一个地形场景中添加了一些建筑物模型的节点,建筑物是采用3DMAX建模,然后导出成ive格式的。

在场景中,我想通过鼠标选择模型,然后对被选中的模型进行平移和旋转变换。模型的选择参照了《OpenSceneGraph三维渲染引擎编程指南》8.3.3对象选取示例的例子。此外自己定义了一个结构变量用来保存被选中的所有模型节点。

以平移为例,平移的量从外部传入,然后定义了一个平移矩阵,将这个平移矩阵应用于所有被选中的模型节点。

部分代码如下:

  1. if ( numSelectedModels != 0) //numSelectedModels是被选中的模型的数量
  2. {
  3.        osg::Vec3 modelTranslateValue (100.0, 0.0, 0.0);
  4.        osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform;
  5.        osg::Matrix m;
  6.        m.makeTranslate(modelTranslateValue);
  7.        mt->setMatrix(m);

  8.        for (int i=0; i <numSelectedModels; i++ )
  9.        {
  10.           //VSelectedModels用来保存被选中的模型节点
  11.            osg::ref_ptr<osg::Node> tempNode = VSelectedModel[i];   
  12.          
  13.            mt->addChild(tempNode);
  14.            Root->addChild(mt.get());
  15.        }

  16. }
复制代码


调试中节点信息获取正确,但是执行完毕后,被选中的模型并未被移动,不知道原因何在?并且这里还有一个疑问,因为这个模型节点已经存在于场景中,那么Root->addChild(mt.get()),是不是会导致又向场景中添加一个平移后的节点?

类似对场景中已经存在的模型节点,如何对其进行矩阵变换,并且保证变换后,不会产生多余的节点? 谢谢!

该用户从未签到

发表于 2010-5-21 12:22:59 | 显示全部楼层
我不太理解的是,难道每次选中模型都要新建MatrixTransform节点吗?这样无疑是不可取的做法

如果模型节点本身就是MatrixTransform的话,那么可以直接VSelectedModel[i]->setMatrix(),这样是最简单的方法;并且osgMaxExp等工具可以选择直接将模型导出为MatrixTransform
否则的话,建议给载入场景的模型立即设置一个MatrixTransform父节点,并且所有对模型的操作都针对这个父节点来进行就可以了。这样都不会出现产生那些多余节点的情况
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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