zoukankan      html  css  js  c++  java
  • 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;
    }

    三.事件回调

    四.文件读取回调

  • 相关阅读:
    mybatis-databaseIdProvider多数据库支持
    mysql-高性能索引策略
    mysql-冗余和重复索引
    mybatis-枚举类型的typeHandler&自定义枚举类型typeHandler
    mybatis-自定义typeHandler
    mysql-覆盖索引
    单例模式
    mybatis实战教程一:开发环境搭建
    MySQL分页查询优化
    深入组件
  • 原文地址:https://www.cnblogs.com/k5bg/p/11465921.html
Copyright © 2011-2022 走看看