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

#include<osg\MatrixTransform>
#include<osg\PositionAttitudeTransform>
#include<osg\Geode>
#include<osgDB\Registry>
#include<osgDB\ReadFile>
#include<osgGA\TrackballManipulator>
#include<osgViewer\Viewer> //创建一条路径
osg::AnimationPath* createAnimationPath(const osg::Vec3& center, float radius, double looptime)
{
//路径实体
osg::AnimationPath* animationPath = new osg::AnimationPath;
//设置循环模式为LOOP
animationPath->setLoopMode(osg::AnimationPath::LOOP);
//设置关键点数
int numSamples = 40;
float yaw = 0.0f;
float yaw_delta = 2.0f*osg::PI / ((float)numSamples - 1.0f);
float roll = osg::inDegrees(30.0f);
//设置时间间隔
double time = 0.0f;
double time_delta = looptime / (double)numSamples;
//插入关键点与时间以及旋转角度和位置
for (int i = 0; i < numSamples; ++i)
{
osg::Vec3 position(0, 0, 0);
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)));
//具体插入操作
animationPath->insert(time, osg::AnimationPath::ControlPoint(position, rotation));
yaw += yaw_delta;
time += time_delta;
}
return animationPath;
}
//创建移动模型
osg::Node* createMovingModel(const osg::Vec3& center, float radius)
{
float animationLength = 10.0f;
//创建的路径
osg::AnimationPath* animationPath = createAnimationPath(center, radius, animationLength);
osg::Group* model = new osg::Group;
//读取模型,并隐藏它下面的第一个节点
osg::Node* fountain = osgDB::readNodeFile("fountain.osgt");
fountain->asGroup()->getChild(0)->setNodeMask(0);
//如果读取成功,则更新赋予它的路径
if (fountain)
{
osg::PositionAttitudeTransform* xform = new osg::PositionAttitudeTransform;
//设置更新回调
xform->setUpdateCallback(new osg::AnimationPathCallback(animationPath, 0.0, 1.0));
//加入子模型节点
xform->addChild(fountain);
model->addChild(xform);
}
return model;
}
//创建模型
osg::Node* createModel()
{
osg::Vec3 center(0.0f, 0.0f, 0.0f);
float radius = 1.0f;
osg::Group* root = new osg::Group;
//创建移动的节点,以radius为半径转圈
osg::Node* movingModel = createMovingModel(center, radius*0.8f); //把节点加入到root中并返回
root->addChild(movingModel);
return root;
}
//主函数
int main(int argc, char** argv)
{
osgViewer::Viewer viewer;
//创建模型
osg::Node* model = createModel();
viewer.setSceneData(model);
viewer.setCameraManipulator(new osgGA::TrackballManipulator());
viewer.realize();
return viewer.run();
}

结果图:

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. thinkphp 5.1/tp5.1 route路由bug

    tp5.1下面RuleItem类中,match方法. 如果同一个控制器下面,写了两个路由,后一个路由比包含前一个路由,则访问后一个路由地址的时候,会跳转到前面定义的那个路由

  2. Hexo博客部署到个人服务器

    本文跳过阿里云创建git仓库.hexo部署到github的步骤,有需要的可以移步下面博客地址查看: 在阿里云服务器上创建git远程仓库 使用Hexo建立博客 一.服务器相关配置 本文使用hexo在本地 ...

  3. 【NXP开发板应用—智能插排】3.驱动GPIO点亮外接LED

    [前言] 首先感谢深圳市米尔科技有限公司举办的这次活动并予以本人参加这次活动的机会,以往接触过嵌入式,但那都是皮毛,最多刷个系统之类的,可以说对于嵌入式系统开发这件事情是相当非常陌生的,这次活动为我提 ...

  4. 查看Pyton的版本号和32/64位平台

    怎么查看Python的版本号?使用的Python是32位还是64位的?用以下两条Python 指令就可以知道. 方法1:通过Python代码查看 import platform import sys ...

  5. [转]Visual C++ 和 C++ 有什么区别?

    注:本篇内容转载与网络,方便自己学习,如有侵权请您联系我删除,谢谢. 有位同学问我“Visual C++和C++有什么区别?”,这的确是初学者会感到困惑的问题,比较常见.除此之外,还有“先学C++好, ...

  6. python教程(二)·循环语句

    计算机程序中常常需要重复执行某些语句,我们总不能将同一语句写上百遍吧?所以在python中,当然其它计算机语言也是,有一种语句可以重复执行相同的操作,这种语句就是 "循环语句",而 ...

  7. 十分钟搭建和使用ELK日志分析系统

    前言 为满足研发可视化查看测试环境日志的目的,准备采用EK+filebeat实现日志可视化(ElasticSearch+Kibana+Filebeat).题目为“十分钟搭建和使用ELK日志分析系统”听 ...

  8. Prism for WPF 搭建一个简单的模块化开发框架(一)

    原文:Prism for WPF 搭建一个简单的模块化开发框架(一) 最近闲来无事又想搞搞WPF..... 做个框架吧,可能又是半途而废....总是坚持不下来 不废话了, 先看一下工程结构 布局大概是 ...

  9. 从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator-更新至Prism7.1

    原文:从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator-更新至Prism7.1 事件聚合器EventAggregator [7.1updated]除了app部分,没 ...

  10. 提权基础-----mysql-udf提权

    1.总结关于udf提权方法 通过弱口令,爆破,网站配置文件等方式得到mysql数据库帐号密码,---还要能外连 (1).将udf.dll代码的16进制数声明给my_udf_a变量 set @my_ud ...