NoiseFloor 发表于 2022-2-9 07:43

unity3D的骨骼动画(一) 动画文件

引言

计划写一篇关于 unity3D 引擎的骨骼动画,关于骨骼动画的文件格式与解析、实现原理,对比不同方式的骨骼动画实现,比如在 OpenGL 和 D3D 里对骨骼动画的不同实现,然后探讨下 unity3D 里是如何利用 skinnedMesh 实现骨骼动画,最后把骨骼动画烘焙成顶点数据,在unity3D的 vertex shader 里实现骨骼动画(也叫 GPU skinning),从而更好的利用 unity3D 的 ECS 模式。
这是第一篇,分析 unity3D 里的动画文件格式。在 unity3D 里导入动画,一般是 FBX 的文件,里面带有 mesh(顶点数据)、skel(骨骼数据)和 anim(动画数据)。依靠这三个文件,即可实现人物的骨骼动画。
不过这里先不分析 unity3D 里的动画文件,这里先从 OpenGL 入手,看一看在 OpenGL 里如何实现骨骼动画。
骨骼动画的实现原理就是通过骨骼的变换数据计算出骨骼的姿势,然后利用顶点绑定的骨骼和权重数据计算出顶点变换后对象坐标,然后进行顶点到世界坐标的变换,这后面就是常规操作了。
这里的 OpenGL 示例使用的数据格式十分简洁清晰,与 unity3D 里的不同,适合用来理解原理。
为保简洁明了,本文会给出核心代码,来自《C++游戏编程:创建3D游戏》,这部分全部代码可以去异步社区官网下载,或者联系我发邮箱。
一、骨骼动画的基本数据文件


[*]mesh文件
[*]skel骨骼文件
[*]anim动画文件
mesh文件
总所周知,mesh 文件(对应unity里的 mesh 组件)存放了模型的网格数据,在 OpenGL 里加载 mesh 文件并设置其 VAO、VBO 和 EBO,这一步想必大家都很熟悉了。在带有骨骼动画的 mesh 里一样有常见的顶点位置、法线、UV,除此之外,还额外多了两个属性,即 骨骼编号 和 权重值。
一般来说,骨骼编号用四位无符号整数来表示,代表该顶点受到哪些骨骼的影响,从位数即可看出,每个顶点最多受到不超过四个骨骼的影响。权重值由四位数浮点数表示,与骨骼编号一一对应。很明显,每个顶点受到影响由该顶点全部骨骼标号所影响的位置坐标乘以对应的骨骼权重的总和。
这里我该插原书上的图,非常直观,但是找不到电子档,尴尬。明天再找吧,未完待续...
页: [1]
查看完整版本: unity3D的骨骼动画(一) 动画文件