Viewer在其内部创建了一个osg::Camera摄像机对象来管理osg的模型—视图矩阵。用户可以通过以下的两个方法来控制Camera对象。
①将一个摄像机控制器对象关联到Viewer中。如果你的程序不需要这么做,那么Viewer.run()将自动创建一个osgGA::TrackballManipulator对象来控制摄像机的工作。osgGA库定义了一些常用的控制器类。用户可以调用Viewer::setCameraManipulator来指定一个期望的控制器。
②设置Camera对象的投影矩阵和观察矩阵为自定义的矩阵值。这样也可以保证用户程序能够完全控制视口的浏览动作。
osgViewer::setViewMatrix()方法来设置视口矩阵。参数是一个osg::Matrix矩阵, osgViewer::setViewMatrixAsLookat():参数和gluLookAt类似,三个向量:eye,center,up。 设置清屏颜色:
Camera::setClearColor()用来设置清屏颜色,缺省情况下会清除深度和颜色缓存,可以使用Camera::setClearMask(GL_CLOLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)来设置清除属性。
3.1.2 SimpleViewer 和 CompositeViewer
osgViewer::SimpleViewer类不会主动的创建窗口或者设备上下文,它需要依赖用户程序来创建窗口、上下文,并将其激活为当前设备,如果操作正确的话,SimpleViewer::frame()将会在用户给定的窗口中渲染。
osgViewer::CompositeViewer:Viewer类只能在一个场景中添加一个视口,而CompositeViewer类可以支持一个或多个场景的多个视口显示,并允许用户程序指定其渲染顺序。CompositeViewer还支持渲染到纹理(RTT)的操作,即,允许用户程序将一个视口中渲染的图像作为另一个视口的纹理贴图。
二.动态更改
Osg允许用户动态的修改场景图形并因而改变每一帧的显示。用户可以更改几何数据,渲染状态参数,Switch节点设置,以及任何场景图形的结构。OsgViewer库支持多线程模式,每一个线程均独立的运行挑选及绘制遍历,但osg并没有为了线程的安全性增设内存锁,而是要求用户程序只可在挑选及绘制遍历的时域之外修改场景图形。
确保用户的修改不会与挑选及绘制线程发生冲突,一个简单的方案是,在Viewer::frame()的调用之外进行场景图形的修改,这需要在主渲染循环中添加额外的代码。但如果用户希望自己的程序更加整洁及规范的话,可以选择在更新遍历中进行场景的修改操作。
一些与场景图形动态更改相关的基本技术:
1. 处于性能优化和线程安全性的考虑,用户需要通知osg,场景图形的哪些部分是可能要进行修改的。用户可以通过设置Object对象(Node,Drawable,StateSet等)的数据变度(data variance)属性来完成这一工作。
2. osh允许用户为Node和Drawable设置回调(callback)。Osg将在特定遍历中执行这些回调, 3. 用户程序有时不能预知场景图形的哪一部分需要修改。这是需要搜索整个场景图形来查找特定的节点,或者由用户使用鼠标等输入设备来选择一个节点。
3.2.1 数据边度
OsgViewer支持的多线程模型允许主循环不必等到绘制遍历结束就可以继续运行,也就是Viewer::frame()方法在绘制遍历仍未结束的时候就可以返回。换句话说,上一帧的绘制遍历可以与下一帧的更新遍历产生重叠。Osg提供了osg::object::DataVariance()方法解决绘制遍历与多线程的更新操作的冲突。(Frame():Render a complete new frame)。用于处理绘制遍历与其他遍历的同步性。
3.2.2 回调