osg隐藏物体或者Node(多个物体轮流显示)

2024-06-07 18:18

本文主要是介绍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(多个物体轮流显示)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039931

相关文章

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

nvm如何切换与管理node版本

《nvm如何切换与管理node版本》:本文主要介绍nvm如何切换与管理node版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录nvm切换与管理node版本nvm安装nvm常用命令总结nvm切换与管理node版本nvm适用于多项目同时开发,然后项目适配no

Python实现合并与拆分多个PDF文档中的指定页

《Python实现合并与拆分多个PDF文档中的指定页》这篇文章主要为大家详细介绍了如何使用Python实现将多个PDF文档中的指定页合并生成新的PDF以及拆分PDF,感兴趣的小伙伴可以参考一下... 安装所需要的库pip install PyPDF2 -i https://pypi.tuna.tsingh

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

Node.js net模块的使用示例

《Node.jsnet模块的使用示例》本文主要介绍了Node.jsnet模块的使用示例,net模块支持TCP通信,处理TCP连接和数据传输,具有一定的参考价值,感兴趣的可以了解一下... 目录简介引入 net 模块核心概念TCP (传输控制协议)Socket服务器TCP 服务器创建基本服务器服务器配置选项服

mac安装nvm(node.js)多版本管理实践步骤

《mac安装nvm(node.js)多版本管理实践步骤》:本文主要介绍mac安装nvm(node.js)多版本管理的相关资料,NVM是一个用于管理多个Node.js版本的命令行工具,它允许开发者在... 目录NVM功能简介MAC安装实践一、下载nvm二、安装nvm三、安装node.js总结NVM功能简介N