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

    三.事件回调

    四.文件读取回调

  • 相关阅读:
    超简单tensorflow入门优化程序&&tensorboard可视化
    tf.random_normal()函数
    tensorflow中创建多个计算图(Graph)
    tensorflow中有向图(计算图、Graph)、上下文环境(Session)和执行流程
    配置错误 在唯一密钥属性“fileExtension”设置为“.log”时,无法添加类型为“mimeMap”的重复集合项
    取奇偶数
    DNS添加/修改/查询/删除A记录
    IE自动化
    Get-ChildItem参数之 -Exclude,Filter,Recurse应用
    自动下载
  • 原文地址:https://www.cnblogs.com/k5bg/p/11465921.html
Copyright © 2011-2022 走看看