2、OpenSceneGraph中添加节点、删除节点、隐藏节点以及添加开关的用法

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");


3、将glider节点作为avatar的子节点,那么需要通过节点的asGroup()来添加,如下代码所示:

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();
}










  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值