Формат файла входной анимации — MRTK2

Общая структура

Двоичный файл входной анимации начинается с 64-разрядного целочисленного магического числа. Значение этого числа в шестнадцатеричной нотации равно 0x6a8faf6e0f9e42c6 и может использоваться для определения допустимых входных файлов анимации.

Следующие восемь байт — это два значения Int32, объявляющие основной и дополнительный номер версии файла.

Остальная часть файла занята данными анимации, которые могут меняться между номерами версий.

Section Тип
Магическое число Int64
Основной номер версии Int32
Дополнительный номер версии Int32
Данные анимации см. раздел версии

Версия 1.1

Входные данные анимации состоят из трех логических значений, которые указывают, содержит ли анимация данные камеры, руки и взгляда, за которыми следует последовательность кривых анимации. Представленные кривые зависят от значений этих логических значений. Каждая кривая может иметь разное количество ключевых кадров.

Section Тип Примечания
Имеет позу камеры Логическое
Имеет данные о руках Логическое
Имеет взгляд Логическое
Камера Кривые положения Только в том случае, если параметр Has Camera Pose имеет значение true
Стрелка слева Логическая кривая Только в том случае, если имеет значение True
Правая отслеченная рука Логическая кривая Только в том случае, если имеет значение True
Сжатие руки влево Логическая кривая Только в том случае, если имеет значение True
Сжатие руки вправо Логическая кривая Только в том случае, если имеет значение True
Суставы рук слева Кривые совместного положения Только в том случае, если имеет значение True
Суставы рук справа Кривые совместного положения Только в том случае, если имеет значение True
Направление взгляда Кривые луча] Только в том случае, если параметр Имеет взгляд имеет значение true

Версия 1.0

Входные данные анимации состоят из последовательности кривых анимации. Число и значение кривых анимации фиксировано, но каждая кривая может иметь разное количество ключевых кадров.

Section Тип
Камера Кривые положения
Стрелка слева Логическая кривая
Правая отслеченная рука Логическая кривая
Сжатие руки влево Логическая кривая
Сжатие руки вправо Логическая кривая
Суставы рук слева Кривые совместного положения
Суставы рук справа Кривые совместного положения

Кривые совместного положения

Для каждой руки хранится последовательность кривых анимации. Количество соединений фиксировано, и для каждого соединения сохраняется набор кривых позы.

Section Тип
Нет Кривые положения
Запястье Кривые положения
Palm Кривые положения
ThumbMetacarpalJoint Кривые положения
ThumbProximalJoint Кривые положения
ThumbDistalJoint Кривые положения
Отбивная подсказка Кривые положения
IndexMetacarpal Кривые положения
IndexKnuckle Кривые положения
IndexMiddleJoint Кривые положения
IndexDistalJoint Кривые положения
Подсказка по индексу Кривые положения
MiddleMetacarpal Кривые положения
MiddleKnuckle Кривые положения
MiddleMiddleJoint Кривые положения
MiddleDistalJoint Кривые положения
MiddleTip Кривые положения
RingMetacarpal Кривые положения
RingKnuckle Кривые положения
RingMiddleJoint Кривые положения
RingDistalJoint Кривые положения
Мелодия звонка Кривые положения
ПинкиМетакарпал Кривые положения
PinkyKnuckle Кривые положения
PinkyMiddleJoint Кривые положения
PinkyDistalJoint Кривые положения
PinkyTip Кривые положения

Кривые положения

Кривые положения — это последовательность из 3 кривых анимации для вектора положения, за которой следуют 4 кривые анимации для кватерниона поворота.

Section Тип
Позиция X Кривая с плавающей запятой
Позиция Y Кривая с плавающей запятой
Позиция Z Кривая с плавающей запятой
Поворот X Кривая с плавающей запятой
Поворот Y Кривая с плавающей запятой
Поворот Z Кривая с плавающей запятой
Поворот W Кривая с плавающей запятой

Кривые луча

Кривые луча — это последовательность из 3 кривых анимации для исходного вектора, за которой следует 3 кривые анимации для вектора направления.

Section Тип
Источник X Кривая с плавающей запятой
Источник Y Кривая с плавающей запятой
Источник Z Кривая с плавающей запятой
Направление X Кривая с плавающей запятой
Направление Y Кривая с плавающей запятой
Направление Z Кривая с плавающей запятой

Кривая с плавающей запятой

Кривые с плавающей запятой — это полноценные кривые Безье с переменным количеством опорных кадров. Каждый ключевой кадр хранит значение времени и кривой, а также касательные и весовые коэффициенты в левой и правой части каждого ключевого кадра.

Section Тип
Режим предварительной оболочки Int32, режим переноса
Режим после переноса Int32, режим переноса
Число опорных кадров Int32
Опорные кадры Плавающий ключевой кадр

Плавающий ключевой кадр

В ключевом кадре с плавающей запятой хранятся значения тангенса и веса вместе с базовым временем и значением.

Section Тип
Time Float32
Значение Float32
InTangent Float32
OutTangent Float32
InWeight Float32
OutWeight Float32
WeightedMode Int32, взвешанный режим

Логическая кривая

Логические кривые — это простые последовательности значений включения и выключения. На каждом ключевом кадре значение кривой немедленно вернется.

Section Тип
Режим предварительной оболочки Int32, режим переноса
Режим после переноса Int32, режим переноса
Число опорных кадров Int32
Опорные кадры Логический ключевой кадр

Логический ключевой кадр

В логическом ключевом кадре хранятся только время и значение.

Section Тип
Time Float32
Значение Float32

Режим переноса

Семантика режимов до и после обтекания соответствует определению Unity WrapMode . Они представляют собой сочетание следующих битов:

Значение Значение
0 По умолчанию: считывает режим повтора по умолчанию, настроенный выше.
1 Один раз: когда время достигнет конца клипа анимации, клип автоматически прекратит воспроизведение, а время будет сброшено до начала клипа.
2 Цикл. Когда время достигнет конца клипа анимации, время будет продолжаться в начале.
4 Пинг-понг: когда время достигает конца клипа анимации, время будет пинг-понг между началом и концом.
8 ClampForever: воспроизводит анимацию. Когда он достигнет конца, он будет продолжать играть последний кадр и никогда не перестать играть.

Взвешанный режим

Семантика взвешенных режимов соответствует определению Unity WeightedMode .

Значение Значение
0 Нет: при вычислении сегментов кривой исключите как inWeight, так и outWeight.
1 В: включите inWeight при вычислении предыдущего сегмента кривой.
2 Out: включите outWeight при вычислении следующего сегмента кривой.
3 Оба: включите inWeight и OutWeight при вычислении сегментов кривой.