Open Scene Graphics 开放场景开发api。
资源: 论坛 中英文主页 osg程序设计教程 , osg quick start(in chinese), virtual car simulator(csdn download)
翻了一遍书,有个整体感觉。没有opengl的开发经验,很模糊。看car simulator也算清楚,自己写估计又不行。这里记录几个常用类的方法:
viewer类,提供窗口。
- realize 初始化过程
-run 渲染,(不允许每帧都改变视口)
- getcamera
- setCameraManipulator, 视口操作,指定viewer camera
viewbase基类方法:
- setstate 渲染参数
- setEventVisitor, getEventVistor, 事件遍历器
- setUpdateVisitor, getUpdateVisitor
node类,场景中基本单元。
- accept 全遍历 (参数 node visitor)
-ascend 向上遍历
-traverse 向下遍历
-setUpdateCallback, getUpdateCallback 更新回调
- setEventCallback, getEventCallback
- setStateSet getOrCreateStateSet 渲染参数
- BoundSphere 相交测试类函数
MatrixTransfrom类
- setMatrix, 添加一个matrix操作
- getMatrix,
- getInverseMatrix
Geode 叶节点类,不能再有子结点,但可添加drawable类
- addDrawable
- boundingbox 包围盒计算
-- 事件监听 + 响应(交互)
scene数据都put到viewer对象里,然后对scene中某个节点对象进行监听-响应,通过对viewer添加addEventHandler方法(事件处理器方法),与root节点引用遍历访问子节点的思想一致。
一般过程是,继承一个osgGA::GUIEventHandler子类,重载其中handle方法
GUIEventHandler类
- operator 向下遍历node
- handle 封装监听-响应
--- 上述 GUIEventHandler有一个特殊的子类,即事件响应是viewer的视角变化,这涉及操作viewer的camera,对于场景漫游等非常游泳,故定义了一个单独的新类
OSG::CameraManipulator 继承 OSG::GUIEventHandler.
--- 上述“ 事件监听-响应”过程,具体对“响应”的实现在回调函数中。Event/UpdateCallback
======= 动态更改
osgviewer 支持多线程,每个线程独立允许拣选,绘制。出于性能考虑,没有线程锁设计。那么就要求所有动态数据更改,必须在拣选,绘制的时间之外。
ERROR: 程序崩溃,往往就是用户在拣选,绘制过程改变了场景数据。
方法1: 设置data variance, static状态的对象是不需要完成更新就可以返回的;dynamic状态对象,必须在完成更新厚才能返回。
方法2: node更新/拣选回调。回调实际就是在更改节点数据
继承NodeCallback类,重载operator(Node&, NodeVisitor& ) 方法,使用setUpdateCallback 关联到node
----- 节点遍历 NodeVisitor