我想做一个卡通 3D 角色,其中面部特征是平面绘制的,并且是 2D 动画。有点像泡泡孔雀鱼角色。
我正在努力寻找一个好的方法来做到这一点。我正在使用 Libgdx,但我认为潜在的方法可以适用于任何游戏引擎。
这是我想到的想法,但每个都有缺点。有没有办法做到这一点?我只是和我的孩子们玩一个低成本的 Wii 游戏(一个 Nickelodeon 舞蹈游戏),它使用这种类型的动画来制作面部。
想法:
UV 动画- 有没有办法设置游戏模型(FBX 格式),以便将某些 UV 存储在各种皮肤中?然后,UV 可以跳转到精灵贴图中的各个位置。
投影面——这个想法很复杂。将纹理投影到模型上,并使用顶点着色器统一移动投影纹理的 UV。所以基本上,你需要一个投影矩阵来设置模型来移动面部投影。但是您需要在面部框架精灵周围有足够的填充,以使模型的其余部分远离精灵贴图的其他部分。这会导致复杂的片段着色器不适合移动设备。
使用模型移动平面 3D 贴花- 单独显示与模型对齐并在游戏中作为单独网格批量处理的 3D 贴花。贴花可能只是一个四边形,您可以在其中更改每个动画帧上顶点的 UV 属性。但是,此方法不会环绕面部的曲率。也许它可以分解为每个眼睛和嘴巴的单独贴花,但仍然看起来不太好,并且需要为每个模型创建一个单独的文件来定义贴花的位置。
为每一帧动画单独的骨骼- 在网格中为每一帧动画建模一个重复的面,并为每个动画赋予一个独特的骨骼。通过在 0 和 1 之间切换骨骼比例来为面部设置动画。如果动画帧数超过几帧,这个想法很快就会失效。
每帧更新部分皮肤- 将皮肤复制到 FBO。将最新的动画帧绘制到包含面部的 FBO 颜色纹理部分。这种方法的缺点是,您需要为模型的每个实例在内存中单独复制一份纹理,并且 FBO 必须每帧都进行缓冲区恢复(成本高昂),或者您必须重新绘制整个皮肤进入 FBO 每一帧(也很昂贵)。
我还有其他比这些更困难的想法。感觉必须有一个更简单的方法。
编辑:
还有一个想法……统一的 UV 偏移和顶点颜色- 此方法将使用顶点颜色,因为它们很容易在所有游戏引擎和建模包中得到支持,但在许多情况下未使用。在纹理中,创建一条动画帧。为第一帧设置面部 UV。使用 Alpha 0 为所有顶点着色,除了面顶点可以着色为 Alpha 1。然后将 UV 面偏移统一传递给顶点着色器,并在将其添加到 UV 之前将其乘以顶点颜色上的阶跃函数。这避免了上述所有方法的缺点:所有东西都可以包装到模型的所有实例共享的一个纹理中,并且模型上除了可能在面部的位置之外不会有两遍像素。这里的缺点是模型更重(每个顶点有四个额外的属性,尽管颜色可能会被烘焙到单个字节)。