所以,我使用 java 和 opengl es,并使用 obj(波前)解析器显示一个网格。我有一个从 blender 导出的网格,到目前为止我能够将其显示到 Android 手机显示屏上。我现在尝试使用关键帧动画对网格进行动画处理,因为骨骼动画更难实现。我的网格有两个 vbo,位于两个不同的位置。我不确定着色器中是否存在关键帧动画事实上的标准方法,但我找不到它,所以我想出了一个公式可以帮助我在给定时间在这两个 vbo 之间进行插值。公式如下
float ratio = ((passedTime/AnimationDuration))
在顶点着色器中:
GLPosition = ratio * (this is difference->)(endVBOVertex - StartVBOVertex)) + startVBOVertex.
因此,如果 AnimationDuration 为 8 秒,passedTime 为 4 秒,则比率将等于 0.5 。然后将该比率乘以起始 vbo 和结束 vbo 中的顶点之间的差值。然后将该值添加到 startVbo 顶点,以便可以计算每个顶点的正确位置。因此如果ratio = 0,则将0乘以差值等于0,然后添加到原始vbo顶点起点。留给我们一开始的网格姿势。如果ratio = 1,则将其乘以差值,然后添加到起始 vbo 顶点位置,从而得到网格位于最终位置的最终 vbo。当比率为 0 或 1 时,网格看起来很好。但是,(这就是问题)在 0 和 1 之间,网格的某些面会旋转,从而在网格中留下孔。比率 = 0.50 时最差,部分面旋转 45 度左右;留下一个网格的矩形面,其中有一个菱形和 4 个透视三角形。当我接近 0 或 1 时,这些受影响的面会旋转回正确的位置,从而使整个网格正确。在这两个 vbo 之间进行插值时,网格的位置看起来也不错;这意味着总体而言,网格可以以正确的姿势看到,但有些面正在旋转并以一种奇怪的方式受到影响(当比例在 0-1 之间时),这让我可以看到网格。
{如果您已经看到这里,我非常感谢您的宝贵时间,如果我有任何不清楚的地方,我深表歉意。我还要提前非常感谢您提供的所有建议。
我启用了深度测试,我知道我正在正确分配所有制服和属性,因为我最终无法以比例 = 0 || 的正确姿势获得网格1. Vbo 具有相同数量的顶点。
这是我的顶点着色器:
uniform mat4 u_Matrix;//uniform for our matrix
attribute vec4 a_Position;//Original vertex position
attribute vec2 a_TextureCoordinates;
varying vec2 v_TextureCoordinates;
attribute vec4 b_Position;//Next vertex position to interpolate too
attribute vec2 b_TextureCoordinates;
uniform float ratio;
// (currentTime - StartTime)/animationDuration
//so If the animation lasts 8 seconds and 4 seconds have passed ratio
//will equal .5 and half the difference it takes for the first vbo to reach the second vbo will be added.
void main() {
v_TextureCoordinates = (a_TextureCoordinates + ((b_TextureCoordinates - a_TextureCoordinates) * ratio));
gl_Position = u_Matrix * (a_Position + ((b_Position - a_Position) * ratio));
}
这是我的片段着色器:
precision mediump float;
uniform sampler2D u_TextureUnit;
varying vec2 v_TextureCoordinates;
void main() {
gl_FragColor = texture2D(u_TextureUnit,v_TextureCoordinates);
}
最佳答案
您基本上是在网格数据上执行标准 lerp(线性插值),这可以使用 mix() 函数来完成。
v_TextureCoordinates = mix(a_Position, b_Position, ratio);
gl_Position = mix(a_TextureCoordinates, b_TextureCoordinates, ratio);
在我看来,着色器中的一切都很好。我有点担心你正在插值 UV 纹理坐标???对于角色动画来说,这是一种非常不寻常的方法吗?通常,动画时纹理坐标不会改变。
顶点混合的一个大问题是,如果姿势明显不同,您会得到一些非常奇怪的变形。我猜你的文物可能是因为这个? (动画层次结构通常更受欢迎的原因之一)
关于java - 在两个不同的 vbo 之间进行插值时,网格面会迷失方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55929632/