osgcallback

来源:互联网 发布:淘宝5年老店标志没了 编辑:程序博客网 时间:2024/04/27 20:05

 该示例程序主要展示了osg回调的用法,osg提供的回调功能主要使节点能够完成用户临时定义的功能,这些功能由回调函数完成,在每帧更新时(不同回调类型执行回调函数的时机不一样)执行回调函数完成用户定义的功能。

能执行回调函数的对象包括:节点、叶结点、相机、几何体(Drawable),osg提供的回调类型包括:

更新回调(UpdateCallback)每帧遍历时执行,自动执行回调函数。

事件回调(EventCallback):由事件触发回调函数的执行。

拣选回调(CullCallback):在拣选遍历时执行回调函数。

绘制回调(DrawCallback):几何体(Drawable)对象绘制时,执行回调函数,只能(Drawable)对象使用。

在示例程序中分别演示了这些回调类型的用法,执行回调首先要从osg::NodeCallback派生子类,在派生类中重载operator()方法,在该方法中加入自己定义的功能,然后让派生的类和相关的对象关联,执行回调。

示例程序主要使用InsertCallbacksVisitor类对根节点进行遍历,对于遍历到的节点执行相应的回调,示例代码如下:

class InsertCallbacksVisitor : public osg::NodeVisitor
{

public:

 InsertCallbacksVisitor():osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN)
 {
 }

//当遍历到节点时,执行更新和拣选回调 

virtual void apply(osg::Node& node)
 {
       node.setUpdateCallback(new UpdateCallback());
       node.setCullCallback(new CullCallback());
      traverse(node);
 }

//遍历到叶结点时,执行更新回调,对于叶结点执行拣选回调是无意义的。 

virtual void apply(osg::Geode& geode)
 {
      //执行更新回调

      geode.setUpdateCallback(new UpdateCallback());

      //得到叶结点包含的几何体,对每个几何体执行更新、拣选、绘制回调 

      for(unsigned int i=0;i<geode.getNumDrawables();++i)
      {
           geode.getDrawable(i)->setUpdateCallback(new DrawableUpdateCallback());
           geode.getDrawable(i)->setCullCallback(new DrawableCullCallback());
          geode.getDrawable(i)->setDrawCallback(new DrawableDrawCallback());
       }
 }

 virtual void apply(osg::Transform& node)
 {
      apply((osg::Node&)node);
 }
};

对于每种回调类的定义,在此不再重复,请参看相关的代码。

0 0
原创粉丝点击