OSG 飞机路径动画控制
注:摘自《三维渲染引擎编程指南》
本文实现一个飞机,在地图上空盘旋,读者可以根据自己需要进行更改;
代码如下:

//2017. 8 .29
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osg/Math>
#include <osg/AnimationPath>
#include <osg/MatrixTransform>
#include <osg/PositionAttitudeTransform>#include <osgDB/ReadFile>
#include <osgDB/WriteFile>#include <osgUtil/Optimizer>//路径动画控制事件
class AnimationEventHandler : public osgGA::GUIEventHandler
{
public:AnimationEventHandler(osgViewer::Viewer &vr):viewer(vr){}//事件处理virtual bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &){//创建动画更新回调对象osg::ref_ptr<osg::AnimationPathCallback> animationPathCallback = new osg::AnimationPathCallback();osg::ref_ptr<osg::Group> group = dynamic_cast<osg::Group*>(viewer.getSceneData());//取得节点的动画属性animationPathCallback = dynamic_cast<osg::AnimationPathCallback*>(group->getChild(0)->getUpdateCallback());switch(ea.getEventType()){case (osgGA::GUIEventAdapter::KEYDOWN):{if (ea.getKey() == 'p'){//暂停animationPathCallback->setPause(true);return true;}if (ea.getKey() == 'k'){//开始animationPathCallback->setPause(false);return true;}if (ea.getKey() == 'r'){//重新开始animationPathCallback->reset();return true;}break;}default:break;}return false;}public:osgViewer::Viewer &viewer;
};//创建路径
osg::ref_ptr<osg::AnimationPath> creatAnimationPath(osg::Vec3 ¢er, float radius, float looptime)
{//创建一个Path对象osg::ref_ptr<osg::AnimationPath> animationPath = new osg::AnimationPath();//设置动画模式为循环(LOOP)//LOOP:循环  SWING:单摆   NO_LOOPING:不循环animationPath->setLoopMode(osg::AnimationPath::LOOP);//关键点数int numPoint = 60;//每次偏移角度float yaw = 0.0f;float yaw_delta = 2.0 * osg::PI / ((float)(numPoint - 1.0f));//倾斜角度float roll = osg::inDegrees(45.0f);//时间偏移float time = 0.0f;float time_delta = looptime / ((float)(numPoint));for (int i = 0; i < numPoint; i++){//关键点位置osg::Vec3 position(center + osg::Vec3(sinf(yaw) * radius, cosf(yaw) * radius,0.0f));//关键点角度osg::Quat rotation(osg::Quat(roll, osg::Vec3(0.0, 1.0, 0.0)) * osg::Quat( -(yaw + osg::inDegrees(90.f)), osg::Vec3(0.0, 0.0, 1.0)));//插入Path,把关键点与时间压入形成PathanimationPath->insert(time, osg::AnimationPath::ControlPoint(position, rotation));yaw += yaw_delta;time += time_delta;}//返回Pathreturn animationPath.get();
}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> cessna = osgDB::readNodeFile("cessna.osg");//读入地形模型osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("lz.osg");//得到包围盒,来确定动画旋转中心const osg::BoundingSphere &bs = cessna->getBound();osg::Vec3 position = bs.center() + osg::Vec3(0.0f, 0.0f, 200.f);//缩放比例,如果比例不当,模型会看不见float size = 100.0f / bs.radius() * 0.3f;//创建路径osg::ref_ptr<osg::AnimationPath> animationPath = new osg::AnimationPath();animationPath = creatAnimationPath(position, 200.0f, 10.0f);osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform();//OSG确保只有STATIC数据可以进行图形渲染mt->setMatrix(osg::Matrix::translate( -bs.center()) * osg::Matrix::scale(size, size, size) * osg::Matrix::rotate(osg::inDegrees(-180.0f), 0.0f,0.0f,1.0f));mt->addChild(cessna.get());osg::ref_ptr<osg::PositionAttitudeTransform> pat = new osg::PositionAttitudeTransform();//设置更新回调pat->setUpdateCallback(new osg::AnimationPathCallback(animationPath.get(), 0.0f, 1.0f));pat->addChild(mt.get());root->addChild(pat.get());root->addChild(node.get());//优化场景数据osgUtil::Optimizer optimizer;optimizer.optimize(root.get());viewer->setSceneData(root.get());//添加路径动画viewer->addEventHandler(new AnimationEventHandler(*(viewer.get())));viewer->realize();viewer->run();return 0;}

OSG 飞机路径动画控制相关推荐

  1. OSG 路径动画学习

    1.动画的实现方法: 要点1).通过设置回调函数使得节点按路径移动.这个路径回调只能是添加到osg::PositionAttitudeTransform(位置变换节点)或者osg::MatrixTra ...

  2. osgEarth AnimationPath路径动画

    目录 飞机飞行实例 路径动画暂停 路径动画继续 osgEarth 视角跟踪飞机飞行 相机跟踪飞机移动 视角移动到特定地点 osg::AnimationPath 封装了一个随时间变化的过程,可以用来更新 ...

  3. WPF中的动画——(五)路径动画

    路径动画是一种专门用于将对象按照指定的Path移动的动画,虽然我们也可以通过控制动画的旋转和偏移实现对象的移动,但路径动画更专业,它的实现更加简洁明了. 路径动画中最常用的是MatrixAnimati ...

  4. Cinemachine教程 | Unity中如何制作路径动画?

    摘要:在Unity中制作路径动画是有挺多方式的,基于Cinemachine的Dolly Path是一个简单便捷的方法,咱们来快速的学习一下吧! 洪流学堂,让你快人几步.你好,我是跟着大智(VX: zh ...

  5. 引导路径动画 (1)

    引导路径动画(1) 在前面几节里,我们已经给大家介绍了一些动画效果,如飞机从山峰上飞过.辉光掠过文字等等,不知你注意到没有,这些动画的运动轨迹都是直线的,可是在生活中,有很多运动是弧线或不规则的,如月 ...

  6. jpg转svg文字路径动画

    最近对svg动画很感兴趣,用svg+css可以实现一些让人眼前一亮的效果,Ant Design 官网首屏就出现了svg动画,coding 官网首页也出现svg动画,也许在非前端人员看来效果很普通,但是 ...

  7. canvas绘制折线路径动画

    最近有读者加我微信咨询这个问题: 其中的效果是一个折线路径动画效果,如下图所示: 要实现以上路径动画,一般可以使用svg的动画功能.或者使用canvas绘制,结合路径数学计算来实现. 如果用canva ...

  8. WPF随笔(九)--使用路径动画模拟管道流体流向

    WPF的一大特性就的动画系统,使用动画能够实现很多在WinForm很难实现的效果.最近在网上偶然看到大神用WPF动画实现对象沿特定路径正向或反向移动的效果,就想参考着自己试一试. 1.简单路径动画 先 ...

  9. neatdm路径_trapcode tao插件下载-AE三维物体路径动画插件(Trapcode TAO) 2.1.2 官方最新版 - 河东下载站...

    Trapcode TAO是一款功能强大的AE三维物体路径动画插件,该软件集合了Trapcode 3D Stroke和Mir几乎所有的精华功能,为用户提供了一个强大的多功能视频处理插件,该软件能够实现l ...

最新文章

  1. 基于深度学习的特征提取和匹配方法介绍
  2. win7 php mysql扩展名_Win7 iis php mysql 开发环境配置(详细)
  3. canvas中的碰撞检测笔记
  4. axios请求接口http_Vue使用Axios实现http请求以及解决跨域问题
  5. 如何检测出定制服务器中预装的恶意软件?
  6. 国际计算机语言,国际标准的5种PLC编程语言简介
  7. 你发这些什么目的_吸引女生冷知识:朋友圈发照片的“潜规则”,男生要懂
  8. 【javascript权威指南】类型转换
  9. spirng cloud docker部署
  10. 分库分表解决方案之ShardingSphere
  11. 引用dll文件要复制到本地
  12. 手机中如何处理Excel格式转换PDF格式
  13. 2013年计算机试题(四),2013年计算机一级考试试题(精简版):第四套
  14. js实现跟浏览器 ctrl+f 一样的效果
  15. c语言勾股数编程,C++勾股数公式讲解
  16. Notepad++增加读取二进制文件的功能——HexEditor的所有
  17. sso单点登录与Jsonp
  18. C语言(算术、左移、赋值、位、sizeof计算大小、取反~、强制转换、条件)操作符..
  19. scrollTop和scrollHeight属性
  20. html搜索框判断跳转,搜索关键字:ajax实现;点击搜索到的会添加到搜索框内,点击搜索跳转页面;...

热门文章

  1. 昆仑通态MCGS与西门子V20变频器通讯程序 西门子变频器通讯
  2. Win11一键还原win10右键菜单
  3. x战警 天启高清完整版下载
  4. springboot pdf模板打印
  5. x86指令集_当年基于动态翻译x86的企业倒闭了,龙芯为什么还要坚持
  6. 江南爱窗帘十大品牌 窗帘怎么搭配更有情调
  7. 海内外技术人们“看”音视频技术的未来
  8. 12bit,24bit,32bit颜色
  9. python3 中怎么把类似这样的'\xe5\xae\x9d\xe9\xb8\xa1\xe5\xb8\x82'转换成汉字输出
  10. 【牛客】从青铜到王者01,java架构师成长直通车吾爱破解