Лица сетки дезориентированы при интерполяции между двумя различными VBO - PullRequest
0 голосов
/ 01 мая 2019

Итак, я использую 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%

1 Ответ

0 голосов
/ 01 мая 2019

Вы в основном делаете стандартный lerp (линейная интерполяция) для данных меша, что можно сделать с помощью функции mix ().

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

В шейдере все выглядит нормально.Я немного обеспокоен тем, что вы интерполируете координаты текстуры UV, хотя ???Это очень необычный подход для персонажа аним?Обычно текстурные координаты не меняются при анимации.

Одна из больших проблем с смешиванием вершин состоит в том, что вы получаете очень странную деформацию, если позы значительно отличаются.Я предполагаю, что ваши артефакты, возможно, из-за этого?(одна из причин, по которой анимированные иерархии обычно предпочтительнее)

...