osg 场景节点添加 删除 隐藏

添加节点
我们通过osg::ref_ptr<osg::Group> root = new osg::Group();申请场景根节点

通过osg::ref_ptr<osg::Node> node = new osg::Node();可以申请多个节点,从而达到在场景中添加多个场景

如:

osg::ref_ptr<osg::Group> root = new osg::Group();

osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");

root->addChild(osgDB::readNodeFile("glider.osg"));

root->addChild(node.get());

 

删除节点

因某种需要,现需要删除某些节点。可以通过removeChild删除个别节点,也可以通过removeChildren删除多个节点,里面的参数有些需要索引值

如:root->removeChild(node1);

如果要删除一个节点,那么该节点下的所有节点都会被删除,如果一个节点被加入到一个组中两次,那么这两次就分别存在,删除一次还有另一次。

在内存映像中,如果一个模型被读取一次,而用了多次,那么所占用的空间是不会改变的。

假设:

osg::ref_ptr<osg::Group>类型结点root,root下加三个孩子osg::ref_ptr<osg::Node>类型结点node1、node2、node3,

程序会按加的顺序记录索引,此时root会记录node1、node2、node3分别为孩子0、1、2,node1、node2、node3也都会记录root为它们的父亲0,

若:node1下还有一些孩子节点,即其为一树, 使用root->removeChild(node1); ///移除root下的node1结点,node1的树关系不会变 ,只是解除root与node1的父子关系

这时root会自动将noee2变为root孩子0,node3变为root孩子1。对于node1变为无父亲节点。只要没有对node1指针清零,这个节点的数据还是存在的,还可以再次利用。

若:定义类型osg::ref_ptf<osg::MatrixTransform>的transform变化结点。

操作 root->replaceChild(node1, transform) ///把node1节点换成transform节点,此时在root下node2为0孩子,node3为1孩子,transform为2孩子。

操作 tansform->addChild(node1); ///node1的父亲0为transform,假设node1还有其他父节点,那么结果就是tansform是其最后一个父亲了。

经常使用这两段代码对场景根下的某个结点进行位置变换,所以,使用孩子取代函数replaceChild并不是对被取代结点和取代结点进行简单的替换,而是每进行一次这样的操作会把取代结点transform作为root根节点的最后一个孩子索引,被取代节点node1也是把取代结点作为最后一个父亲。


隐藏和显示模型的两种方式

1、通过设置osg::Node的Mask实现

隐藏模式,只是将模型隐藏,模型仍在渲染中,损耗并未减少。

可以通过:node->setNodeMask(0X0) 设置隐藏

可以通过:node->setNodeMask(1) 设置显示

2、通过osg::Switch实现

osg::ref_ptr<osg::Switch> sw = new osg::Switch();

sw->setValue(i, true/false);//设置第i个节点的显示或隐藏

 

osgViewer::Viewer viewer;
osg::ref_ptr<osg::Group> root = new osg::Group();
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("robot.osg");
osg::ref_ptr<osg::Switch> sw = new osg::Switch();
sw->addChild(node,false);   //false参数显示关,可通过设置为ture显示为开
root->addChild(sw);
viewer.setSceneData(root);
viewer.realize();
return viewer.run();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值