1.空间的平移、旋转、缩放都可以用矩阵来表示,而且这些矩阵也可以结合在一起成为一个矩阵,多层空间结构的变换也一样可以组合为一个矩阵。
2.现在看来骨骼动画的核心其实就是几个矩阵乘法的问题,大概就是这样:
其中model矩阵随着动画的播放不停的变化,也就实现了骨骼带动皮肤的功能。
假设一个顶点受多个骨骼影响,那么就再根据权重混合一下。
3.mesh的初始位置、bindpose、影响因素都是通过制作该骨骼动画模型时确定的,可以参考第一小节制作骨骼动画的过程。 Unity中的骨骼动画
我们这里以一个Mixamo上的免费资源为例。
资源下载资源导入
直接将资源拖入Unity中即可,可以看到在Unity中生成了一个文件夹和一个预制件。
1.把模型prefab拖入场景中。
2.然后将mixamo.com动画拖到场景中的Samba Dancing中,Unity会自动生成对应的Animator Controller。
直接点击运行即可。
数据说明 动画数据说明:左边是每一帧变化的骨骼,右边是每个骨骼关键帧的平移,旋转,缩放信息。 模型信息说明 Skinned Mesh Renderer属性详解
Cast Shadows:是否投射阴影。
Receive Shadows:是否接收阴影。
Materials:材质。
Use Light Probes:是否使用光探针。
Reflection Probes:反射探针设置。
Anchor Override:网格锚点。
Lightmap Parameters:光照烘培参数。
Quality:每个顶点最多收到的骨骼影响数量。
Update When Offscreen:当mesh在屏幕外时是否更新,依据RootBone和Bounds判断。
Mesh:Mesh信息。
mesh信息包含了每个顶点的位置信息,受骨骼影响的权重信息、切线、法线、UV映射信息。
RootBone:根骨骼,有两个作用。
1.作为mesh在屏幕外时是否更新的依据。
2.进行坐标计算时的Root空间。
在Unity中计算mesh上一点位置的流程大概是这样的:
$$V_{RootBone_{local}} = M_{World→RootBone}⋅M'{Bone→World}⋅M{Bindpose}⋅V_{world}$$
先通过上述一系列计算得到点在RootBone空间中的位置,上述过程对开发者时不可见的。然后将接下来的步骤交给Material中的Shader解决。查看Shader文件可以看到,在顶点着色其中第一步会给输入的点乘以一个MVP矩阵获取该点在屏幕上的位置,其中的M就是RootBone的模型矩阵。
以Unity 5.37的Standard Shader为例,截取其使用的顶点着色器的一部分
可以看到,通过posWorld = mul(unity_ObjectToWorld, v.vertex);对顶点以RootBone空间为基础做了转换。
Bounds:根骨骼的边界。
如果有什么错误,希望各位在博客下留言指正,我会尽快改正。