Лекция #9. Скелетная анимация, эффективные реализации. Морфинг. [Лектор - IronPeter]
Автор: Арсений Капулкин
Disclaimer: посты передвинуты местами, обсуждение разбито на связные куски. полный лог
[22:00] <IronPeter> ну что, поехали.
[22:01] <IronPeter> значит, хочется нам, чтобы модельки красиво анимировались.
[22:01] <IronPeter> аниме - это душа с греческого. Жили чтобы, шевелились.
[22:02] <IronPeter> ну вот придумали такую штуку.
[22:02] <IronPeter> возьмем много матриц...
[22:02] <IronPeter> не так много, как вершин в модельке, но порядочно.
[22:03] <IronPeter> и для каждой вершинки укажем те матрицы, которые на нее влияют.
[22:03] <IronPeter> а вместе с матрицей - ее вес.
[22:03] <IronPeter> и, ясно дело, чтобы сумма весов была равна единице.
[22:03] <IronPeter> теперь мы ежели матрицу какую-то изменим, то вершинки, на которые она влияет, куда-то поедут.
[22:04] <IronPeter> Вопрос, почему скелетная анимация.
[22:04] <IronPeter> потому что удобно... удобно эти матрицы делать иерархическими.
[22:05] <IronPeter> да, вопрос сразу, какие матрицы...
[22:05] <IronPeter> достаточно 3x4
[22:05] <IronPeter> вращение + смещение.
[22:05] <IronPeter> причем со смещением все ясно с начала и до конца, а вот вращение часто хранят не как матрицу...
[22:06] <IronPeter> а, скажем, как 3 эйлеровых угла или ось и угол вращения, или кватернион.
[22:07] <IronPeter> иногда хранят еще scale
[22:07] <IronPeter> или допускают, чтобы матрица была косой, не просто вращением.
[22:07] <IronPeter> это дело вкуса...
[22:08] <IronPeter> ну ладно, вот эти самые матрицы на самом деле иерархические.
[22:08] <IronPeter> выглядит эта иерархия примерно таким образом - к телу прикреплены руки-ноги-голова...
[22:08] <IronPeter> руки гнутся в локтях etc.
[22:09] <IronPeter> в пакетах моделирования этот скелет удобно визуализуется такими соединенными палочками...
[22:10] <IronPeter> поскольку это дело рисуют художники, то надо сразу озаботится вопросом экспорта :)
[22:10] <IronPeter> Я очень сильно рекомендую Collada
[22:10] <IronPeter> https://collada.org/public_forum/welcome.php
[22:11] <IronPeter> это открытый и удобный формат
[22:11] <IronPeter> в основе XML - текстовый формат.
[22:11] <IronPeter> естественно, было бы сумасшествием грузить именно его в игру.
[22:12] <IronPeter> его следует рассматривать как удобный промежуточный формат, откуда уже строить свои бинарные файлы.
[22:13] <IronPeter> Вот сейчас я попытаюсь рассказать, какие данные лежат в этом Коллада файле
[22:13] <IronPeter> как именно они структурированы.
[22:13] <IronPeter> на самом деле это некоторая универсалия.
[22:13] <IronPeter> то есть данные примерно так представлены и в пакетах моделирования.
[22:14] <IronPeter> Итак... во-первых, в файле хранится скелет.
[22:14] <IronPeter> сейчас будет адский слив - скелет ангела из Heroes 5 :)
[22:15] <IronPeter> сейчас его залью...
[22:15] <IronPeter> http://www.everfall.com/paste/id.php?cd6owqhnrzf3
[22:16] <IronPeter> вот этот ангел.
[22:16] <IronPeter> реально можно разглядеть всю иерархию косточек...
[22:16] <IronPeter> Hip-Chest-Neck etc
[22:17] <IronPeter> узлы скелета - node в терминологии коллады.
[22:17] <IronPeter> замечаем, что в каждой ноде есть преобразования
[22:17] <IronPeter> смещение и повороты
[22:18] <IronPeter> В реальности, в пакетах моделирования, анимация так и представлена.
[22:18] <IronPeter> то есть не просто матрица, а стек преобразований в каждой ноде.
[22:19] <IronPeter> в экспортере Коллады есть опция его коллапсить в одну матрицу ( bake )
[22:19] <IronPeter> анимируются именно вот эти каналы...
[22:19] <IronPeter> разные rotateZ и прочая.
[22:19] <IronPeter> те цифры, которые вы видите - это начальное положение скелета.
[22:20] <IronPeter> соответственно имеются аниматоры.
[22:20] <IronPeter> это пара "массив ключей по времени"-"массив скалярных значений"
[22:21] <IronPeter> c правилом, как интерполировать - обычно это или кусочно-линейная интерполяция, или кубические сплайны
[22:22] <IronPeter> Значения действительно обычно скалярные.
[22:23] <IronPeter> то есть анимируется какой-то атрибут, скажем отдельно <translate sid="translate">0 9.25409e-002 0</translate>
[22:23] <IronPeter> компонента x или y или z у этого вектора.
[22:23] <IronPeter> так удобно, потому что художники анимируют часть данных.
[22:23] <IronPeter> именно покомпонентно.
[22:23] <IronPeter> или один угол, или одна компонента смещения etc.
[22:24] <IronPeter> вот теперь надо решиться, в каком формате будете читать данные в игре.
[22:24] <IronPeter> конечно вы можете взять и честно, раз в 1/30 секунды, скажем, посчитать все матрицы в скелете.
[22:25] <IronPeter> и не заморачиваясь ни с какими отдельными каналами и прочим хранить этот большой массив матриц на каждый кадр.
[22:26] <IronPeter> Это жрет кучу памяти.
[22:26] <IronPeter> но быстро и просто.
[22:26] <IronPeter> в реальности многие параметры не анимируются.
[22:27] <IronPeter> Поэтому те самые сплайны, которые отдельно на скалярную компоненты, очень удобны.
[22:27] <IronPeter> Соответственно встает вопрос правильного сжатия анимаций ( доверимся ли мы тем сплайнам, которые уже есть в Колладе?)
[22:28] <IronPeter> Вот тем сплайнам особо доверять не стоит на самом деле.
[22:28] <IronPeter> Какие-то они глупые... Хотя и отражают 1-1 то, что видят художники в Майке или Максе.
[22:29] <IronPeter> Типичный экспортер анимаций сэмплит эти матрицы, скажем, 30 раз в секунду
[22:29] <IronPeter> потом уже пытается приблизить полученные дискретные наборы значений сплайнами сам.
[22:29] <IronPeter> Ищет неанимированные каналы etc.
[22:30] <IronPeter> На самом деле вопрос сжатия анимаций очень неприятен, поскольку эти отдельные сплайны совершенно недружелюбны к кешу.
[22:30] <IronPeter> надо в массиве ключей найти ключи, проинтерполировать...
[22:30] <IronPeter> уже в процессе проигрывания анимации.
[22:31] <IronPeter> но, по большому счету, ничего лучшего сплайнов не придумали.
[22:31] <IronPeter> несжатая анимация уж очень тяжелая.
[22:32] <IronPeter> также на этапе экспорта надо решиться, что мы будем хранить.
[22:32] <IronPeter> достаточно ли нам вращений, нужны ли scale
[22:32] <IronPeter> будут ли scale неоднородными etc.
[22:32] <IronPeter> Если художники будут говорить, что им нужны неравномерные скейлы как кровь из носа - говорите, что в UE3 их нет :)
[22:33] <IronPeter> там вообще в анимациях только повороты.
[22:33] <IronPeter> так вот, если поворотов достаточно, то очень удобны кватернионы.
[22:34] <IronPeter> как средство заменить матрицы.
[22:34] <IronPeter> просто потому, что меньше места занимают.
[22:34] <IronPeter> и потому, что кватернионы можно легко интерполировать.
[22:35] <IronPeter> примерно в таком стиле t * q1 + ( 1 - t ) * q2
[22:35] <IronPeter> потом надо нормализовать, то есть поделить на корень из квадрата длины.
[22:36] <IronPeter> матрицы тоже можно сложить, но из двух вращений получится непонятно что...
[22:36] <IronPeter> и непонятно, как из него делать вращение.
[22:36] <IronPeter> когда будете работать с кватернионами, не забывайте
[22:37] <IronPeter> что одному вращению соответствуют ровно два кватерниона. q и -q
[22:37] <IronPeter> поэтому между двумя ключевыми кадрами ( или где-то на сплайне )
[22:37] <IronPeter> вполне может сложится ситуация, что в формуле t * q1 + ( 1 - t ) * q2
[22:38] <IronPeter> q2 на самом деле почти то же самое, что -q1
[22:38] <IronPeter> поэтому грамотная линейная интерполяция выглядит примерно так:
[22:39] <IronPeter> float sign = qot( q1, q2 ) < 0.0f ? -1.0f : 1.0f;
[22:39] <IronPeter> а далее return sign * t * q1 + ( 1 - t ) * q2
[22:39] <IronPeter> так, прошло 38 минут из двух часов :)
[22:40] <IronPeter> 10 минутный перерыв, обсуждения и вопросы.
[22:40] <kas> майковский экспорт от максовкого отличается в коладе?
[22:40] <kas> т.е. данные совсем единообразны?
[22:41] <IronPeter> ну есть экспортер, я не ковырял, но результат одинаковый.
[22:41] <IronPeter> то есть коллада - это жесткая структура XML документа, которая контролируется формальной XSD схемой.
[22:41] <Nikolay> а между версиями колоды результат не изменяеться
[22:40] <Zeux> можно прокомментировать то, что "одному вращению соответствуют ровно два кватерниона"? т.е. почему?
[22:41] <IronPeter> Zeus, ща формулу покажу...
[22:42] <IronPeter> http://www.euclideanspace.com/maths/geometry/rotations/conversion… rix/index.htm
[22:42] <IronPeter> вот смотрите, в формуле встречаются выражения вида qy*qw
[22:42] <IronPeter> если знак сменить, то матрица не изменится.
[22:43] <IronPeter> а реально это следствие того, что вращение вокруг оси x,y,z на угол альфа - то же самое, что вращение вокруг оси -x,-y,-z на -alpha
[22:43] <Zeux> ага, ясно. спасибо.
[22:41] <Chip> ещё комментарий: имхо, XML сильно избыточный формат
[22:42] <Zeux> Chip: так сказано, что это лишь промежуточное представление
[22:44] <Chip> Zeux, я правильно понял что XML нужен лишь для удобства экспорта из 3D редакторов?
[22:44] <Zeux> Chip: да.
30 января 2006 (Обновление: 5 фев 2006)
Комментарии [2]