回调的类型有很多种,一般很容易就想到的是UpdateCallBack,或者EventCallBack,回调的意思就是说,你可以规定在某件事情发生时启动一个函数,这个函数可能做一些事情。这个函数就叫做回调函数。

  1. #include<osg\MatrixTransform>
  2. #include<osg\PositionAttitudeTransform>
  3. #include<osg\Geode>
  4. #include<osgDB\Registry>
  5. #include<osgDB\ReadFile>
  6. #include<osgGA\TrackballManipulator>
  7. #include<osgViewer\Viewer>
  8.  
  9. //创建一条路径
  10. osg::AnimationPath* createAnimationPath(const osg::Vec3& center, float radius, double looptime)
  11. {
  12. //路径实体
  13. osg::AnimationPath* animationPath = new osg::AnimationPath;
  14. //设置循环模式为LOOP
  15. animationPath->setLoopMode(osg::AnimationPath::LOOP);
  16. //设置关键点数
  17. int numSamples = 40;
  18. float yaw = 0.0f;
  19. float yaw_delta = 2.0f*osg::PI / ((float)numSamples - 1.0f);
  20. float roll = osg::inDegrees(30.0f);
  21. //设置时间间隔
  22. double time = 0.0f;
  23. double time_delta = looptime / (double)numSamples;
  24. //插入关键点与时间以及旋转角度和位置
  25. for (int i = 0; i < numSamples; ++i)
  26. {
  27. osg::Vec3 position(0, 0, 0);
  28. osg::Quat rotation(osg::Quat(roll, osg::Vec3(0.0, 1.0, 0.0))*osg::Quat(-(yaw + osg::inDegrees(90.0f)), osg::Vec3(0.0, 0.0, 1.0)));
  29. //具体插入操作
  30. animationPath->insert(time, osg::AnimationPath::ControlPoint(position, rotation));
  31. yaw += yaw_delta;
  32. time += time_delta;
  33. }
  34. return animationPath;
  35. }
  36. //创建移动模型
  37. osg::Node* createMovingModel(const osg::Vec3& center, float radius)
  38. {
  39. float animationLength = 10.0f;
  40. //创建的路径
  41. osg::AnimationPath* animationPath = createAnimationPath(center, radius, animationLength);
  42. osg::Group* model = new osg::Group;
  43. //读取模型,并隐藏它下面的第一个节点
  44. osg::Node* fountain = osgDB::readNodeFile("fountain.osgt");
  45. fountain->asGroup()->getChild(0)->setNodeMask(0);
  46. //如果读取成功,则更新赋予它的路径
  47. if (fountain)
  48. {
  49. osg::PositionAttitudeTransform* xform = new osg::PositionAttitudeTransform;
  50. //设置更新回调
  51. xform->setUpdateCallback(new osg::AnimationPathCallback(animationPath, 0.0, 1.0));
  52. //加入子模型节点
  53. xform->addChild(fountain);
  54. model->addChild(xform);
  55. }
  56. return model;
  57. }
  58. //创建模型
  59. osg::Node* createModel()
  60. {
  61. osg::Vec3 center(0.0f, 0.0f, 0.0f);
  62. float radius = 1.0f;
  63. osg::Group* root = new osg::Group;
  64. //创建移动的节点,以radius为半径转圈
  65. osg::Node* movingModel = createMovingModel(center, radius*0.8f);
  66.  
  67. //把节点加入到root中并返回
  68. root->addChild(movingModel);
  69. return root;
  70. }
  71. //主函数
  72. int main(int argc, char** argv)
  73. {
  74. osgViewer::Viewer viewer;
  75. //创建模型
  76. osg::Node* model = createModel();
  77. viewer.setSceneData(model);
  78. viewer.setCameraManipulator(new osgGA::TrackballManipulator());
  79. viewer.realize();
  80. return viewer.run();
  81. }

结果图:

OSG学习:使用已有回调示例的更多相关文章

  1. OSG学习:转动的小汽车示例

    由于只是简单的示例,所以小汽车的模型也比较简单,是由简单的几何体组成. 代码如下: #include <osg\ShapeDrawable> #include <osg\Animat ...

  2. OSG学习:响应键盘鼠标示例

    示例功能:示例里面有两个模型,一个是牛,另一个是飞机.鼠标右键时牛和飞机都隐藏,鼠标左键双击时牛和飞机都显示,按键盘上面的LEFT键,显示牛,按键盘上面的RIGHT键显示飞机.其中显示与隐藏节点使用的 ...

  3. OSG学习:基本几何体绘制示例

    绘制并渲染几何体主要有如下3大步骤: 1.创建各种向量数据,如顶点.纹理坐标.颜色和法线等.需要注意的是,添加顶点数据时主要按照逆时针顺序添加, 以确保背面剔除的正确. 2.实例化一个几何体对象(os ...

  4. OSG学习:位置变换节点示例

    osg::PositionAttitudeTransform节点. #include <osgViewer\Viewer> #include <osg\Node> #inclu ...

  5. osg学习示例之遇到问题四骨骼动画编译osgCal

    osg学习示例之遇到问题四骨骼动画编译osgCal 转自:http://blog.csdn.net/wuwangrun/article/details/8239451 今天学到书<OpenSce ...

  6. 对“demo!demo.Index+HookProc::Invoke”垃圾收集的类型已委托回调。这可能会导致应用程序崩溃、损坏和数据丢失。当传递委托给非托管代码,托管应用程序必须让这些委托保持活着

    对"demo!demo.Index+HookProc::Invoke"垃圾收集的类型已委托回调.这可能会导致应用程序崩溃.损坏和数据丢失.当传递委托给非托管代码,托管应用程序必须承 ...

  7. MOOS学习笔记2——HelloWorld回调

    MOOS学习笔记2--HelloWorld回调 例程 #include "MOOS/libMOOS/Comms/MOOSAsyncCommClient.h" bool OnConn ...

  8. OSG学习:使用OSG中预定义的几何体

    常用的内嵌几何体包括: osg::Box //正方体 osg::Capsule //太空舱 osg::Cone //椎体 osg::Cylinder //柱体 osg::HeightField //高 ...

  9. OSG学习:阴影代码示例

    效果图: 代码示例: #include <osgViewer/Viewer> #include <osg/Node> #include <osg/Geode> #i ...

随机推荐

  1. 「PHP」策略模式

    引言   所属:行为型模式,常用设计模式之一     学习资料: <大话设计模式>程杰   模式概述   分享一篇关于策略模式讲的很好的文章,大家可以参考一下:https://www.cn ...

  2. 网站用户行为分析——在Ubuntu下安装MySQL及其常用操作

    安装MySQL 使用以下命令即可进行mysql安装,注意安装前先更新一下软件源以获得最新版本: sudo apt-get update #更新软件源 sudo apt-get install mysq ...

  3. python教程(一)·命令行基本操作

    先来了解下 "命令提示符". 等等?!既然本篇文章标题是"命令行基本操作",那怎么又说到"命令提示符"去了呢?客官莫要急,且听我说 命令提示 ...

  4. ACM数论-卡特兰数Catalan

    Catalan 原理: 令h(0)=1,h(1)=1,catalan 数满足递归式: (其中n>=2) 另类递推公式: 该递推关系的解为: (n=1,2,3,...) 卡特兰数的应用实质上都是递 ...

  5. axios请求封装和异常统一处理

    前端网络请求封装前端采用了axios来处理网络请求,为了避免在每次请求时都去判断各种各样的网络情况,比如连接超时.服务器内部错误.权限不足等等不一而足,我对axios进行了简单的封装,这里主要使用了a ...

  6. Touch table

    On this page I present the results of my touch action research. I concentrated on the few basic acti ...

  7. PHP实现识别带emoji表情的字符串

    function have_special_char($str) { $length = mb_strlen($str); $array = []; for ($i=0; $i<$length; ...

  8. geoserver中WMS服务详细说明

    官方geoserver中WMS服务中几种操作的API的详细说明地址: http://docs.geoserver.org/stable/en/user/services/wms/reference.h ...

  9. day 4 __all__ 包 __init__.py

    1.__all__的作用 如果一个文件中有__all__变量,那么也就意味着这个变量中的元素,不会被from xxx import *时导入 __all__ = ["test1", ...

  10. 【原创】MyEclipse反编译添加jadclipse_3.3.0 曲折的完美解决

    本人QQ:9715234 (java屌丝一枚) 共三部分 一.下载两个文件exe和jar 1.http://nchc.dl.sourceforge.net/project/jadclipse/jadc ...