1

我想做一个卡通 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 之前将其乘以顶点颜色上的阶跃函数。这避免了上述所有方法的缺点:所有东西都可以包装到模型的所有实例共享的一个纹理中,并且模型上除了可能在面部的位置之外不会有两遍像素。这里的缺点是模型更重(每个顶点有四个额外的属性,尽管颜色可能会被烘焙到单个字节)。

4

2 回答 2

0

您的着色器可以接收 2 个纹理,一个用于身体,一个用于面部。脸部是透明的,因此您可以将其覆盖在身体一的顶部。然后你只需要根据动画发送不同的面部纹理。

于 2014-05-19T13:16:45.113 回答
0

我在为我的 3d 场景中的背景广告牌实现 2d 动画时遇到了同样的问题。

我相信使用贴花是最简单的解决方案,实现动画就像根据动画对象更新贴花的 TextureRegion 一样简单:

TextureRegion frame = animation.getKeyFrame(currentFrameTime, true);
decal.setTextureRegion (frame);

我想你的情况真正的问题是将贴花定位在场景中。一种解决方案可能是使用您的 3D 建模软件对将存储贴花位置的“幻像”网格进行建模。

“幻影”网格不会与所有其他 3d 元素一起渲染,而是用于确定贴花顶点的位置。您唯一需要做的就是复制“幻像”位置顶点并将它们粘贴到贴花上。

我还没有实现这个解决方案,但理论上它可以相对容易地完成。

希望这个想法对您有所帮助,如果您发现任何其他解决方案/代码,我将不胜感激。

于 2014-05-27T13:27:48.833 回答