OSG中添加多个物体, OSG::Group的使用

来源:互联网 发布:游族网络待遇怎么样 编辑:程序博客网 时间:2024/05/15 05:51

之前的文章可以针对单个物体,进行平移,旋转,缩放。


现在我想在场景中放置两头牛。在OSG中,放置多个物体,可以将这个多个物体放置到一个Group中,然后再将场景设置成这个Group,就可以了。


#include<osgViewer/Viewer>#include<osgDB/ReadFile>int main(int argc, char **argv){osgViewer::Viewer viewer;osg::Node *cow1 = osgDB::readNodeFile("cow.osg");osg::Node *cow2 = osgDB::readNodeFile("cow.osg");osg::Group *root = new osg::Group;root->addChild(cow1);root->addChild(cow2);//把牛放到场景中viewer.setSceneData(root);return viewer.run();}


正常使用是这样的,由于Group继承自Node,所以可以把 Group* 作为参数,传递给viewer.setScenData。

但是程序运行结果只显示了一头牛。猜测是两头牛重叠了,把其中的一头牛挪一下位置,试试。挪位置,用MatrixTransform。


#include<osgViewer/Viewer>#include<osgDB/ReadFile>#include <osg/MatrixTransform>int main(int argc, char **argv){osgViewer::Viewer viewer;osg::Node *cow1 = osgDB::readNodeFile("cow.osg");osg::Node *cow2 = osgDB::readNodeFile("cow.osg");osg::MatrixTransform* translateMT = new osg::MatrixTransform;translateMT->setMatrix(osg::Matrix::translate(10, 0, 0));translateMT->addChild(cow2);osg::Group *root = new osg::Group;root->addChild(cow1);root->addChild(translateMT);//把牛放到场景中viewer.setSceneData(root);return viewer.run();}


上面的程序比之前第一个程序多了3行代码,创建一个MatrixTransform,然后把cow2放在了MatrixTransform下面。

修改了一行代码, root->addChild(cow2) 修改成了 root->addChild(translateMT)。

这个程序的运行结果如下。

成功的显示了两头牛。


这都要归功于osg::Group。现在来看一下osg::Group这个类。osg::Group这个类其实就是一个Node的列表,里面可以保存多个Node,然后它本身继承自Node,可以当成一个Node来使用。下面是它的类图,其中NodeList的类型为  typedef std::vector< ref_ptr<Node> > NodeList; 这就是一个std::vector,其中vector里面的元素为ref_ptr<Node>,相当于Node*,只是多了个引用计数。


简单的,我们可以把Group看成是Node的集合,但是又可以把Group当成Node来使用。


其实这里使用了设计模式中的组合(COMPOSITE)模式。组合模式有两个要点,一是子类继承自父类, 二是子类有父类的指针列表。

这样的话,子类可以把多个父类 组合在一起,而且子类又可以当成父类来使用。


再看上面的代码,我觉得cow1和cow2都是读取自"cow.osg",可不可以只读一遍呢?其实是可以的,下面的代码也能正常运行。

#include<osgViewer/Viewer>#include<osgDB/ReadFile>#include <osg/MatrixTransform>int main(int argc, char **argv){osgViewer::Viewer viewer;osg::Node *cow = osgDB::readNodeFile("cow.osg");osg::MatrixTransform* translateMT = new osg::MatrixTransform;translateMT->setMatrix(osg::Matrix::translate(10, 0, 0));translateMT->addChild(cow);osg::Group *root = new osg::Group;root->addChild(cow);root->addChild(translateMT);//把牛放到场景中viewer.setSceneData(root);return viewer.run();}

同样显示了两头牛。所以,OSG中要添加多个物体,就使用osg::Group就可以了,每个物体都添加到Group中,当然需要对一些物体进行平移,以免物体重叠到一起了。

0 0
原创粉丝点击