我想做一个卡通的3D角色,其中面部特征是平面绘制的并且是2D动画。有点像Bubble Guppies字符。
我正在努力寻找一种好的方法来做到这一点。我正在使用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之前将其乘以顶点颜色上的阶梯函数。这避免了上述所有方法的缺点:一切都可以包装到模型的所有实例共享的一个纹理中,并且模型上除了可能的面之外没有两个通过的像素。这里的缺点是一个更大的模型(每个顶点有四个额外的属性,尽管颜色可能会被烧成一个字节)。
答案 0 :(得分:0)
你的着色器可以获得2个纹理,一个用于身体,一个用于脸部。面部是透明的,所以你可以将它覆盖在身体的顶部。然后你只需要根据动画发送不同的面部纹理。
答案 1 :(得分:0)
我正在努力解决在我的3D场景中向背景广告牌实施2D动画的同样问题。
我相信使用贴花是最简单的解决方案,实现动画就像根据Animation对象更新贴花的TextureRegion一样简单:
TextureRegion frame = animation.getKeyFrame(currentFrameTime, true);
decal.setTextureRegion (frame);
我想你的案例中的真正问题是将贴花定位在场景中。 一种解决方案可能是使用您的3D建模软件对“幻影”网格进行建模,该网格将存储贴花的位置。
“幻影”网格不会与所有其他3d元素一起渲染,而是用于确定贴花顶点的位置。您唯一需要做的就是复制“幻影”位置顶点并将它们粘贴到贴花上。
我还没有实现这个解决方案,但理论上它可以相对容易地完成。
希望这个想法对您有所帮助,如果您发现任何问题,我将非常感谢您分享其他解决方案/代码。