osg控制节点的显示与否

2024-06-07 18:18
文章标签 显示 控制 节点 osg

本文主要是介绍osg控制节点的显示与否,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                      欢迎关注公众号可以查看更多完整文章

使物体或者说Node隐藏方式有两种,一种是设置NodeMask,另外一种是使用osg的switch类来控制。
两者的区别是
前者只是看不到,数据还在场景中,隐藏了并不能影响渲染性能,不影响内存中的数据;

后者是从内存中暂时移除,会对性能有所影响,需要显示时再加载进场景。

回调的速度好像是每帧调用一次,这样程序运行起来,会看到球以很快的速度在闪。为了更方便的观察,我在回调中做了限制,每5000次取反一次进行显示。

osg::Switch隐藏和显示节点的接口有很多种组合方法,我在程序中有体现。将节点添加到Switch对象中,可以通过getChildIndex来获取当前节点在Switch对象中的索引。

如果需要将Switch对象中节点全部隐藏和显示,可以使用setAllChildrenOff和setAllChildrenOn接口。

完整程序:

#include <osg/Geode>
#include <osgViewer/Viewer>
#include <osg/ShapeDrawable>
#include <osg/Switch>using namespace osg;
using namespace osgViewer;#pragma  comment(lib,"osgd.lib")
#pragma  comment(lib,"osgViewerd.lib")class NodeVisiableCallback :public NodeCallback
{
public:NodeVisiableCallback(unsigned int index) :_bVisiable(false), _childIndex(index), _tick(0){}~NodeVisiableCallback(){};virtual void operator()(Node* node, NodeVisitor* nv){if (_tick < 5000){_tick++;return;}else{_tick = 0;}ref_ptr<Switch> sw = dynamic_cast<Switch*>(node);if (sw)sw->setValue(_childIndex, _bVisiable = !_bVisiable);}
protected:bool _bVisiable;unsigned int _tick;unsigned int _childIndex;
};int main(int argc, char **argv)
{Viewer viewer;ref_ptr<Group> group = new Group;ref_ptr<Geode> node1 = new Geode;ref_ptr<Geode> node2 = new Geode;ref_ptr<ShapeDrawable> sphere1 = new ShapeDrawable(new Sphere(Vec3(10, 0, 0), 2.f));ref_ptr<ShapeDrawable> sphere2 = new ShapeDrawable(new Sphere(Vec3(-10, 0, 0), 2.f));node1->addDrawable(sphere1);node2->addDrawable(sphere2);ref_ptr<Switch> sw = new Switch;//onsw->addChild(node1);sw->setUpdateCallback(new NodeVisiableCallback(sw->getChildIndex(node1)));//off 1//sw->addChild(node1,0);//off 2//sw->addChild(node1);//sw->setChildValue(node1, 0);//off 3//sw->addChild(node1);//sw->setValue(sw->getChildIndex(node1), 0);//off 4//sw->addChild(node1);//sw->setAllChildrenOff();group->addChild(sw);group->addChild(node2);viewer.setSceneData(group.get());viewer.realize();viewer.run();
}


本文地址:http://blog.csdn.net/u011417605/article/details/70237688

这篇关于osg控制节点的显示与否的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

SpringSecurity显示用户账号已被锁定的原因及解决方案

《SpringSecurity显示用户账号已被锁定的原因及解决方案》SpringSecurity中用户账号被锁定问题源于UserDetails接口方法返回值错误,解决方案是修正isAccountNon... 目录SpringSecurity显示用户账号已被锁定的解决方案1.问题出现前的工作2.问题出现原因各

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

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

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

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

idea中project的显示问题及解决

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

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应

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

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