骨骼动画的原理及在Unity中的使用 (2)

1.空间的平移、旋转、缩放都可以用矩阵来表示,而且这些矩阵也可以结合在一起成为一个矩阵,多层空间结构的变换也一样可以组合为一个矩阵。
2.现在看来骨骼动画的核心其实就是几个矩阵乘法的问题,大概就是这样:

骨骼动画的原理及在Unity中的使用


其中model矩阵随着动画的播放不停的变化,也就实现了骨骼带动皮肤的功能。
假设一个顶点受多个骨骼影响,那么就再根据权重混合一下。
3.mesh的初始位置、bindpose、影响因素都是通过制作该骨骼动画模型时确定的,可以参考第一小节制作骨骼动画的过程。

Unity中的骨骼动画

我们这里以一个Mixamo上的免费资源为例。

资源下载

骨骼动画的原理及在Unity中的使用


骨骼动画的原理及在Unity中的使用

资源导入

直接将资源拖入Unity中即可,可以看到在Unity中生成了一个文件夹和一个预制件。

骨骼动画的原理及在Unity中的使用

加入动画

1.把模型prefab拖入场景中。
2.然后将mixamo.com动画拖到场景中的Samba Dancing中,Unity会自动生成对应的Animator Controller。

骨骼动画的原理及在Unity中的使用

运行场景,查看动画效果

直接点击运行即可。

数据说明 动画数据说明:

骨骼动画的原理及在Unity中的使用


左边是每一帧变化的骨骼,右边是每个骨骼关键帧的平移,旋转,缩放信息。

模型信息说明

骨骼动画的原理及在Unity中的使用

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为例,截取其使用的顶点着色器的一部分

VertexOutputForwardBase vertForwardBase (VertexInput v) { UNITY_SETUP_INSTANCE_ID(v); VertexOutputForwardBase o; UNITY_INITIALIZE_OUTPUT(VertexOutputForwardBase, o); UNITY_TRANSFER_INSTANCE_ID(v, o); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); float4 posWorld = mul(unity_ObjectToWorld, v.vertex); #if UNITY_REQUIRE_FRAG_WORLDPOS #if UNITY_PACK_WORLDPOS_WITH_TANGENT o.tangentToWorldAndPackedData[0].w = posWorld.x; o.tangentToWorldAndPackedData[1].w = posWorld.y; o.tangentToWorldAndPackedData[2].w = posWorld.z; #else o.posWorld = posWorld.xyz; #endif #endif

可以看到,通过posWorld = mul(unity_ObjectToWorld, v.vertex);对顶点以RootBone空间为基础做了转换。

Bounds:根骨骼的边界。

如果有什么错误,希望各位在博客下留言指正,我会尽快改正。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxswj.html