|
我在一个地形场景中添加了一些建筑物模型的节点,建筑物是采用3DMAX建模,然后导出成ive格式的。
在场景中,我想通过鼠标选择模型,然后对被选中的模型进行平移和旋转变换。模型的选择参照了《OpenSceneGraph三维渲染引擎编程指南》8.3.3对象选取示例的例子。此外自己定义了一个结构变量用来保存被选中的所有模型节点。
以平移为例,平移的量从外部传入,然后定义了一个平移矩阵,将这个平移矩阵应用于所有被选中的模型节点。
部分代码如下:
-
- if ( numSelectedModels != 0) //numSelectedModels是被选中的模型的数量
- {
- osg::Vec3 modelTranslateValue (100.0, 0.0, 0.0);
- osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform;
- osg::Matrix m;
- m.makeTranslate(modelTranslateValue);
- mt->setMatrix(m);
-
- for (int i=0; i <numSelectedModels; i++ )
- {
- //VSelectedModels用来保存被选中的模型节点
- osg::ref_ptr<osg::Node> tempNode = VSelectedModel[i];
-
- mt->addChild(tempNode);
- Root->addChild(mt.get());
- }
-
- }
复制代码
调试中节点信息获取正确,但是执行完毕后,被选中的模型并未被移动,不知道原因何在?并且这里还有一个疑问,因为这个模型节点已经存在于场景中,那么Root->addChild(mt.get()),是不是会导致又向场景中添加一个平移后的节点?
类似对场景中已经存在的模型节点,如何对其进行矩阵变换,并且保证变换后,不会产生多余的节点? 谢谢! |
|