骨骼动画原理及简单实现

web前端入门到实战:纯CSS实现简单骨骼动画 1 背景 某天设计师来找我说,“这个心愿牌傻傻地挂在那不好看,加个动效呗,就左右摆动一下就行,很简单的!”,我一想,行呀,提升用户视觉体验,开搞。 十分钟后,????不对呀,这个左右摆动好假,不像现实中风吹的效果。 注:此处加快了动画的速度和摆动的幅度。 专门建立的学习Q-q-u-n ⑦⑧④-⑦⑧③-零①② 分享学习方法和需要注意的小细节,不停更新最新的教程和学习技巧(从零基础开始到WEB前端项目实战教程,学习工具,全栈开发学习路线以及规划) .animate-1 { animation: s 阅读详情


骨骼动画的含义,一句话,骨骼的朝向和位置,影响顶点的位置。

骨骼动画的计算方法,一句话,顶点在骨骼空间里的坐标,不受骨骼本身变化影响。

因此,我们只要先将顶点从模型空间变换到骨骼空间,在骨骼发生旋转位移后,再把骨骼空间的坐标变换回模型空间即可。

这方面的详细介绍已经有很多了,这里推荐

http://www.wazim.com/Collada_Tutorial_1.htm

这个向导从骨骼动画的原理,数据文件格式分析解析到实际绘制,都有比较清晰的说明。

这里还有一个翻译后的版本

http://blog.youkuaiyun.com/qyfcool/article/details/6775309


这篇教程里详细解释的内容,我这里就不重复了。下面介绍一些我照着文章一步步实现时碰到的问题。


1.关于bind pose的解释

不得不说,游戏界的术语有时还真是混乱。在《Game Engine Architecture》一书中,作者提到bind pose是指假设不考虑骨骼,直接渲染出来的模型形状(一般来讲是个两臂平身直立的造型,也被称为T-pose)。而在上面的向导里,同样的概念被称为modeling pose,而bind pose则是骨骼导致模型变化后的形状。不过从使用的collada dae文件里来看,顶点到骨骼空间的变换被称为INV_BIND_MATRIX,似乎还是《Game Engine Architecture》里的说法更靠谱一点。以下我所使用的bind pose,也特指书中的概念。


2.bind pose下骨骼的位置

想画出bind pose下joint的默认位置,但是发现collada dae文件里并没有直接提供这个矩阵。后来想到,既然INV_BIND_MATRIX可以将顶点从世界空间变换到joint空间,那么它的逆矩阵就是我这时需要的了。

3.joint矩阵的含义

joint矩阵是joint节点到父节点的空间转换矩阵。一般来说,每个joint在每一帧里都要提供一个变换矩阵。要注意在collada里,这个矩阵并不是相对于bind pose里joint的变化,不需要再乘以bind pose的joint矩阵。另外,在collada里,还有可能出现某个joint有个非joint类型的xml节点,节点里也有变换矩阵。要想得到正确的显示结果,父xml节点的这个变换矩阵是需要乘的。collada文档里特意指出,变换是从对象空间到对象空间,而不是从对象空间到世界空间,也许就特指这点吧。

4.collada的问题

对3d制作不熟悉,不知道对于模型数据,有没有bmp、png这种标准格式。从教程以及网上的一些资料来看,collada格式似乎是朝着这个方向发展的,起码3ds max,maya,blend都可以导出collada文件。但是从使用情况来看,我觉得对于初学者,这种格式似乎不是一个很好的选择。似乎为了兼容各个3d制作软件,格式设计的非常复杂。例如骨骼动画的数据,就分散在<library_geometries>、<library_controllers>、<library_visual_scenes>、<library_animations>几个xml节点里。而且不同的3d制作软件,导出的collada在数据表现格式上还是稍有区别的。例如同样的空间变换,blender导出的可能是一个矩阵,maya导出的可能是<rotate>、<translate>几个节点,给解析带来了不少麻烦。官方虽然提供了dom库和viewer,但是维护似乎有问题,最新版本甚至都无法编译成功。下面我列举几个使用教程的collada转换工具和解析代码时遇到的一些问题。


A.三角化

如果使用自己生成的collada文件,可能顶点数据并不是采用三角形而是多边形存储的。而教程里的解析部分使用的是三角形。好在collada官网上提供了COLLADA Refinery,可以完成这个转换工作。另外,某些3d软件导出collada时也可以选择顶点数据采用哪种几何形式。


B.bone的命名

教程提供的格式转换工具,假射骨骼都是采用bone*的形式命名的,而我使用blender导出的collada文件,显然不是这样。好在教程提供了转换工具的源代码,这点比较好修改。


C.根节点个数

教程假定骨骼有唯一一个根节点,实际很可能不是这样。


5.数学库的问题

我没有使用教程作者网站里提供的引擎里附带的数学库(懒得从引擎里分离出来),而是从网上找了一套gmtl数学库,结果遇到不少问题。不过个人感觉这个弯儿绕的值,弄清了一些计算机3d数学运算的基本概念。

首先是齐次变换。为了表示平移变换,矩阵要使用4x4而不是3x3,向量也要使用4个分量的版本。,要注意,向量的第四维是1,矩阵的平移效果才能体现,是0的话,只是旋转和伸缩,某些库的默认值还就是0。

其次是行列矩阵以及矩阵的内存表现形式。四维向量与4x4矩阵相乘,合乎矩阵乘法规则的形式是行向量乘以行矩阵(1x4 * 4x4),或者是列矩阵乘以列向量(4x4 * 4x1),不同的数学库,或两者都提供,或只提供其中之一。确定了数学库使用行矩阵(row major matrix)还是列矩阵(column major matrix),还需要确定数学库的矩阵内存存储形式。矩阵可以采用行优先存储(row major order matrix),也可以采用列优先存储(column major order matrix)。矩阵的内存表现形式一般是一16个元素的float数组,这里行列优先存储的意思是,4x4的矩阵元素,是按第1、2、3、4行的顺序,还是1、2、3、4列的顺序,存储到1维数组里去。一般会采用让矩阵里四个向量的对应维元素存储到线性连续空间的方式来选择行列矩阵和行列优先存储形式。这是因为cpu或gpu一般会提供单指令多数据命令(SIMD)来提高矩阵乘法的运算速度。如果采用上述的方案,计算矩阵与向量相乘时,就可以利用SIMD同时对四维进行计算。


这里推荐一个解释的比较清楚全面的网页

http://www.mindcontrol.org/~hplus/graphics/matrix-layout.html
原文地址:http://blog.youkuaiyun.com/wtyqm/article/details/7913802
骨骼动画程序:实现计算机图形中的骨骼动画效果 需要注意的是,以上代码只是一个简化的示例,实际的骨骼动画系统可能会更加复杂,涉及到骨骼的层级关系、动画融合、动画剪辑等方面的处理。关节是骨骼的连接点,它记录了与其相连的骨骼的标识符。骨骼动画是计算机图形中一种常见的技术,通过对骨骼和关节的模拟,可以实现逼真的角色动画效果。本文将介绍一个简单的骨骼动画程序,展示如何使用代码实现基本的骨骼动画效果。通过以上定义的数据结构和代码,我们可以实现一个简单的骨骼动画程序。下面是一个简单的示例,展示了如何创建骨骼、动作序列、播放器和模型,并在每一帧更新模型的变换。 阅读详情

相关推荐

一步一步的使用C++和OPENGL实现COLLADA骨骼动画

由英文作者waZim撰写,经过Sleepy翻译后,以文档的方式显示,手把手教你一步一步实现COLLADA骨骼动画。

骨骼动画详解

插值骨骼坐标:骨骼坐标插值要在骨骼自身空间中完成,如果在模型空间,那么插值出来的骨骼组成的Pose很怪异,因此,我们需要保存骨骼的TransformMatrix,而不是骨骼的TransformMatrix。首先,人眼的分辨率是有极限的,当两个点足够近,在人眼看来就连在一块,很多足够近的点就连成线了,再多的点就可以构成一个面。等到了66.6ms时,人眼才感知到物体在动。可以猜想不够平滑的地方是关节处,关节处的顶点受到多个骨骼的影响,在初始Pose中给定了每个骨骼的权重,在随后的计算中这些权重是固定不变的。

enternalstar的博客 1710

骨骼动画原理的文档 pdf

骨骼动画原理 一篇不错的文档 需要的抓紧时间下

骨骼动画的数学魔法:从数据结构到算法推演

文章摘要: 本文深入解析虚拟角色骨骼系统的数据结构与动画算法,揭示数字骨骼如何驱动逼真动作。通过树状层级组织骨骼节点,结合局部/全局变换矩阵与插值算法实现关键帧动画,并详细探讨蒙皮技术(LBS、双四元数)如何将骨骼运动映射至网格表面。逆向动力学(IK)算法使角色自适应环境(如贴合地面),而动捕数据与AI技术进一步丰富动作细节。优化方案(GPU蒙皮、LOD)提升性能,未来趋势指向更精细的肌肉模拟与实时体感交互。骨骼系统通过严谨的数学推演与高效运算,成为连接数据与虚拟生命的“数字脊椎”。(150字) 关键点:

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1272

COCOS2D-X中所使用的骨骼动画文件

COCOS2D-X中所使用的骨骼动画文件

OpenGL 3D骨骼动画模型读取绘制Demo(基于Assimp)

看别人的代码 Demo去学习,这是我的学习方式。这个Demo我用了两天写代码,却花了两个星期的调试。我想这应该是最简单的一个3D骨骼动画模型的读取和显示的Demo。其中注释了几个比较关键的地方。包含了几个简单的md5模型,blender模型,blender MD5导出插件。VB.net + OpenTK + Assimp.net

Unity骨骼优化

用Unity做游戏经常会用到3D角色,也就会用到骨骼动画。骨骼动画对性能的影响其实非常大的,在说这个问题之前,先来说说骨骼动画的原理。 我之前做过多种骨骼动画,包括写过2D的骨骼动画系统(类似于现在比较流行的龙骨系统),也在flash的stage3D里面写过3D的骨骼模型动画。骨骼动画的原理实际上都是一样的: 首先你需要有一个模型,2D或者3D的,这些模型是由顶点组成的,2d模型的顶点就是一个个四...

qq_38049291的博客 2500

USB HID虚拟电池:Windows零驱动电源状态模拟方案

虚拟电池是一种在硬件测试与功耗分析中替代真实电池、实现可控电源状态注入的关键技术。其核心原理是通过标准USB HID协议(特别是UPS设备类)向操作系统上报可编程的AC/DC状态、剩余电量、容量参数等,绕过内核驱动限制,达成毫秒级响应与跨Windows版本兼容。该技术显著提升SoC能效验证、电池健康度校准及低电量行为触发等场景的可重复性与精度。本文基于CH554微控制器实现符合HID UPS规范的物理层虚拟电池设备,支持零驱动安装、USB原生识别与实时参数调控,适用于笔记本平台功耗建模、电源管理策略验证及自

weixin_35755188的博客 354

简单的骨骼动画、骨骼动画理论

 简单的骨骼动画、骨骼动画理论Keep in touch: zpxocivuby@126.com目的:指导别人使用矩阵任务:编写教程,编写代码阅读对象:d3d入门者,c/c++熟练,windows编程熟练,VC IDE熟练描述:  这一届我们来做一个简单的骨骼动画(非常简单啊!只有两个线段啊!)并且介绍一下实现思想是什么在3d世界中,人物的动画过程主要有两种实现方式:1. key frame an

痞子龙3D编程 2377

Openharmony 命令行工具hdc的获取与安装

OpenHarmony实战:命令行工具hdc安装应用指南_hdc工具-优快云博客t=N7T8。

Devlin_的博客 1万+

实战对比:VINS和ORBSLAM3在无人机避障中的表现(含实测数据)

本文通过实战测试,深度对比了VINS和ORBSLAM3两种主流视觉SLAM算法在无人机避障中的表现。测试聚焦于光照变化、动态遮挡和快速运动三大挑战,提供了详细的实测数据与性能分析。结果表明,VINS在计算效率和实时性上占优,而ORBSLAM3在定位精度和地图管理方面更稳健,为不同应用场景下的工程选型提供了清晰依据。

醉三国 627

OpenGL10-骨骼动画原理篇(1)

OpenGL10-骨骼动画原理篇(1)

whl0071的专栏 1992

数据安全实战技能解析:从加密攻防到数字水印的竞赛指南

数据安全是信息安全领域的核心,其基础在于密码学与信息隐藏技术。密码学通过加密算法(如AES、RSA)和哈希函数,保障数据的机密性与完整性,其原理涉及对称/非对称加密、工作模式及密钥管理。数字水印技术则基于信号处理(如DCT/DWT变换),将信息嵌入多媒体载体,用于版权保护与溯源。这些技术的价值在于为数据全生命周期提供“防泄漏”与“可追溯”的解决方案,广泛应用于企业数据治理、合规审计和**数据防泄漏(DLP)** 系统。本文以一场贴近实战的**数据安全职业技能竞赛**为切入点,深入剖析如何运用密码分析、磁盘取

weixin_34314962的博客 402

Skinned Mesh原理解析和一个最简单的实现示例

Skinned Mesh原理解析和一个最简单的实现示例 作者:n5 本文的github地址:https://github.com/happyfire/SkinnedMeshDemo

聚焦游戏和图形引擎开发技术 4万+

自动驾驶仿真:基于Carsim开发的加速度请求模型

1、自动驾驶行业中,算法端对于纵向控制的功能预留接口基本都是加速度,我们需要给控制器仿真加速度的信号,控制器才会实现对纵向功能的控制。2、Carsim或者其他动力学软件,主要提供者节气门开度和主缸压力进行控制。我们在进行联合仿真时,往往都要通过PID的方式将请求加速度转换成对应的节气门开度与主缸压力传给动力学软件进行闭环控制。

zataji的博客 6914

026:vue+threeJS 设置地面铺砖的效果

BoxGeometry 是 Three.js 中用于创建立方体或长方体的几何体类。它允许你指定立方体的宽度、高度、深度以及这三个方向上的分段数,从而控制立方体的细分程度。width: 立方体的宽度(沿 x 轴方向)。height: 立方体的高度(沿 y 轴方向)。depth: 立方体的深度(沿 z 轴方向)。widthSegments: 可选参数,指定立方体在 x 轴方向上的分段数,默认值为 1。heightSegments: 可选参数,指定立方体在 y 轴方向上的分段数,默认值为 1。

大剑师兰特的GIS世界 645

blender怎么移动骨骼_cocos2dx blender 骨骼动画实现

前言 cocos2d-x 中相关部分代码介绍 背景知识介绍参考一 简单3d 模型支持第一步实现对3d 模型的简单支持,完成一个CCSprite3D 类参考CCSprite 类 以及 CCGLProgram 代码 主要修改 draw 方法。添加了定点数组pos 绘制索引数组index. 以及若干 3d 变换相关的成员方法 平移 旋转 缩放。对draw方法的改造,首先增加对opengl 矩阵进行计...

weixin_29304021的博客 1364

RabbitMQ高级特性 - 生产者消息确认机制

为了保证信息 从生产者 发送到 队列,因此引入了生产者的消息确认机制.通过事务机制实现.通过发送确认机制(confirm 和 return)实现.因为事务机制比较消耗性能,在实际工作中用的也不多,因此这里主要介绍confirm 和 return机制来实现发送放的确认.a)confirm 确认模式如上图,confirm 确认模式主要保障于 生产者 到 交换机 的消息可靠性.如果 Exchange成功收到消息,那么 ConfirmCallback 这个回调 ack 参数就为true。

CYK_byte的博客 1885

Skinned Mesh 原理解析和一个最简单的实现示例

作者:n5 Email: happyfirecn@yahoo.com.cn Blog: http://blog.youkuaiyun.com/n5 2008-10 月   Histroy: Version:1.02 Date:2010-1-1        修改了一些错误(用删除线标出 ),补充了一些材料,        ps:本文以后只维护优快云 blog上的版本,请转载者保

咸鱼的明天 1331

Unreal Engine Profiler:动画系统性能分析教程_2024-07-23_03-05-38.Tex

Unreal Engine Profiler 是一个内置的性能分析工具,它可以帮助开发者识别和解决游戏中的性能瓶颈。Profiler 提供了详细的性能数据,包括 CPU 使用率、GPU 负载、内存使用情况等,特别针对动画系统,可以查看动画蓝图的执行时间、骨骼动画的计算成本、以及动画混合和重定向的效率。通过这些数据,开发者可以定位到具体的问题,比如哪些动画状态消耗了过多的 CPU 时间,或者哪些动画资源导致了内存泄漏。

825

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

cocos2d-x 骨骼动画详解

骨骼动画 vs. 精灵表(sprite sheets)   创建动画又快又简单的方法是使用“精灵表”(sprite sheets).当你意识到游戏需要大量动画,内存消耗会涨上来,而且需要耗时去加载所有数据.此外,限于大小,你需要为了动画限制自己使用低FPS,这意味着动画不是你想要的那么平滑.这就是骨骼动画的由来.   骨骼动画简述 骨骼动画是cocos2d-x动画在人物渲染方面的

水上漂的专栏 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Skinned Mesh原理解析和一个最简单的实现示例(转)

Skinned Mesh原理解析和一个最简单的实现示例   Blog: http://blog.youkuaiyun.com/n5   & http://www.cnblogs.com/winfree (3D笔记only)   Histroy: Version:1.01  Date

lhc717的专栏 1075

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

VC中sqlite的使用

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

上一篇: 游戏动画技术的发展
下一篇: tolua++实现分析
cbbbc
博客等级 码龄15年 609粉丝 37原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值