当在两个不同的vbo之间进行插值时,网格面向迷失方向
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当在两个不同的vbo之间进行插值时,网格面向迷失方向相关的知识,希望对你有一定的参考价值。
所以,我正在使用带有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);
}
您基本上对网格数据执行标准lerp(线性插值),这可以使用mix()函数完成。
v_TextureCoordinates = mix(a_Position, b_Position, ratio);
gl_Position = mix(a_TextureCoordinates, b_TextureCoordinates, ratio);
着色器中的一切看起来都很好。我有点担心你是在插入UV纹理坐标但是???对于角色动画来说,这是一种非常不寻常的方法吗?通常,纹理坐标在动画时不会改变。
顶点混合的一个大问题是,如果姿势明显不同,你会得到一些非常奇怪的变形。我猜你的文物可能是由于这个? (动画层次结构通常更可取的原因之一)
以上是关于当在两个不同的vbo之间进行插值时,网格面向迷失方向的主要内容,如果未能解决你的问题,请参考以下文章
两个不同的对象 OpenGL。 VAO VBO IBO 网格变形问题
将两个不同的网格放在同一个顶点 VBO 中的 OpenGL 最佳实践