本文主要是介绍osg隐藏物体或者Node(多个物体轮流显示),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
欢迎关注公众号可以查看更多完整文章
对于OSG源码的下载、编译我就不说明了,网上的例子很多。
使物体或者说Node隐藏方式有两种,一种是设置NodeMask,另外一种是使用osg的switch类来控制。
两者的区别是
前者只是看不到,数据还在场景中,隐藏了并不能影响渲染性能,不影响内存中的数据;
后者是从内存中暂时移除,会对性能有所影响,需要显示时再加载进场景。
这篇文章暂时说一下怎么使用NodeMask。
setNodeMask是osg::Node类的接口,继承了此类的类也具有此功能,比如osg::Group、osg::Geode类。
程序中创建了一个Group,来管理多个Node。每个Node可以设置NodeMask来表现出显示与否。
为了更加直观的表现这种现象,我在程序中添加了UpdateCallback节点刷新回调MaskCallBack类,
在类中设置节点的NodeMask,从而控制显示与否。
有个需要注意的地方就是:如果提前对NodeMask设置了0,也就是不显示节点,那么物体就看不到了,那么这个节点相关联的回调函数是不会调用的。
为了使用回调来控制节点的显示和隐藏,我在回调中添加了成员变量来保存Node指针。为了防止上面那个问题出现,我使用的方法是,在Node1的节点回调中保存Node2的指针,而在Node2的节点回调中保存Node1的指针:这样就可以在隐藏其中一个节点的时候,打开另一个节点,始终会有一个节点显示,始终都会调用其中一个回调,始终都可以看到其中一个节点了。
回调的速度好像是每帧调用一次,这样程序运行起来,会看到两个球以很快的速度在闪。为了更方便的观察,我在回调中做了限制,每1000次mask取反一次,轮流显示。
代码如下:
#include <osg/Node>
#include <osg/Shape>
#include <osgViewer/Viewer>
#include <osg/ShapeDrawable>#pragma comment(lib,"osgd.lib")
#pragma comment(lib,"osgViewerd.lib")class MaskCallBack :public osg::NodeCallback
{
public:MaskCallBack(osg::Node* node) :m_mask(0), m_node(node), m_tick(0){}virtual void operator()(osg::Node* node, osg::NodeVisitor* nv){if (m_tick < 1000){m_tick++;return;}else{m_tick = 0;}if (m_node)m_node->setNodeMask(m_mask);if (node)node->setNodeMask(m_mask = ~m_mask);}
protected:~MaskCallBack(){}unsigned int m_mask;osg::ref_ptr<osg::Node> m_node;unsigned int m_tick;
};int main(int *argc, char *argv[])
{osgViewer::Viewer viewer;osg::ref_ptr<osg::Group> group = new osg::Group;osg::ref_ptr<osg::Geode> node1 = new osg::Geode;osg::ref_ptr<osg::ShapeDrawable> shape1 = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(100, 0, 0), 20.0));shape1->setColor(osg::Vec4(1, 0, 0, 1));node1->addDrawable(shape1.get());osg::ref_ptr<osg::Geode> node2 = new osg::Geode;osg::ref_ptr<osg::ShapeDrawable> shape2 = new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(-100, 0, 0), 20.0));shape2->setColor(osg::Vec4(0, 1, 0, 1));node2->addDrawable(shape2.get());//node1->setNodeMask(0x0);node1->setUpdateCallback(new MaskCallBack(node2));node2->setUpdateCallback(new MaskCallBack(node1));group->addChild(node1.get());group->addChild(node2.get());viewer.setSceneData(group.get());viewer.realize();viewer.run();
}
本文地址:osg隐藏物体或者Node(多个物体轮流显示)_GreenArrowMan-CSDN博客-CSDN博客
源码下载:osg节点轮流显示,隐藏和显示_osg获取节点隐藏状态-C++代码类资源-CSDN下载
这篇关于osg隐藏物体或者Node(多个物体轮流显示)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!