osg示例解析之osganimationsolid(1)

实例4:osganimationsolid例子实现关键帧插值动画(OSG程序开发实例集) 该例子实现关键帧动画功能,主要由五部分组成: 1)场景组织 2) 阅读详情
  • 简介

osganimationsolid示例主要使用了osgAnimation中的动画管理器来管理多个动画Animtion,这其中还涉及到一些其他的概念,比如动画中包含了一个或者多个频道Channel,频道设置作用对象setTargetName等等。

  • 创建坐标系

osg::ref_ptr<osg::Geode> createAxis()
{
    osg::ref_ptr<osg::Geode> geode (new osg::Geode());
    osg::ref_ptr<osg::Geometry> geometry (new osg::Geometry());

    //设置三个坐标轴线坐标值
	osg::ref_ptr<osg::Vec3Array> vertices (new osg::Vec3Array());
    vertices->push_back (osg::Vec3 ( 0.0, 0.0, 0.0));
    vertices->push_back (osg::Vec3 ( 10.0, 0.0, 0.0));
    vertices->push_back (osg::Vec3 ( 0.0, 0.0, 0.0));
    vertices->push_back (osg::Vec3 ( 0.0, 10.0, 0.0));
    vertices->push_back (osg::Vec3 ( 0.0, 0.0, 0.0));
    vertices->push_back (osg::Vec3 ( 0.0, 0.0, 10.0));
    geometry->setVertexArray (vertices.get());

    //设置三个坐标轴线的颜色
	osg::ref_ptr<osg::Vec4Array> colors (new osg::Vec4Array());
    colors->push_back (osg::Vec4 (1.0f, 0.0f, 0.0f, 1.0f));
    colors->push_back (osg::Vec4 (1.0f, 0.0f, 0.0f, 1.0f));
    colors->push_back (osg::Vec4 (0.0f, 1.0f, 0.0f, 1.0f));
    colors->push_back (osg::Vec4 (0.0f, 1.0f, 0.0f, 1.0f));
    colors->push_back (osg::Vec4 (0.0f, 0.0f, 1.0f, 1.0f));
    colors->push_back (osg::Vec4 (0.0f, 0.0f, 1.0f, 1.0f));
	
    geometry->setColorArray (colors.get(), osg::Array::BIND_PER_VERTEX);
    geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES,0,6));
    geode->addDrawable( geometry.get() );
	//关闭光照
    geode->getOrCreateStateSet()->setMode(GL_LIGHTING, false);
    return geode;
}
创建坐标系的代码很简单,设置顶点、颜色数组并以线段(GL_LINES)的方式绘制

  • 创建作用对象

    osgAnimation::UpdateMatrixTransform* updatecb = new osgAnimation::UpdateMatrixTransform("AnimatedCallback");
	//设置两个变换平移和旋转
    updatecb->getStackedTransforms().push_back(new osgAnimation::StackedTranslateElement("osition"));
    updatecb->getStackedTransforms().push_back(new osgAnimation::StackedRotateAxisElement("euler",osg::Vec3(1,0,0),0));
 
    trans->setUpdateCallback(updatecb);
创建作用对象,设置它的名称必须与Animation中Channel的名字相对应,也就是设置Channel的setTargetName和UpdateMatrixTransform的名称一致,设置Channel中的Name和UpdateMatrixTransform中数组元素的名称一致,也就是设置Channel的名称为"osition"和"euler",这样才能正确创建执行对象。

  • 创建动画频道

    osgAnimation::Vec3LinearChannel* channelAnimation1 = new osgAnimation::Vec3LinearChannel;
    channelAnimation1->setTargetName("AnimatedCallback");
    channelAnimation1->setName("osition");
    channelAnimation1->getOrCreateSampler()->getOrCreateKeyframeContainer()->push_back(osgAnimation::Vec3Keyframe(0, osg::Vec3(0,0,0)));
    channelAnimation1->getOrCreateSampler()->getOrCreateKeyframeContainer()->push_back(osgAnimation::Vec3Keyframe(2, osg::Vec3(1,1,0)));
    osgAnimation::Animation* anim1 = new osgAnimation::Animation;
    anim1->addChannel(channelAnimation1);
    anim1->setPlayMode(osgAnimation::Animation::PPONG);

    osgAnimation::FloatLinearChannel* channelAnimation2 = new osgAnimation::FloatLinearChannel;
    channelAnimation2->setTargetName("AnimatedCallback");
    channelAnimation2->setName("euler");
    channelAnimation2->getOrCreateSampler()->getOrCreateKeyframeContainer()->push_back(osgAnimation::FloatKeyframe(0, 0));
    channelAnimation2->getOrCreateSampler()->getOrCreateKeyframeContainer()->push_back(osgAnimation::FloatKeyframe(1.5, 2*osg::PI));
    osgAnimation::Animation* anim2 = new osgAnimation::Animation;
    anim2->addChannel(channelAnimation2);
    anim2->setPlayMode(osgAnimation::Animation::LOOP);
动画频道创建它的TargetName设置和作用对象一致,另外它的Name也需要和作用对象数组中元素的名称一致

  • 创建管理器

    osg::Group* grp = new osg::Group;
	//BasicAnimationManager必须设置为需要动画子场景(在这个例子中是立方体)的父节点
	//因为BasicAnimationManager会遍历它的子节点并设置子节点中的执行对象Target
    osgAnimation::BasicAnimationManager* mng = new osgAnimation::BasicAnimationManager();
    grp->setUpdateCallback(mng);
    grp->addChild(root);
管理器必须设置为需要动画场景的父节点的UpdateCallback

最后注册动画、播放动画,代码如下:

    mng->registerAnimation(anim1);
    mng->registerAnimation(anim2);

    mng->playAnimation(anim1);
    mng->playAnimation(anim2);

思考:我们将创建作用对象的两个元素修改一下位置会怎么样?也就是将源码修改为:

    updatecb->getStackedTransforms().push_back(new osgAnimation::StackedRotateAxisElement("euler",osg::Vec3(1,0,0),0));
    updatecb->getStackedTransforms().push_back(new osgAnimation::StackedTranslateElement("osition"));
运行之后发现立方体运行的轨迹完全变换了,这是什么原因呢?从字面意思看StackedTransform,也就是类似于栈一样LIFO(后进先出)的模式,因此如果是例子中先平移后旋转,那么更新矩阵就等于M = Mr(旋转) * Mt(平移),而修改之后就变成先平移之后旋转,M=Mt(平移) * Mr(旋转),矩阵没有交换律,因此计算的结果就大相径庭了。




OSG动画开发步骤学习 一个简单的模型节点变换动画过程如下: 1.定义一些变换位置 2.定义动画关键帧,包含了时间,位置,旋转等数据,这里可以设置受变化作用的节点 3.给节点设置一个动画管理器,这个动画管理器是继承自Osg::NodeCallback,所以其实是个Callback类. 4.把定义的关键帧的数据,送给动画管理器 5.创建一个等待变化的节点 6.把变化节点的顶点数据与给出的变换位置进行映射,此时定义的是这些节点中每个顶点的变化方式 7.开始动画 立即下载

相关推荐

osg关键帧动画播放控制

对fbx中的关键帧动画进行播放控制, Osg中使用的思路:1、用osg的fbx插件读取fbx到osg模型 2、解构得到的osg模型,将模型分解成一个个的关键帧(osgAnimation::KeyFrame), 3、重组关键帧得到需要的动画 3.1 重组关键帧时,要确定新动画在原动画的位置 3.2 根据开始时间和结束时间选取关键帧, 3.3 将关键帧压入通道,将通道赋给动画, 3.4 将动画注册到新的动画管理器中 3.5 将新的动画管理器设置为场景的新的更新回调。 4、如有必要,可以写出为osg格式的数据osgdb::write()

osgAnimation之动画管理器

简介 在上一节osgAnimation之作用对象一文中的UpdateMatrixTransform示例里面,我们自己通过添加UpdateCallback来实现动画,事实上osgAnimation已经为我们提供了基本的动画处理类BasicAnimationManager,这个类继承自NodeCallback,负责多个动画对象的管理,现在我们看看它究竟是如何实现的。 动画管理器

Frank的专栏 2482

Isaac Sim 6 利用Replicator实现高效语义分割与实例分割(实践指南5.10)

本文详细介绍了如何利用Isaac Sim 6的Replicator工具高效生成语义分割和实例分割数据集。通过虚拟环境自动标注,效率提升20倍以上,特别适用于农业机器人等计算机视觉项目。文章包含环境配置、场景构建、批量标注技巧及实例分割处理等实战指南,帮助开发者快速掌握合成数据生成技术。

weixin_42526415的博客 266

osgAnimation(三):动画种类介绍及实现流程

osg动画种类 osg中的动画主要的有五种分别是轨迹动画,序列动画,骨骼动画,变形动画和粒子动画。甚至自己也可以通过重写frame()函数或者说利用各种回调函数来实现动画效果。 轨迹动画 轨迹动画主要是指的osg::AnimationPathUpdateCallBack 这个回调类,其本质是一个随时间变化的4*4矩阵序列,用以控制刚体在轨迹上以给定姿态运动。 回调类的构造函数参数是轨迹osg::AnimationPath,轨迹由若干个控制点进行控制,一个控制点就是一个变换矩阵(控制点有很多种构造函数

h1063135843的博客 4520

【机械视觉】C#+VisionPro实战:位深图(CogImage8Grey)与Bitmap互转技巧及工业检测应用

本文详细介绍了在工业检测中如何使用C#和VisionPro实现位深图(CogImage8Grey)与Bitmap的高效互转技巧。通过实战代码示例和工业应用案例,帮助开发者解决图像处理中的常见问题,提升检测精度和系统性能,适用于半导体、汽车零部件等高精度检测场景。

weixin_29250573的博客 186

告别盲目调参:手把手教你用RKISP2.x Tuner理解AWB、AE、NR等核心模块

本文详细介绍了如何使用RKISP2.x Tuner工具进行ISP调试,重点解析AWB、AE、NR等核心模块的调参技巧。通过RV1126平台的实际操作演示,帮助工程师快速掌握可视化对比实验方法,告别盲目调参,提升图像信号处理效率。

weixin_30300225的博客 392

OSG动画库Animation解析(三)

本文主要介绍动画中其他的一些内容,主要包括权、优先级、以及动画变换中的顺序等内容。

Frank的专栏 2946

Information Fusion投稿避坑指南:从初稿到返修的完整流程解析(附模板下载)

本文详细解析了向Information Fusion投稿的全流程,从初稿准备到返修策略,涵盖了22个关键细节。特别强调了投稿前的隐形门槛、LaTeX模板的字体陷阱、图表规范要求以及返修回复的进阶技巧,帮助研究者避免常见错误,提升稿件接受率。附有实用模板下载,助力学术写作效率提升。

tgb34567890的博客 1420

OSG例子简介

OSG中的示例程序简介 分类: OSG2011-05-21 10:07510人阅读评论(0)举报 1.example_osganimate 一)演示了路径动画的使用(AnimationPath、AnimationPathCallback),路径动画回调可以作用在Camera、CameraView、MatrixTransform、 PositionAttitudeTransf

Scarlett_OHara的博客 2529

别再为H桥烧MOS管发愁了!手把手教你用IR2104搭建稳定电机驱动(附自举电路详解)

本文详细解析了使用IR2104半桥驱动芯片构建高可靠H桥电机驱动电路的全过程。从芯片内部架构、自举电路原理到PCB布局技巧和实战调试方法,帮助工程师彻底解决MOS管烧毁问题。重点讲解了自举电容选型、死区时间控制等关键设计要点,并附有示波器实测波形分析,是电机驱动设计的实用指南。

我的博客 739

QOpenGL入门教程(二)—— 第一个QOpenGLWidget程序

终于到了实际操作的环节了,这一章我们要做的是: 创建OpenGL窗口 创建并编写着色器程序 为着色器程序装配顶点数据 启动渲染管线进行绘图 第一步:创建新项目 首先,我们使用Qt创建一个常规的QWidget项目,建议不要勾选ui设计器(个人习惯,笔者不太习惯于使用ui来设计) 第二步:创建QOpenGLWidget并实现三个虚函数 QOpenGLWidget Qt5.4之前,Qt可以通过一个QGLWidget类来创建OpenGL窗口,但由于opengl的发展,在5.4版本的时候,Qt提供

ItaLink 1万+

osganimationsolid例子

本例子中添加了两个动画,一个是平移动画,一个是旋转动画,相对于之前的例子比较简单。 创建一个坐标轴、一个正方体, MatrixTransform中添加了一个osgAnimation::UpdateMatrixTransform* updatecb = new osgAnimation::UpdateMatrixTransform("AnimatedCallback"); UpdateMa

yungis的专栏 1291

【软考】系统集成项目管理工程师(一)信息化知识

软考中级——系统集成项目管理工程师备考干货第一章:信息化知识。

商务合作 | 共同学习 | 携手共进 9万+

osg开关门

/* -*-c++-*- OpenSceneGraph Cookbook       * Chapter 5 Recipe 1       * Author: Wang Rui       */              #include       #include       #include       #include       #include      

L_Andy的专栏 713

损失函数大汇总(三十八)(AUCPR Loss附公式推导与代码)

本文系统介绍了AUCPR Loss的原理与应用。针对不平衡分类任务中AUC指标不够敏感的问题,提出通过优化PR曲线面积(AUCPR)来提升模型性能。文章详细推导了AUCPR的可微近似实现:首先用sigmoid函数软化阈值判断,构造可微的TP/FP/FN计数;然后基于软Precision和Recall计算近似PR曲线面积;最后通过数值积分得到可优化的损失函数。特别讨论了温度参数τ对训练稳定性的影响,并比较了AUCPR与AUC、AP等指标的异同。该方法适用于医学筛查、欺诈检测等极端不平衡场景,能更准确反映模型对

悦学共鸣,温柔以待,汇聚光芒,共同成长 441

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

osg示例解析之osganimationskinning

转载 原文网址 http://blog.youkuaiyun.com/csxiaoshui/article/details/22814373

sunshine_flyeah的专栏 889

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

OSG动画库Animation解析(一)

本文主要介绍osgAnimation中关键帧、插值器、采样器、频道和动画等概念,以及它们的使用方式和原理

Frank的专栏 8968

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

osg解析系列-[osg::osgAnimation]-路径运动动画/变形动画/骨骼动画/纹理动画 4

【代码】M23.11.W4[osg::osgAnimation]-路径运动动画/变形动画/骨骼动画/纹理动画 4。

qq_42531872的博客 541

osg示例解析之osganimationskinning(1)

简介 osgAnimationSkinning这个示例主要使用了osgAnimation中的骨骼蒙皮动画,关于骨骼蒙皮动画的介绍可以参考Skinned Mesh原理解析和一个最简单的实现示例这篇优快云的博客,里面用Glut实现了一个简单的蒙皮动画,整篇文章对骨骼动画和蒙皮进行了详尽的阐述,相信读完之后可以对骨骼动画有更深的理解。 示例 源码中createAxis创建了一个坐

Frank的专栏 4394

osgAnimation之动画基础篇

简介 osgAnimation是osg库中提供场景动画效果的一个类库,它为我们提供了许多与场景动画相关的类,比如关键帧、插值、采样、频道、骨骼动画、材质变化等。本课就对osgAnimation库中的基础类进行一些解析。以下都是我个人学习过程中的一些记录和体会,方便以后自己复习之用。 开始 Keyframe 对应文件 osgAnimation/keyframe

Frank的专栏 6190

OSG动画库Animation解析(二)

本文继续(一)中的内容,讨论了osgAnimation中的Target和UpdateMatrixTransform以及osgAnimation中对动画的管理

Frank的专栏 2961

osgAnimation之作用对象

简介 在前文osgAnimation之动画基础篇中介绍了osgAnimation中的几个基础的类元素,这其中Channel频道类集成了关键帧、插值算法、采样器、执行对象(Target),构成了动画的基本要素。如何将这些要素应用到场景动画之中呢,我们查看osgAnimation::Channel,发现它里面有这样两个成员函数: const std::string& get

Frank的专栏 4033

osg 在场景中绘制坐标轴(xyz)

//x y z font_size osg::Geode* makeCoordinate(float a_x,float a_y,float a_z,float font_size) { osg::ref_ptr<osg::Sphere> pSphereShape = new osg::Sphere(osg::Vec3(0, 0, 0), 1.0f); os...

weixin_30770783的博客 1579

OSG 路径动画学习

1、动画的实现方法: 通过设置回调函数使得节点实现按

TheDeaf的专栏 4723

【GUI-OpenSceneGraph】OSG动画第一个示例

#include <iostream> #include <osg/Geometry> #include <osg/Shape> #include <osg/ShapeDrawable> #include <osgViewer/Viewer> #include <osgGA/TrackballManipulator> #include <osg/MatrixTransform> #include <osgAnima.

bear_miao的博客 662
上一篇: osgAnimation之动画管理器
下一篇: osgAnimation之作用对象
csxiaoshui
博客等级 码龄16年 873粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值