Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 如何将2D逐帧动画放置在3d模型上(混合动画)_Opengl_Opengl Es_Libgdx_Shader_3d Modelling - Fatal编程技术网

Opengl 如何将2D逐帧动画放置在3d模型上(混合动画)

Opengl 如何将2D逐帧动画放置在3d模型上(混合动画),opengl,opengl-es,libgdx,shader,3d-modelling,Opengl,Opengl Es,Libgdx,Shader,3d Modelling,我想做一个卡通3D角色,面部特征是平面绘制的,并在2D中设置动画。有点像泡泡孔雀鱼的角色 我正在努力寻找一个好的方法来做这件事。我正在使用Libgdx,但我认为潜在的方法可以应用于任何游戏引擎 以下是我想到的一些想法,但每个都有缺点。有没有一种常用的方法?我只是在和我的孩子们玩一个低成本的Wii游戏,一个五分制的舞蹈游戏,用这种动画制作脸部 想法: UV动画-是否有办法设置游戏模型FBX格式,以便将某些UV存储在各种皮肤中?然后,紫外线可以在精灵地图中跳跃到不同的地方 投影面-这个想法很复杂。使

我想做一个卡通3D角色,面部特征是平面绘制的,并在2D中设置动画。有点像泡泡孔雀鱼的角色

我正在努力寻找一个好的方法来做这件事。我正在使用Libgdx,但我认为潜在的方法可以应用于任何游戏引擎

以下是我想到的一些想法,但每个都有缺点。有没有一种常用的方法?我只是在和我的孩子们玩一个低成本的Wii游戏,一个五分制的舞蹈游戏,用这种动画制作脸部

想法:

UV动画-是否有办法设置游戏模型FBX格式,以便将某些UV存储在各种皮肤中?然后,紫外线可以在精灵地图中跳跃到不同的地方

投影面-这个想法很复杂。使用带有顶点着色器的纹理在模型上的投影,该顶点着色器均匀移动投影纹理的UV。所以,基本上,你需要一个投影矩阵,它被设置成可以随着模型移动面部投影。但是需要在面框精灵周围添加足够的填充,以使模型的其余部分与精灵贴图的其他部分保持距离。这将导致一个复杂的片段着色器,这对于移动设备来说并不是什么好事情

使用模型移动平面3D贴花-单独显示与模型对齐并在游戏中作为单独网格批处理的3D贴花。贴花可以只是一个四边形,您可以在其中更改动画每个帧上顶点的UV属性。但是,此方法不会环绕面的曲率。也许它可以分解为每个眼睛和嘴巴的单独贴花,但仍然不太好看,并且需要创建一个单独的文件来与每个模型一起定义贴花的位置

为每个动画帧分离骨骼-为每个动画帧在网格中建模一个重复的面,并为每个骨骼指定一个唯一的骨骼。通过在0和1之间切换骨骼比例来设置面动画。如果有超过几帧的动画,这个想法很快就会崩溃

更新每个帧的蒙皮部分-将蒙皮复制到FBO中。将动画的最新帧绘制到包含面的FBO颜色纹理部分。这种方法的缺点是,对于模型的每个实例,在内存中都需要单独的纹理副本,FBO必须在每一帧执行缓冲区恢复,或者必须在每一帧中重新绘制整个蒙皮

我还有比这些更难的其他想法。感觉一定有更简单的方法

编辑:


还有一个想法。。。统一UV偏移和顶点颜色-此方法将使用顶点颜色,因为它们在所有游戏引擎和建模软件包中都很容易得到支持,但在许多情况下是未使用的。在纹理中,创建一条动画帧。为第一帧设置面UV。使用Alpha 0为所有顶点着色,但面顶点除外,面顶点可以使用Alpha 1着色。然后将UV面偏移均匀地传递到顶点着色器,并在将其添加到UV之前将其乘以顶点颜色上的步长函数。这避免了上述所有方法的缺点:所有内容都可以包装到模型的所有实例共享的一个纹理中,并且除了可能的面所在位置之外,模型上不会有两个经过像素。这里的缺点是一个更大的模型,每个顶点有四个额外的属性,尽管颜色可能会被烘焙到一个字节。

您的着色器可以接收两个纹理,一个用于身体,一个用于面部。脸是透明的,所以你可以把它覆盖在身体的上面。然后,您只需要根据动画发送不同的面部纹理。

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

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

TextureRegion frame = animation.getKeyFrame(currentFrameTime, true);
decal.setTextureRegion (frame);
我猜您的案例中真正的问题是将贴花放置在场景中。 一种解决方案是使用3D建模软件对存储贴花位置的虚拟网格进行建模

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

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


希望这个想法能对您有所帮助,如果您发现了其他解决方案/代码,我将非常感谢您与我分享。

这可能是最简单的方法。但是有两个缺点…动画的帧不能集中到一个纹理上,所以如果屏幕上有很多角色的实例 将有大量的纹理绑定进行。此外,将有两个纹理查找每个像素的字符,即使只有脸需要两个视觉。对手机来说有点贵。我认为我的贴花想法和骨骼想法会更有效,但更难实现。