Коллада и скелетная анимация - PullRequest
1 голос
/ 22 августа 2010

Я пытаюсь реализовать настройку скелетной анимации в игровом движке, который я сейчас пишу для своего практикума в школе. Движок написан на c ++ и directx 10, используя правую систему.

В настоящее время я использую collada для импорта и загрузки сеток (я знаю, что это не лучшее доступное решение). Используемая мной настройка использует кватернионы для вращений, которые я конвертирую в матрицы непосредственно перед передачей данных в gpu для скиннинга gpu. Я использую softimage для построения тестовых сеток для тестирования различных аспектов кода анимации.

У меня проблема в том, что касается значений вращения. Я использую D3DXQuaternionRotationYawPitchRoll для преобразования значений поворота из углов Эйлера в кватернионы. Проблема в том, что в настоящее время анимации находятся не на той оси. то, что должно быть вращением вокруг оси Y, - это вращение вокруг оси X. Для правильной анимации я должен поменять местами значения x и y и отменить значение y. Это на простой выдавленной коробке с ветками. Для каждой анимированной кости в настоящее время я вычисляю ее матрицу локального преобразования (матрицу вращения, умноженную на матрицу перевода), которую затем умножаю родительскую матрицу на текущую локальную матрицу, чтобы получить окончательную преобразованную матрицу относительно ее родителя.

Есть ли секрет правильной обработки вращения коллады? все, что я проверил, показывает правильность значений перед умножением каждой кости на родителя. Замена порядка умножения матриц не принесла заметных улучшений. Буду признателен за любую помощь, в то же время я буду работать над другими частями двигателя, так как я слишком много времени провел в кругу.

1 Ответ

0 голосов
/ 05 апреля 2011

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

...