之前这篇有说过Mass的Visualization,在近处是真实可以交互的Actor,而在远处会统一合并成ISM,如下图所示。
也有同学在私信和评论里问我,远处StaticMesh合并了Instance,但不能使用骨骼,那怎样才能有动画呢?其实官方做法就是材质里使用顶点动画。这个做法官方之前UE4 Niagara的视频里就已经讲过了,只是自己搞或看着视频照抄材质比较费劲。
现在黑客帝国的工程已经放出来了,也是通过这种方法做的,可以直接复制粘贴现成的了。打开Demo,可以看到远处这些会动的人,其实就是合了instance的静态网格,通过材质实现的动画。
下面来具体说一下:
可以打开上面那个路人的StaticMesh资源,可以发现这个StaticMesh在预览时候会动,所以第一反应肯定是材质里面使用了World Position Offset,就和树叶和草的材质动画做法一样,只是角色的会稍微复杂点。
因为角色骨骼动画,本质其实就是网格的每个顶点相对于TPose做了变换得到的Pose,而StaticMesh本身就是TPose,那么只要在材质里对每个顶点做对应的变换就可以实现动画了。
直接打开对应材质实例,右边3张贴图的样子已经能大概看出来做了什么,有骨骼的Position,Rotation,Weight。骨骼动画的蒙皮,本身每个顶点就是受对应几根骨骼影响的,那么只要知道了对应几根骨骼的偏移,也就能根据权重计算出当前顶点的偏移了。
打开母材质,可以看到确实是World Position Offset,而具体的动画,是通过ML_BoneAnimation这个材质Layer做的,材质Layer跟材质函数本质上其实是一回事,这里就不具体说区别了。
打开就可以看到具体是怎么做的了,本质其实就是拿骨骼和权重然后算出来偏移量:
至于怎样把动画烘到贴图上,可以看AnimToTexture这个插件的代码,具体就是把动画资源每帧的矩阵都拿出来,写到贴图上,可以看这几个函数。注意因为图片的通道保存的是位置等向量信息,所以这些烘出来的图片没有压缩。当然简单的压缩对精度损失会非常大,如果对图片的大小有特殊要求,可以自己研究一下算法,想办法压缩下,这里就不细说了。