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

相关文章

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

Python函数返回多个值的多种方法小结

《Python函数返回多个值的多种方法小结》在Python中,函数通常用于封装一段代码,使其可以重复调用,有时,我们希望一个函数能够返回多个值,Python提供了几种不同的方法来实现这一点,需要的朋友... 目录一、使用元组(Tuple):二、使用列表(list)三、使用字典(Dictionary)四、 使

idea中project的显示问题及解决

《idea中project的显示问题及解决》:本文主要介绍idea中project的显示问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录idea中project的显示问题清除配置重China编程新生成配置总结idea中project的显示问题新建空的pr

VSCode中配置node.js的实现示例

《VSCode中配置node.js的实现示例》本文主要介绍了VSCode中配置node.js的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一.node.js下载安装教程二.配置npm三.配置环境变量四.VSCode配置五.心得一.no

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

Java中Switch Case多个条件处理方法举例

《Java中SwitchCase多个条件处理方法举例》Java中switch语句用于根据变量值执行不同代码块,适用于多个条件的处理,:本文主要介绍Java中SwitchCase多个条件处理的相... 目录前言基本语法处理多个条件示例1:合并相同代码的多个case示例2:通过字符串合并多个case进阶用法使用

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

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

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

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

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