依照惯例,先看总体流程
到了更新回调
。
一边抄一边记忆
OSG更新回调的作用与事件回调有类似之处,由专门的访问器对象_updateVisitor负责场景图形更新遍历
所有的节点和Drawable几何体对象都可以使用setUpdateCallback设置更新回调
通过重载NodeCallback::operator()或者Drawable::UpdateCallback::update函数,可以在回调对象中添加自定义的工作。
更新回调与事件回调最大的不同在于:每当一个用户交互或系统事件产生时,每一个节点(以及Drawable对象)的事件回调都会被调用一次;而节点(以及Drawable对象)的更新回调只会在每帧中被调用一次。这一区别决定了我们应当在什么时候使用事件回调,什么时候使用更新回调。
osg的更新遍历函数updatteTraversal在系统每帧的执行过程中,除了处理用户的更新回调对象外,还要负责更新摄像机的位置,并且更新分页数据库DatabasePager和图像库ImagePager的内容。流程如下
空的。。。。。。。
由于电子书后面有详细解释,所以这里就不多调试了。在第11天调试进去。
一般operation对象可以用来处理与图形设备以及opengl底层API相关的工作,不过用户级的工作在这里实现也没有问题。
先说的更新工作队列_updateOperations。更新工作需要继承osg::Operation并重写operator()操作符,以实现一些特定的用户操作。
这里是个纯虚函数,需要重载。
这里还举了个例子,定义场景预处理
可以写入多组更新处理器
也可以移除
接下来是从摄像机_slaves的更新
接下来论述了从摄像机组各个从摄像机的投影矩阵和观察矩阵分别是主摄像机的投影矩阵和观察矩阵再各自加上一个偏移量,场景筛选设置也是从主摄像机继承的。
设置从摄像机Cullsettings的继承掩码
这里可以看到cullsettings有很多种场景筛选设置选项。
先说如何设置这些cullsettings的继承掩码
看看如何使用的。
咦,camera在用。看看camera类
当然是osg::Camera派生于osg::Cullsettings类了
现在看看有多少种剔除方式,跟过去这个枚举类型。
这里有几个设置项
背面裁剪
剪切平面
细节筛选判断对象是否足够细微
如果怕忽略掉细节,则设置最小的包围盒
聚集筛选
设置一种或多种筛选方式可以使用CullSetting::setCullingMode函数,(采用“或”运算来指定多种筛选方式),如果希望暂时屏蔽某一种筛选方式,则可以类似
camera->setCullingMode(camera->getCullingMode() & ~osg::Cullsetting::SMALL_FEATURE_CULLING):
有关各种筛选方式的详细算法,在CullingSet::isCulled()