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

相关文章

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Apache Tomcat服务器版本号隐藏的几种方法

《ApacheTomcat服务器版本号隐藏的几种方法》本文主要介绍了ApacheTomcat服务器版本号隐藏的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1. 隐藏HTTP响应头中的Server信息编辑 server.XML 文件2. 修China编程改错误

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

电脑显示hdmi无信号怎么办? 电脑显示器无信号的终极解决指南

《电脑显示hdmi无信号怎么办?电脑显示器无信号的终极解决指南》HDMI无信号的问题却让人头疼不已,遇到这种情况该怎么办?针对这种情况,我们可以采取一系列步骤来逐一排查并解决问题,以下是详细的方法... 无论你是试图为笔记本电脑设置多个显示器还是使用外部显示器,都可能会弹出“无HDMI信号”错误。此消息可能

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

Node Linux相关安装

下载经编译好的文件cd /optwget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.gztar -xvf node-v10.15.3-linux-x64.tar.gzln -s /opt/node-v10.15.3-linux-x64/bin/npm /usr/local/bin/ln -s /opt/nod