• 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;
    }

    三.事件回调

    四.文件读取回调

  • 相关阅读:
    Centos7如何安装开源办公软件Libreoffice
    vi/vim输入中文乱码,无法输入中文解决方法
    NFS+Rsync增量备份方案
    完全备份,增量备份,差异备份及恢复区别
    Centos7安装Windows程序,例如QQ,微信,notepad++等exe程序
    Centos7升级内核后,导致打开VMware提示需要安装vmmon和vmnet模块
    SSH安全加固
    PHP使用mail函数发送邮件
    Centos7使用mail命令发送邮件
    Python部署配置Django架构教程
  • 原文地址:https://www.cnblogs.com/k5bg/p/11465921.html
Copyright © 2020-2023  润新知