当在两个不同的vbo之间进行插值时,网格面向迷失方向

问题描述 投票:0回答:2

所以,我正在使用带有opengl的java,并且我正在使用obj(波前)解析器显示一个网格。我有一个网格,我从搅拌机导出,到目前为止我能够显示到Android手机显示器。我现在尝试使用关键帧动画为网格设置动画,因为骨架动画实现起来要困难得多。我在两个不同的位置有两个vbo的网格。我不确定在着色器中是否存在关键帧动画的事实上的标准方法,但我找不到它所以我想出了一个公式,可以帮助我在给定时间在这两个vbo之间进行插值。公式如下

float ratio = ((passedTime/AnimationDuration))

在VertexShader中:

GLPosition = ratio * (this is difference->)(endVBOVertex - StartVBOVertex)) + startVBOVertex.

因此,如果AnimationDuration为8秒且传递时间为4秒,则比率等于.5。然后将该比率乘以start vbo和end vbo中的顶点之间的差值。然后将此值添加到startVbo顶点,以便可以按顶点计算正确的位置。因此,如果ratio = 0,则将0乘以等于0的差值,然后将其添加到原始vbo顶点起始点。给我们留下开始的网格姿势。如果ratio = 1,则将其乘以差值,然后将其添加到起始vbo顶点位置,从而给出结束vbo,其中网格位于结束位置。当比率为0或1时,网格看起来很好。但是,(在此问题中)在0和1之间,网格的某些面旋转,在网格中留下孔。比率= .50是最差的,将一些面旋转45度左右;留下一个带有菱形的网格的矩形面,4个透视三角形。当我接近0或1时,这些受影响的面旋转回正确的位置,使整个网格正确。当在这两个vbos之间进行插值时,网格的位置看起来也不错;总的来说,网格可以在适当的姿势中看到,但有些面部正在以一种奇怪的方式旋转和受到影响(当比率在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);
}

Close Up of Head

Ratio at 50%

java opengl-es glsl shader interpolation
2个回答
0
投票

您基本上对网格数据执行标准lerp(线性插值),这可以使用mix()函数完成。

v_TextureCoordinates = mix(a_Position, b_Position, ratio);
gl_Position = mix(a_TextureCoordinates, b_TextureCoordinates, ratio);

着色器中的一切看起来都很好。我有点担心你是在插入UV纹理坐标但是???对于角色动画来说,这是一种非常不寻常的方法吗?通常,纹理坐标在动画时不会改变。

顶点混合的一个大问题是,如果姿势明显不同,你会得到一些非常奇怪的变形。我猜你的文物可能是由于这个? (动画层次结构通常更可取的原因之一)

© www.soinside.com 2019 - 2024. All rights reserved.