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

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

第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

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但

lvgl8.3.6 控件垂直布局 label控件在image控件的下方显示

在使用 LVGL 8.3.6 创建一个垂直布局,其中 label 控件位于 image 控件下方,你可以使用 lv_obj_set_flex_flow 来设置布局为垂直,并确保 label 控件在 image 控件后添加。这里是如何步骤性地实现它的一个基本示例: 创建父容器:首先创建一个容器对象,该对象将作为布局的基础。设置容器为垂直布局:使用 lv_obj_set_flex_flow 设置容器

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t