OSG:幼儿园篇 第四章 节点回调类

一.简介

osg::NodeCallback类继承自osg::Object类

osg::Node可以在执行更新和拣选遍历时进行回调

osg::Drawable可以在拣选和绘制遍历时进行回调

osg::Camera可以在更新遍历时进行回调

//第一个参数关联节点地址 第二个参数是节点访问器
virtual void operator() (Node* node, NodeVisitor* nv)
{

  //继续遍历
  traverse(node, nv);
}

 

创建一个回调:

(1)编写继承自 osg::NodeCallback 类的子类

(2)重载 operator() 方法

(3)初始化回调关联对象:setUpdateCallback()  setCullCallback()  setDrawCallback()  setEventCallback()  setReadFileCallback()  setWriteFileCallback()

 

二.节点回调

#include <osgViewer/Viewer>

#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osg/NodeCallback>
#include <osg/MatrixTransform>

#include <osgDB/ReadFile>
#include <osgDB/WriteFile>

#include <osgUtil/Optimizer>

//从 osg::NodeCallback 继承一个新类,实现 spaceship 的回调
class SpaceShipCallback : public osg::NodeCallback
{
public:
    SpaceShipCallback():angle(0)
    {

    }

    virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
    {
        //创建矩阵变换节点
        osg::ref_ptr<osg::MatrixTransform> mtCow = dynamic_cast<osg::MatrixTransform*>(node);

        //创建矩阵
        osg::Matrix mr;

        //旋转绕Z轴 每次旋转angle角度
        mr.makeRotate(angle, osg::Vec3(0.0f, 0.0f, 1.0f));

        //设置矩阵
        mtCow->setMatrix(mr);

        angle += 0.01;

        //继续传递参数,执行其他设置回调的节点
        traverse(node, nv);
    }

public:

    //旋转角度
    double angle;
};

int main()
{
    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();

    osg::ref_ptr<osg::Group> root = new osg::Group();

    //读取奶牛模型
    osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");

    //创建矩阵变换节点
    osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform();
    mt->addChild(node.get());
    
    //设置更新回调
    mt->setUpdateCallback(new SpaceShipCallback());
    root->addChild(mt.get());
    
    //优化场景数据
    osgUtil::Optimizer optimizer;
    optimizer.optimize(root.get());
    viewer->setSceneData(root.get());
    viewer->realize();
    viewer->run();

    return 0;
}

 

 

 

 

三.事件回调

 

四.文件读取回调

 

posted @ 2019-09-05 14:44  言午丶  阅读(483)  评论(0编辑  收藏  举报