osg 学习 1

来源:互联网 发布:兴业证券 炒股软件 编辑:程序博客网 时间:2024/06/02 09:18


   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 

  


       

   

0 0