osg示例解析之osganimationmorph(1)

基于VS平台的MFC变形动画程序实例 本程序是基于VS MFC的一个变形动画程序,旨在生成一幅图片到另一幅图片的渐变过程。 立即下载
  • 简介

本课主要演示了osgAnimation中的变形动画,变形动画通常也称为逐顶点动画(Per-vertex Animation),是一种三维动画的表现形式。它对计算机的运算资源的消耗很大,通常以每帧计算和应用4000~9000个顶点的位置变化为宜,否则系统难以承受其他场景对象的更新和渲染工作。变形动画在osgAnimation中通过MorphGeometry以及UpdateMorph来实现,具体的实现可以参考我的另一篇文章osgAnimation之作用对象中的相关介绍。

  • 示例

该例子首先实现了一个NodeVisitor,用来寻找Geode节点中的Geometry对象:

struct GeometryFinder : public osg::NodeVisitor
{
    osg::ref_ptr<osg::Geometry> _geom;
    GeometryFinder() : osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN) {}
    void apply(osg::Geode& geode) 
    {
        if (_geom.valid())
            return;
        for (unsigned int i = 0; i < geode.getNumDrawables(); i++) 
        {
            osg::Geometry* geom = dynamic_cast<osg::Geometry*>(geode.getDrawable(i));
            if (geom) {
                _geom = geom;
                return;
            }
        }
    }
};
它会保存Geode中的第一个Geometry节点,之后的函数用到了这个访问器

osg::ref_ptr<osg::Geometry> getShape(const std::string& name)
{
    osg::ref_ptr<osg::Node> shape0 = osgDB::readNodeFile(name);
    if (shape0)
    {
        GeometryFinder finder;
        shape0->accept(finder);
        return finder._geom;
    }
    else
    {
        return NULL;
    }
}
返回文件name中第一个的Geometry节点

下面我们看看主函数中的实现过程,应该来说还是比较清晰的:

  • 首先创建频道

    osgAnimation::Animation* animation = new osgAnimation::Animation;
    osgAnimation::FloatLinearChannel* channel0 = new osgAnimation::FloatLinearChannel;
    channel0->getOrCreateSampler()->getOrCreateKeyframeContainer()->push_back(osgAnimation::FloatKeyframe(0,0.0));
    channel0->getOrCreateSampler()->getOrCreateKeyframeContainer()->push_back(osgAnimation::FloatKeyframe(1,1.0));
    channel0->setTargetName("MorphNodeCallback");
    channel0->setName("0");
这里需要注意频道的Name要设置为0、1、2这样的非负整数字符串,让它们和添加到MorphGeometry中的geometry对象对应。此外channel的targetname要和UpdateMorph的名称一样,这样在链接的时候才能成功。关于频道的设置就这两点需要注意

  • 其次创建动画和动画管理器

    animation->addChannel(channel0);
    animation->setName("Morph");
    animation->computeDuration();
    animation->setPlayMode(osgAnimation::Animation::PPONG);
    osgAnimation::BasicAnimationManager* bam = new osgAnimation::BasicAnimationManager;
    bam->registerAnimation(animation);
动画对象将频道添加到它里面,动画管理器一样还是需要在Geode节点之上(是Geode的父节点),也就是保证进入UpdateMorph回调之前先进入动画管理器这个回调中

  • 再次 创建需要变形的几何体和目标几何体

    osg::ref_ptr<osg::Geometry> geom0 = getShape("morphtarget_shape0.osg");
    if (!geom0) {
        std::cerr << "can't read morphtarget_shape0.osg" << std::endl;
        return 0;
    }

    osg::ref_ptr<osg::Geometry> geom1 = getShape("morphtarget_shape1.osg");
    if (!geom1) {
        std::cerr << "can't read morphtarget_shape1.osg" << std::endl;
        return 0;
    }

    //原始形状
    osgAnimation::MorphGeometry* morph = new osgAnimation::MorphGeometry(*geom0);
   //需要变形的形状添加到morph之中,可以是多个,结果将按权重加成
    morph->addMorphTarget(geom1.get());

  • 最后 将UpdateMorph添加到Geode之中

    osg::Geode* geode = new osg::Geode;
    geode->addDrawable(morph);
    geode->addUpdateCallback(new osgAnimation::UpdateMorph("MorphNodeCallback"));

这样保证在进入MorphGeometry的Drawable更新回调之前先进入Geode的回调中更新几何体的权值,保证后续顶点的计算用到频道里面最新插值出的权值。

运行结果:



写在后面:在后续的osgNeHe课程中Lesson25会根据顶点进行变形,可以参考本课的实现利用osgAnimation库来实现,在实现过程中我遇到以下的问题:

当绘制的几何体为osg::PrimitiveSet::POINTS时程序会崩溃,描述和osgChina中的帖子类似。后来经过查看发现是由于没有NormalArray导致的问题,解决方法是申请一个法线向量的数组,随便设置一下添加到Geometry就可以解决这个问题了。这可能是osgAnimation代码中的一个Bug,osgAnimation要求必须有NormalArray。




Morph和关节动画概述,骨骼蒙皮动画详解+代码 讲述骨骼动画的资料很多,但大部分都是针对DX8或DX9的SkinnedMesh进行讲解。我觉得对于骨骼动画初学者增加了不必要的负担,还没有理解骨骼动画的实质就已被DX复杂的架构搞得晕头转向了。这篇文章把注意力集中在骨骼动画的基本组成结构和原理上,并实现了一个最简单纯手工的自定义骨骼动画例子帮助理解(使用最简单的OpenGL指令,甚至没有使用矩阵)。这篇文章在我学习理解骨骼动画的过程中逐步完善,是对这个技术的理解总结,属于学习笔记。 立即下载

相关推荐

osg太阳系三维演示程序

一个经典的osg程序,各种文字、三维动画的实现,从读取一个简单的模型到矩阵变换,很好的模仿了太阳系星球的运动规律,为数不多的代码,相信你一定可以看懂!(运行程序需要先保证osg已经安装到机器上)

9.3.4 变形体动画之对折硬纸

#include <osgViewer/Viewer> #include <osg/Node> #include <osg/Geometry> #include <osg/Geode> #include <osg/Group> #include <osg/AutoTransform> #include <osg/ProxyNode> #include <osgDB/ReadFile> #include <.

danshiming的博客 340

OSG Example(osg的例子程序代码)

编译好的osg的所有例子的原程序 希望对大家有用

OSG官方自带的例子程序简介

https://www.cnblogs.com/lyggqm/p/6222332.html

danshiming的博客 1541

Python+gensim【中文LDA】简洁模型

文章目录完整代码过程详解words_lsdictionarydictionary.doc2bow函数corpuslda 完整代码 from gensim import corpora, models import jieba.posseg as jp # 待分析文本集 text1 = '美国教练坦言,没输给中国女排,是输给了郎平' text2 = '中国女排世界排名第一?真实水平如何,听听巴西和美...

ArYe 2万+

基于GEC6818开发板的C/C++贪吃蛇小游戏

f.开始游戏(进入游戏,并没有马上开游戏,需要点击播放才能开始)2.相关宏,全局变量(可以根据自己需要进行修改)k.显示文字前的相关初始化。k.自定义font.h文件。1.需要的主要头文件。l.在开发板上显示字1。m.在开发板上显示字2。a.显示固定大小图片。h.线程1:获得坐标。

2301_77273301的博客 2133

OSG的相关的例子

一直都没有沉下心思好好研究OSG,这几天认真看书看代码,发现也不是很难。古人说得好:临渊羡鱼,不如退而结网。 下面列出站长可能会用到例子: 1、example_osganimationmorph 演示了利用osgAnimation::MorphGeometry实现几何体变形动画的方法。 2、example_osgclip 演示了osg::ClipNode(osg::Clip

Xiaok的专栏 3511

pi-coding-agent 完整详解

pi-coding-agent是一个由Mario Zechner开发的专业AI编程助手,基于Node.js和TypeScript构建。核心功能包括:1)多级思考模式(ThinkingLevel),从none到ultra控制推理深度;2)对话压缩(compaction)管理长对话记忆;3)WebSocket实时通信支持流式交互。该智能体支持代码生成、调试、重构等专业编程任务,采用AI Agent架构,具备工具调用和多轮记忆能力。项目结构通常包含server、agent、config等模块,可通过二次开发扩展功

大坡3D软件开发 2429

osganimationmorph例子

该例子演示了渐变动画。 应用osgAnimation::Animation库 这个库是专门的动画库,里面有几个关键的概念: KeyFrame关键帧,记录一个运动中指定时间的几个关键的值,根据这几个值其他的时间就可以进行插值运算。 由于关键帧值的类型不确定,可以是值、点、旋转等等等等,因此class TemplateKeyframe : public Keyframe实现一个模板类,用于不同

yungis的专栏 1448

2025华为od面试手撕代码【求字符串表达式结果】

2025华为od面试手撕代码【求字符串表达式结果】

MISAYAONE的博客 1353

使用C# HslCommunication库实现三菱PLC通信(含完整代码示例)

在工业自动化开发中,上位机与PLC的通信是关键环节。HslCommunication库是一个开源的.NET工业通信库,支持三菱、西门子、欧姆龙等多个品牌PLC的通信协议。本文将演示如何通过库实现C#程序与三菱PLC的通信,并提供完整的代码示例。

StevenChen的博客 2291

OSG例子简介

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

Scarlett_OHara的博客 2529

训练YOLOv11 | Pytorch和Pycharm的安装教程适用W11系统(附详细的系统变量添加过程)

根据你之前下载的版本选择对应的选项即可,然后复制底下的绿色代码到Anaconda的命令行输入即可(这里要在你安装的python环境里进行安装,例如我的环境名字是PyTorch,那么就是activate PyTorch里进行安装)然后同之前一样会加载一会,然后会询问我们是否下载配件,我们输入Y等待即可(下载过程中我们要确保网络通常如果有波动可能会下载失败)。类似于我的电脑是Windows11选择上面红框内的选项即可点击后即下载,(注意这里下载的是zip文件)下载完成后复制下面几个文件。

Snu77的博客 1万+

osgExample - osgAnimationMorph

例子代码 这个例子只分析一下流程,共三个步骤: 数据绑定 就是将要改变的数据与更新对象绑定起来,由更新对象负责“如何去改变数据”。 这个操作是在AnimationManagerBase第一次被回调的时候发生的。 BasicAnimationManager调用operator() 调用link(),将UpdateMorph与所有的Animation连接起来 link函数中用LinkV

asd131531的专栏 665

软考「系统规划与管理师(第2版)」通关全攻略(2026年下半年)

它考的是一个IT管理者能不能用体系化的语言,把"我们为什么要建这个系统→怎么规划→怎么管好服务→怎么合规"讲圆。所以备考的核心策略也很明确——教材建框架 → 真题磨考点 → 案例练结构 → 论文备好真实项目素材 → 机考练打字。按计划走,不贪全、不盲刷、不死背,稳稳把三科都推过45分那条线。祝你通关 🎯。

软件行业技术文化交流。 3048

静态编译Qt5源码(Kylin-Desktop-V10-SP1-2203-LoongArch64+qt5.15.16)

之前的文档,记录的是通用情况,本次笔者记录下Qt5的静态编译过程,供有需要的小伙伴参考使用的操作系统是Kylin-Desktop-V10-SP1-General-Release-2203-LoongArch64,处理器是龙芯3A5000,架构是loongarch。

aggs1990的专栏 1402

osg例子汇总--效果展示

osg例子

qq970767225的博客 2523

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

利用OSG进行几何球体绘制

核心逻辑就是顶点数组的计算,设半径长为r,原点为O,球体表面上的任意点P(x, y, z)有x = r * sin(a) * cos(b);其中a为OP向量与z轴的夹角,b为OP向量在xoy平面上的投影与x轴的夹角,以夹角a和夹角b为自变量(-90°

weixin_48106801的博客 1512

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

h1063135843的博客 4520

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

qq_42531872的博客 209

OSG中的示例程序简介

1.example_osganimate一)演示了路径动画的使用(AnimationPath、AnimationPathCallback),路径动画回调可以作用在Camera、CameraView、MatrixTransform、PositionAttitudeTransform等四种类型的节点上。二)演示了osgSim::OverlayNode的使用 2.example_osgani...

weixin_30367169的博客 1372

OSG动画库Animation解析(一)

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

Frank的专栏 8969

折弯机中OSG的柔体动画应用

变形体动画(Morph Target Animation),通常又称为逐顶点动画(Per-vertex Animation),是一种常见的三维动画表现形式。它记录了一系列顶点位置的坐标和偏移,并在动画运行的每一帧中将各个顶点移动到新的位置,形成持续、平滑的运动效果。变形体动画可以精确地表达一个物体,尤其是自然界生物体的运动和变形过程,比如板料的折弯运动等。物体中定义的可变化顶点数越多,变形体动画就会越复杂,可表达的意境就越丰富。例如人物的表情、动态的布料和衣物等都可以使用变形体动画来表达。    折弯机板料

mickal2002的专栏 1728

osgAnimation(二):动画切换/拼接 Swtich节点练习

上一篇讲了如何编译一个支持动画的fbx插件,以及读取显示。这里讲一下如何把两个文件的动画放在一起显示,效果如下: 跑步 挥砍 拼接的动画 问题的产生是这样子的,做fbx动画的人不熟练,明明是一个模型的两个动画,却偏偏要输出成两个单独的文件(如果是一个文件,直接切换AnimationList的动画就好了,就不需要用到Swtich了,当然重载动画节点的回调依然是有必要的)。要做到上面的效果基本思路是这样子的,用一个Swtich节.

h1063135843的博客 900

OSG求交器(一)面求交器PlaneIntersector

OSG求交器之平面求交器

Frank的专栏 1万+
上一篇: osgAnimation之作用对象
下一篇: 用OpenSceneGraph实现的NeHe OpenGL教程 - 第十八课
csxiaoshui
博客等级 码龄16年 873粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值