1、添加节点之前要先声明一个组也就是根节点,就像是节点树一样必须要有一个根,然后在这个根下添加子节点,而子节点下还可以添加子节点,可通过osg::Group来创建一个根节点,如下代码所示:
osg::Group *root=new osg::Group();
2、那么在这个根上添加节点,可使用osg::Node来声明并创建一个节点,并未该节点添加模型,如下代码所示:
osg::Node *avatar=osgDB::readNodeFile("avatar.osg");
osg::Node *glider=osgDB::readNodeFile("glider.osg");
avatar->asGroup()->addChild(glider);//在以avatar为组,添加子模型(注意:子模型的大小要小于组模型大小)
4、将avatar节点添加到根节点上去,如下代码所示:
root->addChild(avatar);
5、在根节点下直接添加一个节点,如下代码所示:
root->addChild(osgDB::readNodeFile("osgcool.osgt"));
所有代码如下:
#include "stdafx.h"
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Node>
int _tmain(int argc, _TCHAR* argv[])
{
osgViewer::Viewer viewer;
osg::Group *root=new osg::Group();
osg::Switch *sw=new osg::Switch();
osg::Node *avatar=osgDB::readNodeFile("avatar.osg");
osg::Node *glider=osgDB::readNodeFile("glider.osg");
avatar->asGroup()->addChild(glider);//在以avatar为组,添加子模型(注意:子模型的大小要小于组模型大小)
root->addChild(avatar);
root->addChild(osgDB::readNodeFile("osgcool.osgt"));
viewer.setSceneData(root);
viewer.realize();
return viewer.run();
}
以下是运行效果:
6、删除节点,比如将上图的小飞机删除掉可使用以下代码,以下代码提供了多种删除方法,其中有两种方法是无法删除的。
//root->removeChild(avatar);//以索引删除一个子节点
//root->removeChild(1);//删除索引为1的节点,此函数不能删除0的节点
//root->removeChildren(0,1);//删除第0个节点,删除的个数为1个
avatar->asGroup()->removeChild(glider);//在组avatar中删除一个子节点,如果使用索引的方法是无法删除的
//avatar->asGroup()->removeChild(1);//无法删除
//avatar->asGroup()->removeChildren(1,1);//无法删除
运行效果如下,可根据上图进行比较,在脚的位置少了个小飞机。
7、隐藏节点,可通过节点对象中的setNodeMask(0)函数对该节点进行隐藏,0表示隐藏,1表示显示,隐藏起来时该节点是还会存在于内存中的,代码如下:
avatar->setNodeMask(0);//隐藏某个模型,0表示隐藏,1表示显示
以上是将机器人隐藏掉,如下效果所示:
以下是所有代码:
#include "stdafx.h"
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Node>
int _tmain(int argc, _TCHAR* argv[])
{
osgViewer::Viewer viewer;
osg::Group *root=new osg::Group();
osg::Switch *sw=new osg::Switch();
osg::Node *avatar=osgDB::readNodeFile("avatar.osg");
osg::Node *glider=osgDB::readNodeFile("glider.osg");
avatar->asGroup()->addChild(glider);//在以avatar为组,添加子模型(注意:子模型的大小要小于组模型大小)
root->addChild(avatar);
root->addChild(osgDB::readNodeFile("osgcool.osgt"));
//root->removeChild(avatar);//以索引删除一个子节点
//root->removeChild(1);//删除索引为1的节点,此函数不能删除0的节点
//root->removeChildren(0,1);//删除第0个节点,删除的个数为1个
avatar->asGroup()->removeChild(glider);//在组avatar中删除一个子节点,如果使用索引的方法是无法删除的
//avatar->asGroup()->removeChild(1);//无法删除
//avatar->asGroup()->removeChildren(1,1);//无法删除
avatar->setNodeMask(0);//隐藏某个模型,0表示隐藏,1表示显示
viewer.setSceneData(root);
viewer.realize();
return viewer.run();
}
8、为节点添加开关功能,就是将节点通过开关控制是否显示节点,可通过开关来控制节点的显示(关:节点不在内存中,但节点并未删除,开:节点不需要重新添加,只需要通过开关直接显示),那么首先声明 一个开关变量,如下代码所示:
osg::Switch *sw=new osg::Switch();
9、将其中的两个节点添加到开关中去,然后在将此开关添加到根节点下,如下代码所示:
sw->addChild(avatar,false);//第二个参数为false表示将avatar关掉不显示,如果是true就是打开显示
root->addChild(sw);
运行效果如下:
所有代码如下:
#include "stdafx.h"
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Node>
int _tmain(int argc, _TCHAR* argv[])
{
osgViewer::Viewer viewer;
osg::Group *root=new osg::Group();
osg::Switch *sw=new osg::Switch();
osg::Node *avatar=osgDB::readNodeFile("avatar.osg");
osg::Node *glider=osgDB::readNodeFile("glider.osg");
avatar->asGroup()->addChild(glider);//在以avatar为组,添加子模型(注意:子模型的大小要小于组模型大小)
sw->addChild(avatar,false);//第二个参数为false表示将avatar关掉不显示,如果是true就是打开显示
root->addChild(sw);
root->addChild(osgDB::readNodeFile("osgcool.osgt"));
viewer.setSceneData(root);
viewer.realize();
return viewer.run();
}
10、将关掉的节点显示出来,可通过开关的setValue()函数显示出来或者关闭,如下代码所示:
sw->setValue(0,true);//第一个参数表示节点的索引,0表示添加的第一个节点,如果第二个参数是false则表示关闭节点,如果是true则是显示
如下运行效果:
以下是所有代码:
#include "stdafx.h"
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Node>
int _tmain(int argc, _TCHAR* argv[])
{
osgViewer::Viewer viewer;
osg::Group *root=new osg::Group();
osg::Switch *sw=new osg::Switch();
osg::Node *avatar=osgDB::readNodeFile("avatar.osg");
osg::Node *glider=osgDB::readNodeFile("glider.osg");
avatar->asGroup()->addChild(glider);//在以avatar为组,添加子模型(注意:子模型的大小要小于组模型大小)
sw->addChild(avatar,false);//第二个参数为false表示将avatar关掉不显示,如果是true就是打开显示
root->addChild(sw);
root->addChild(osgDB::readNodeFile("osgcool.osgt"));
sw->setValue(0,true);//第一个参数表示节点的索引,0表示添加的第一个节点,如果第二个参数是false则表示关闭节点,如果是true则是显示
viewer.setSceneData(root);
viewer.realize();
return viewer.run();
}
11、超级指针osg::ref_ptr的使用方法,使用此方法可以防止在删除节点时是否释放该节点的内存,比如:当有一个节点多次添加时,那么超级指针就会自动加1,在释放时就会自动减1,当减到0时,就会自动释放该节点所占的内存,如将以上的所有指针修改为如下代码所示:
#include "stdafx.h"
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osg/Node>
int _tmain(int argc, _TCHAR* argv[])
{
osgViewer::Viewer viewer;
//osg::Group *root=new osg::Group();
osg::ref_ptr<osg::Group> root=new osg::Group();
//osg::Switch *sw=new osg::Switch();
osg::ref_ptr<osg::Switch> sw=new osg::Switch();
//osg::Node *avatar=osgDB::readNodeFile("avatar.osg");
osg::ref_ptr<osg::Node> avatar=osgDB::readNodeFile("avatar.osg");
//osg::Node *glider=osgDB::readNodeFile("glider.osg");
osg::ref_ptr<osg::Node> glider=osgDB::readNodeFile("glider.osg");
avatar->asGroup()->addChild(glider);//在以avatar为组,添加子模型(注意:子模型的大小要小于组模型大小)
sw->addChild(avatar,false);//第二个参数为false表示将avatar关掉不显示,如果是true就是打开显示
root->addChild(avatar);
root->addChild(osgDB::readNodeFile("osgcool.osgt"));
sw->setValue(0,true);//第一个参数表示节点的索引,0表示添加的第一个节点,如果第二个参数是false则表示关闭节点,如果是true则是显示
viewer.setSceneData(root);
viewer.realize();
return viewer.run();
}