Итак, я использую Java с OpenGLES и у меня есть сетка, которую я отображаю с помощью анализатора obj (wavefront). У меня есть единственная сетка, которую я экспортировал из blender, и пока я могу отображать ее на дисплее телефона Android. Сейчас я пытаюсь анимировать сетку с использованием анимации по ключевым кадрам, потому что скелетную анимацию реализовать гораздо сложнее. У меня есть две VBO сетки в двух разных позициях. Я не уверен, существует ли де-факто стандартный метод для анимации ключевых кадров в шейдерах, но я не смог его найти, поэтому я нашел формулу, которая помогла бы мне интерполировать эти две виртуальные машины в определенный момент времени. Формула выглядит следующим образом
float ratio = ((passedTime/AnimationDuration))
в VertexShader:
GLPosition = ratio * (this is difference->)(endVBOVertex - StartVBOVertex)) + startVBOVertex.
Так что, если AnimationDuration равен 8 секундам, а значение параметраimeTime равно 4 секундам, соотношение будет равно .5. Отношение затем умножается на разницу между вершинами в начале vbo и в конце vbo. Затем это значение добавляется в вершину startVbo, поэтому правильная позиция может быть рассчитана для каждой вершины. Поэтому, если коэффициент = 0, 0 умножается на разность, равную 0, а затем добавляется к исходной начальной точке вершины vbo. оставив нас в позе сетки, которая была начата с. Если отношение = 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);
}
Крупный план головы
Соотношение при 50%