开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 22 天
1 开关节点
开关节点(osg::Switch)继承自osg::SGroup节点。使用开关节点可以渲染或者跳过指定的子节点。Switch 的优势在于能够根据当前渲染的负荷有选择地渲染子场景以实现渲染性能的均衡,或者在游戏的界面和层级之间有选择地切换。
如果想在应用程序中实现允许或者禁止各种开关节点的渲染,需要调用节点更新回调或者节点访问器来控制其渲染状态。
osg::Switch的继承关系图如下所示。
osg::Refereced <-- osg::Object <-- osg::Node <-- osg::Group <-- osg::Switch
osg::Switch的主要常用成员函数如下:
void setNewChildDefaultValue(bool value) //设置新加节点的初始值
bool getNewChildDefaultValue() const //得到新加节点的初始值
void setValue(unsigned int pos,bool value) //设置索引为pos的值
bool getValue(unsigned int pos) const //得到索引为pos的值
void setChildValue(const Node*child,bool value) //设置 child的值
bool getChildValue(const Node* child) const //得到child的值
bool setAllChildrenOff() //设置所有子节点不显示
bool setAllChildrenOn() //设置所有子节点显示
bool setSingleChildOn(unsigned int pos) //设置索引pos单个节点显示
2 开关节点示例
开关节点(osg::Switch)示例代码如下所示。
#include <osgViewer/Viewer>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osg/Switch>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgUtil/Optimizer>
#include "utility.h"
int main()
{
// 创建Viewer对象,场景浏览器
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
// 创建场景组根节点
osg::ref_ptr<osg::Group> root = new osg::Group();
// 创建一个节点,读取牛模型
osg::ref_ptr<osg::Node> node1 = osgDB::readNodeFile(GetCurrentPath() + "\\Data\\cow.osg");
// 创建一个节点,读取滑翔机模型
osg::ref_ptr<osg::Node> node2 = osgDB::readNodeFile(GetCurrentPath() + "\\Data\\glider.osg");
// 创建开关节点,只渲染滑翔机,不渲染牛
osg::ref_ptr<osg::Switch> switchNode = new osg::Switch();
// 添加牛的模型,但不渲染,默认为true
switchNode->addChild(node1.get(), false);
// 添加滑翔机的模型,状态为渲染
switchNode->addChild(node2.get(), true);
root->addChild(switchNode.get());
// 优化场景数据
osgUtil::Optimizer optimizer;
optimizer.optimize(root.get());
// 设置窗口大小
setWindowSize(viewer.get(), 600, 400, "Switch");
// 设置场景数据
viewer->setSceneData(root.get());
// 初始化并创建窗口
viewer->realize();
// 开始渲染
viewer->run();
return 0;
}
效果图
动态效果图