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();}
但是程序运行结果只显示了一头牛。猜测是两头牛重叠了,把其中的一头牛挪一下位置,试试。挪位置,用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();}
修改了一行代码, 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
- OSG中添加多个物体, OSG::Group的使用
- osg::Sphere,osg::Texture2D,osg::StateSet,osg::TexEnv的使用
- OSG中圆锥的使用
- OSG中LOD的使用
- osg demo5 添加多个模型
- OSG学习:使用OSG中预定义的几何体
- osg复制多个相同物体修改材质属性问题
- osg 添加多光源
- OSG中使用HUD
- [OSG]OSG中字体的排版
- OSG在VS2010中使用的问题
- osg中智能指针的使用
- OSG中文字的使用,osgText
- 6.osg中光照的使用
- OSG中pick函数的使用
- 4、osg::Node,osg::Group,osg::Switch,osg::MatrixTransform类
- OSG QWidgetImage 的使用
- osg的灯光使用
- OGG-01738 BOUNDED RECOVERY 报错
- 移动开发学习第一发:基于百度地图开发地图显示时遇到的问题总结
- 爸爸
- 烦得很规范家居服她与他有一天一梯一户
- Java中String,StringBuilder和StringBuffer的区别
- OSG中添加多个物体, OSG::Group的使用
- Java服务器热部署的实现原理
- 我对互联网体系结构的认识 -------个人学习历程回顾
- ERROR OGG-01168 which has no unique ke y defined
- Position Independent Code (PIC) in shared libraries
- ExecutorService的execute和submit方法
- Java在Web开发语言上败给了PHP
- Java多线程-工具篇-BlockingQueue
- vs2013 图片背景·全透明背景图