【Unity】骨骼动画

【Unity】骨骼动画

蒙皮模型

蒙皮模型的结构

直接将蒙皮模型拖进场景中并观察其子节点,最简单的蒙皮模型中由骨架和蒙皮网格两部分组成。

  • 骨架

    由一堆空物体组成,每个空物体代表一根骨骼。

  • 蒙皮网格

    蒙皮网格相比普通网格多了一些数据:

    1. 一组模型空间转骨骼空间矩阵,每个矩阵对应一个骨骼。
    2. 每个顶点所要跟随的骨骼矩阵索引。
    3. 每个顶点所要跟随的骨骼矩阵权重。

    为了支持这些新属性,蒙皮网格需要使用专门的 SkinnedMeshRenderer 组件。

顶点与骨骼的关联

蒙皮网格的顶点会跟随骨骼,效果就好比把该顶点挂为该骨骼的子物体,因此当骨骼发生变换时,顶点也会跟着变换,从而实现了提线木偶版的效果。

具体实现是 Unity 通过在计算着色器中用矩阵变换实现的,其通过矩阵计算新顶点位置的方式如下:

新顶点位置 =(世界空间到模型空间 * 骨骼空间到世界空间 * 初始模型空间到骨骼空间)* 初始顶点位置
  • 骨骼空间到世界空间:随着骨骼的变换而改变,这就是带动顶点的关键。
  • 初始模型空间到骨骼空间:一般由模型文件提供,或者也可以用世界空间桥接计算。

网格和骨架的关联

蒙皮网格仅记录对一组骨骼的索引,但具体这些骨骼对应哪些 Transform,则是由蒙皮网格渲染器完成的。实际上模型文件里有对骨架进行描述,Unity也是因此才能用空物体生成骨架,而蒙皮网格不过是通过指定根骨骼的方式,连接骨架和网格。

骨架共用的原理

由上文可见,网格和骨骼并不是一个强绑定关系,而且蒙皮网格渲染器(下面简称渲染器)关联网格和骨骼这一操作也只在渲染器启动时发生,所以只要在渲染器启动前准备好符合条件的空物体,渲染器也会将其识别为骨骼。实际上渲染器中也有提供修改根骨骼这一操作,便是起实现骨架共用的作用。

骨骼动画

动画即控制一个或多个属性,使其在时间的流逝中发生变化。而骨骼动画字如其名,即控制骨骼的动画。骨骼只是一个空物体,挂在它上面的只有 Transform 组件,因此能修改的也只有位置,旋转,缩放信息。通过调整这些属性来使特定的骨骼空间发生变动,从而导致蒙皮网格中的顶点相对世界的位置发生变化,便营造出来模型动了的感觉。

posted @   BDFFZI  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示