OpenGL - скелетная анимация - кость вращается вокруг источника - PullRequest
0 голосов
/ 07 апреля 2019

Я слежу за серией уроков по скелетной анимации на Youtube (https://www.youtube.com/watch?v=f3Cr8Yx3GGA)) и столкнулся с проблемой - все работает нормально, за исключением того, что когда я поворачиваю одну из костей (или "суставов"), они вращаютсявокруг происхождения сцены, что означает, что они не остаются на месте, но переведены. Следующее изображение иллюстрирует проблему: Object is moved in addition to being rotated

Как я могу сделать так, чтобы перевод неслучается? Я просматривал серию учебных пособий несколько раз, но не могу определить, какой шаг предотвратит это.

Код очень большой, разбит на десяток файлов, и я не знаюкакой раздел может вызывать проблему, поэтому я не думаю, что есть много смысла публиковать все это здесь (это должно быть похоже на код в учебнике, хотя я использую C ++, когда он работает в Java. Код учебника может бытьможно найти здесь: https://github.com/TheThinMatrix/OpenGL-Animation). Если бы вы могли дать мне даже общие советы о том, как эта проблема обычно решается в скелетной анимации,Надеюсь, этого будет достаточно для того, чтобы я, по крайней мере, идентифицировал неправильную часть и попытался оттуда уйти.

Ответы [ 2 ]

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

Вам просто нужно обратить внимание на то, что вы вращаете вокруг.

Способ исправить это: сначала поверните, а затем переведите. Поверните объект, когда он находится в начале координат, а затем переместите объект туда, куда вы хотите.

Повторяйте это, когда все меняется в вашей программе. Начните объект в начале координат, сделайте желаемый поворот, а затем переведите его в конечное положение покоя.

0 голосов
/ 07 апреля 2019

Матрицы вращения сами по себе могут описывать только вращения вокруг начала координат ( Wikipedia ). Тем не менее, повороты могут использоваться в сочетании с переводами, чтобы изменить место происхождения, чтобы получить желаемый эффект. Например, вы могли бы:

  1. Переведите объект так, чтобы он был центрирован вокруг начала координат
  2. Повернуть объект в нужную ориентацию
  3. Перевести объект обратно в исходное положение

Или, чтобы сформулировать это другим, но функционально эквивалентным образом:

  1. Переместить начало координат в позицию объекта
  2. Повернуть объект в нужную ориентацию
  3. Сброс источника в исходное положение

Смежный вопрос: Вращение объекта вокруг фиксированной точки в opengl

...