博客
关于我
OSG学习:OSG组成(二)——场景树
阅读量:800 次
发布时间:2023-02-26

本文共 2934 字,大约阅读时间需要 9 分钟。

OpenSceneGraph 节点结构与编程方法

OpenSceneGraph(OSG)是一种高效的三维渲染引擎,其核心在于通过包围体层次(Bounding Volume Hierarchy, BVH)来管理三维场景。这种结构通过将三维物体包装在简单的几何体中,从而显著提升了检测和渲染效率。OSG综合运用包围球和包围盒,实现对复杂场景的高效管理。

场景树

OSG的场景树采用分层的树状数据结构组织空间数据集,显著提升渲染效率。场景树由三大基本节点组成:NodeGeodeGroup

  • Geode(叶节点)

    Geode是叶节点,负责管理和绘制多个可绘制对象(Drawable)。这些对象包括三维几何体、复杂模型、场景中的文字、图片以及喷薄的粒子等。需要注意的是,OSG支持直接绘制到二维图形窗口设备、自动转向用户方向的广告牌等特殊物体。

  • Group(组节点)

    Group是场景树的核心结构,主要用于管理和调度子节点。Group节点的性质变化会影响其子节点的行为,类似于摇晃树枝条时,子分支、叶子和果实都会随之动态变化。Group节点的具体分类包括:

    • 空间变换节点:调整节点在三维空间中的位置和姿态。
    • 开关节点:控制物体的显示、冻结或隐藏。
    • 细节层次节点:根据距离优化物体的显示细节。
    • 相机节点:支持多视角观察同一场景。
    • 投影节点:将三维场景投影到二维平面。
    • 渲染属性节点:管理光照、雾效、透明度等渲染属性。
    • 覆盖节点:实现场景的叠加和复合。
    • 遮挡裁剪节点:剔除用户看不到的部分。
    • 动态调度节点:优化内存管理,提升性能。
    • 关节节点:实现人体动作或机械臂的运动。
    • 代理节点:用于内存外存的节点管理。
  • 节点访问

    节点访问是实现对场景树操作的关键。OSG通过访问器(NodeVisitor)实现对节点的操作,主要包括读取节点属性和执行用户定义的操作。访问器采用深度优先遍历的方式,遍历节点直至叶节点,逐步返回到尚未访问的父节点。

    访问器中的accept()方法负责将访问器传递给节点,节点通过apply()方法反过来执行访问器的具体操作。OSG的节点访问机制支持回调,回调可以用于每帧更新或人机交互事件处理。

    节点方法

    osg::Node类

    • Node():默认构造函数。
    • dirtyBound():标记节点包围体需要更新。
    • getBound()computeBound():获取节点包围体和计算包围体。
    • getParents()getParent(unsigned int i)getNumParents():管理父节点关系。
    • addParent()removeParent():修改父节点列表。
    • accept()ascend():节点访问控制。
    • traverse():深度优先遍历节点。

    osg::Geode类

    • Geode():默认构造函数。
    • addDrawable()removeDrawable()replaceDrawable():管理可绘制对象。
    • getNumDrawables()getDrawables(unsigned int i)getDrawableIndex():获取可绘制对象列表。
    • getDrawableList():获取所有可绘制对象。

    osg::Group类

    • Group():默认构造函数。
    • addChild()removeChild():管理子节点。
    • removeChildren()insertChild()replaceChild():修改子节点列表。
    • getNumChildren()getChild(unsigned int i)getChildIndex():获取子节点信息。

    osg::NodeVisitor类

    • NodeVisitor(TraversalMode tm):构造函数,指定遍历方式。
    • traverse()apply():实现节点访问和操作。

    osg::NodeCallback类

    • NodeCallback():默认构造函数。
    • operator():执行节点回调。
    • addNestedCallback()removeNestedCallback()setNestedCallback():管理嵌套回调。
    • getNestedCallback():获取嵌套回调。

    osg::Transform类

    • Transform():默认构造函数。
    • setReferenceFrame()getReferenceFrame():管理参考坐标系。
    • computeLocalToWorldMatrix()computeWorldToLocalMatrix():计算空间变换矩阵。

    osg::MatrixTransform类

    • MatrixTransform():默认构造函数。
    • setMatrix()getMatrix():管理变换矩阵。
    • preMult()postMult():矩阵运算。
    • getInverseMatrix():获取逆矩阵。

    osg::PositionAttitudeTransform类

    • PositionAttitudeTransform():默认构造函数。
    • setPosition()setAttitude()setScale()setPivotPoint():管理空间变换参数。
    • getPosition()getAttitude()getScale()getPivotPoint():获取变换参数。

    osg::Switch类

    • Switch():默认构造函数。
    • addChild()setValue(unsigned int pos, bool):管理子节点开关。
    • getValue(unsigned int pos):获取子节点开关状态。
    • setNewChildDefaultValue(bool value)getNewChildDefaultValue():管理新节点默认值。
    • setChildValue()getChildValue():设置子节点开关值。
    • setAllChildrenOff()setAllChildrenOn()setSingleChildOn(unsigned int pos):控制子节点显示状态。

    osg::LOD类

    • LOD():默认构造函数。
    • addChild(Node *child, float min, float max):添加子节点并设置观察范围。
    • setRange(unsigned int childNo, float min, float max):设置子节点观察范围。
    • getMinRange(unsigned int childNo)getMaxRange(unsigned int childNo):获取子节点观察范围。
    • getRangeList():获取所有子节点观察范围列表。

    通过上述方法,开发者可以高效地管理和操作OpenSceneGraph中的节点结构,实现高效的三维渲染和动态场景管理。

    转载地址:http://pkvfk.baihongyu.com/

    你可能感兴趣的文章
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
    查看>>
    org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded
    查看>>
    org.tinygroup.serviceprocessor-服务处理器
    查看>>
    org/eclipse/jetty/server/Connector : Unsupported major.minor version 52.0
    查看>>
    org/hibernate/validator/internal/engine
    查看>>
    Orleans框架------基于Actor模型生成分布式Id
    查看>>
    SQL-36 创建一个actor_name表,将actor表中的所有first_name以及last_name导入改表。
    查看>>
    ORM sqlachemy学习
    查看>>
    Ormlite数据库
    查看>>
    orm总结
    查看>>
    ORM框架 和 面向对象编程
    查看>>
    OS X Yosemite中VMware Fusion实验环境的虚拟机文件位置备忘
    查看>>
    os.environ 没有设置环境变量
    查看>>
    os.path.join、dirname、splitext、split、makedirs、getcwd、listdir、sep等的用法
    查看>>
    os.removexattr 的 Python 文档——‘*‘(星号)参数是什么意思?
    查看>>
    os.system 在 Python 中不起作用
    查看>>
    OS2ATC2017:阿里研究员林昊畅谈操作系统创新与挑战
    查看>>
    OSCACHE介绍
    查看>>
    SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum
    查看>>
    OSChina 周五乱弹 ——吹牛扯淡的耽误你们学习进步了
    查看>>