2016-12-25 5 views
0

Я пытаюсь реализовать скелетную анимацию в OpenGL ES2 в Android, у меня есть модель JSON, экспортированная из Blender с использованием io_three, я могу читать из этого файла. Bones array каждый имеет позицию как 3 массива floats, поворот кватерниона как 4 массива float и масштаб и целое число, которое является родительским, также у меня есть анимация, у которой есть список иерархии, как я понимаю, который обрабатывает каждую матрицу каждой кадры, каждая иерархия имеет родительский элемент и список ключей, каждая из которых имеет те же компоненты, что и кость, поэтому я прочитал много учебников и сделал много попыток, но, к сожалению, я не добился успеха, мне просто нужна логика. , поэтому у меня есть класс костей, у каждого есть векторы, и я могу получить относительную матрицу для каждой кости, а затем умножить ее на родительскую абсолютную матрицу, чтобы получить абсолютную матрицу кости, а затем инвертировать ее, чтобы получить обратную матрицу, Я могу сделать одинаковые вычисления для каждого ключа, но я не могу связать их вместе, мне нужно понять соотношение между костью и каждым фреймом. моя проблема связана не с кодом, а с логикой.Логика скелетной анимации OpenGL

ответ

2

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

Я могу читать из этого массива файлов Кости каждый имеет положение, как 3 поплавков массив, вращение кватернионов как 4 поплавков массив и шкалы

Вы также должны быть имея данные синхронизации для выше, т.е. если вы говорите 17 кадров в вашей анимации, информацию о времени для каждого кадра. Предполагая, что у вас есть это или вы можете получить эти данные из io_three, вы можете вычислить матрицу анимации. Более гранулированные шаги:

  1. Найти позиционные данные для времени t т.е. вы найдете 2 кадра с временами t1 и t2 таким образом, что: t1 < t < t2. Теперь вы можете вычислить интерполированную матрицу перевода.
  2. Подобно 1, вычислите интерполированные матрицы вращения и масштабирования.
  3. Теперь найдите локальную матрицу анимации: A из матриц T, R, S, которые вы только что вычислили.
  4. Затем умножьте локальную матрицу анимации на преобразование привязки костей.
  5. Теперь умножьте на родительскую матрицу так, чтобы у вас была кумулятивная матрица анимации.

Вы можете увидеть образец этого вида computation here: обратите внимание, что в ObjectiveC, используя Assimp.

Вы будете выполнять шаги с 1 по 4 для каждой кости вашего скелета, и вы переходите от корня скелета до упора вниз, что гарантирует, что для каждой кости у вас есть кумулятивная матрица анимации. Вы начинаете с IdentityMatrix в качестве родительской матрицы.

Как вам нужно начинать с корня скелета, вы также должны знать этот корень. Либо ваши данные предоставляют корень скелета, либо вы должны получить корень скелета. Если у вас есть дерево узлов кости, то узел с наименьшей глубиной будет root!

Как только у вас есть матрица анимации для каждой кости, вам также нужно знать количество костей, которые влияют на каждую вершину и весовое значение этого влияния. Затем вы можете вычислить деформированную вершину либо на процессоре, либо на графическом процессоре. Обратите внимание, что both have their pros and cons.

Более подробное объяснение скелетной анимации, но с библиотекой Assimp описано в этом документе post's top answer.

В целом, в то время как общая логика скелетной анимации проста; сложная часть заключается в навигации по вашей структуре данных, которая содержит все эти данные и построения правильных матриц анимации, идентификации корневого узла скелета и отображения из вершин в данные кости/анимации.

+0

Чистое и ясное объяснение, спасибо – Mohamed