osgSim.MultiSwitch
是OpenSceneGraph中的一个节点类型,它会根据所设定的条件,自动将其子节点之一作为当前节点进行渲染。它可以用于控制场景中多个节点的显示。
osg::ref_ptr<osgSim::MultiSwitch> multiSwitch = new osgSim::MultiSwitch();
添加需要切换的子节点
// 添加子节点
multiSwitch->addChild(child1, 0); // 添加第一个子节点
multiSwitch->addChild(child2, 1); // 添加第二个子节点
multiSwitch->addChild(child3, 2); // 添加第三个子节点
由于 MultiSwitch
会自动判断选中的子节点进行渲染,因此,以下操作是不需要的:
multiSwitch->setSingleChildOn(0); // 将第一个子节点设为当前节点
MultiSwitch
可用的控制条件包括:
在此,我们使用 setChoiceStringValue
方法指定选中的子节点。
// 设置条件
multiSwitch->setChoiceStringValue("state", "child2");
注:这里的 "state"
是随便定义的名称,在后面的条件判断时需要使用。
std::string currentState = multiSwitch->getChoiceStringValue("state");
注:这会返回所有可能的选中状态。
MultiSwitch
可以添加多个判断器并进行组合使用。
这里使用两种判断:
具体的代码如下:
osg::ref_ptr<osg::CullSettings::CullingMode> cullingMode = new osg::CullSettings::CullingMode;
cullingMode->addCullCallback(new osgSim::DOFCallback()); // 添加 "视距判断器"
multiSwitch->setCullingActive(true); // 启用判断器
multiSwitch->setCullingMode(cullingMode.get()); // 添加判断器
osg::ref_ptr<osgSim::MultiSwitch> multiSwitch = new osgSim::MultiSwitch();
multiSwitch->addChild(child1, 0); // 添加第一个子节点
multiSwitch->addChild(child2, 1); // 添加第二个子节点
multiSwitch->addChild(child3, 2); // 添加第三个子节点
multiSwitch->setChoiceStringValue("state", "child2"); // 设置第二个子节点为当前节点
osg::ref_ptr<osg::CullSettings::CullingMode> cullingMode = new osg::CullSettings::CullingMode;
cullingMode->addCullCallback(new osgSim::DOFCallback()); // 添加 "视距判断器"
multiSwitch->setCullingActive(true); // 启用判断器
multiSwitch->setCullingMode(cullingMode.get()); // 添加判断器
std::string currentState = multiSwitch->getChoiceStringValue("state"); // 获取当前状态