Сповіщення
Очистити все

Формат файлів *.omf


Ранг:
Майстер
Роль:
Гість
Записи:
752
Приєднався:
2 роки тому
 

Формат файлів *.omf

 

У цій статті описано формат omf із ТЧ, ЧН та ЗП.

OMF файли містять скелетні анімації.

Мають формат RIFF. Тобто, файл розбитий на чанки.

Файл omf складається з двох чанків:

0xE - зберігає анімації (обертання, переміщення кісток)

0xF - зберігає Bone Parts та параметри анімацій

Ці чанки можуть з'єднуватися всередині ogf файлів.

Тобто omf файл – це шматок ogf файлу, який винесений у зовнішній файл.

Структура 0xE і 0xF чанків в ogf ідентична тим же чанкам в omf.

Структура чанка 0xE

Цей чанк складається з вкладених чанків.

Перший вкладений чанк – це чанк з ідентифікатором 0x0.

Нульовий чанк зберігає ціле беззнакове 32 бітове число.

Це число вказує на кількість анімацій в файлі omf.

Ідентифікатор кожного наступного чанка на одиницю більший за попередній.

Тобто після вкладеного чанка 0x0 йде чанк 0x1, потім 0x2, 0x3 і т.д.

Усі чанки, що йдуть після 0x0, містять анімації.

Опис вкладеного чанка, який зберігає анімації

На самому початку йде ім'я анімації, яке є рядком, що закінчується нульовим байтом.

Далі йде ціле беззнакове 32-бітове число, яке вказує кількість кадрів анімації.

Наступні дані – це трансформації кісток. Для кожної кістки зберігається обертання, рух, прапори.

На першому місці йдуть прапори. Прапори - це ціле беззнакове 8-бітове число.

Перший біт цього байта вказує, чи переміщення змінним.

Якщо біт дорівнює 1, протягом всіх кадрів переміщення має значення.

Якщо біт дорівнює 0, то переміщення має лише одне значення для всього проміжку анімації.

Це зроблено для оптимізації, щоб не зберігати купу однакових ключів, а натомість мати одне значення.

Другий біт цього байта вказує, чи є обертання статичним (що не змінюється протягом усієї анімації).

Третій біт – це прапор High Quality. Якщо дорівнює 0, то позиція має 8 бітне уявлення або 16 бітне.

Далі йде інформація про обертання.

Те, що буде записано у файлі далі, залежить від прапорів.

Якщо другий біт прапора дорівнює 0, у файлі буде таке:

одне значення обертання як кватерніона з двухбайтовыми знаковими компонентами.

Тобто QXYZ, кожен по 2 байти, у сумі 8 байт.

А якщо другий біт прапора дорівнює 1, далі йде наступне:

crc32 сума у ​​вигляді 4 байтового цілого беззнакового.

А після неї йдуть значення кватерніону обертання кожного кадру.

Формат обертання такий самий, як описаний вище (теж 8 байт).

Наразі йде інформація про переміщення.

Якщо перший біт прапора дорівнює 1, далі слідує 32 бітне ціле беззнакове число, яке є crc32 сумою.

Після йде 3 восьмибітні числа, які вказують позицію кістки по осях x, y, z.

Ці позиції записані кожному кадру.

Тобто зчитувати позиції потрібно у циклі, що повторюється стільки разів, скільки кадрів містить анімація.

Після всіх цих позицій йдуть дані про початкові умови переміщення:

Амплітуда чи розмір переміщення.

Це 3 числа float (4 байти кожне).

А далі йде початкове значення переміщення. Також 3 числа float.

Ці початкові умови зберігаються у єдиному екземплярі кожної кістки у цій анімації.

Тобто ці значення не змінюються протягом усієї анімації.

Якщо перший біт прапора дорівнює 0, то всіх кадрів йде одне значення переміщення.

Це переміщення зберігається у 3 числах float (4 байти кожне).

Нижче написано псевдокод, який описує одну анімацію:

name = string 
length = uint32
for bone in bones {
flags = uint8
translate_present = flags(0) // get bit 0
rotate_absent = flags(1) // get bit 1
high_quality = flags(2) // get bit 2
if rot
quaternion = int16, int16, int16, int16 // Q, X, Y, Z
} else {
motion_crc32 = int32
for (i = 0, i <length, i++) {
quaternion = int16, int16, int16, int16 // Q, X, Y, Z
}
}
if translate_present {
motion_crc32 = int32
if high_quality {
for (i=0, i<length, i++) {
translation = int16, int16, int16 // X, Y, Z
}
} else {
for (i =0, i<length, i++) {
translation = int8, int8, int8 // X, Y, Z
}
}
translate_size = float, float, float // X, Y, Z
translate_init = float, float, float // X , Y, Z
} else {
translate = float, float, float // X, Y, Z
}

Структура чанка 0xF

Зберігає bone parts та параметри анімацій.

Нижче наведено код, який описує цей чанк.

params_version = uint16 // версія формату параметрів 
partition_count = uint16 // кількість bone parts
for (i=0, i<partition_count, i++) {
partition_name = string // ім'я bone part
bone_count = uint16 // кількість кісток у даному bone part
for ( j=0, j<bone_count, j++) {
if params_version == 3 {
bone_name = string // ім'я кістки
bone_id = uint32 // ідентифікатор кістки
}
}
motion_count = uint16 // кількість анімацій
for (j=0, i<motion_count, j++) {
// параметри анімації
motion_name = string
motion_flags = uint32
bone_or_part = uint16
motion = uint16 // ідентифікатор анімації з чанка 0xE
speed = float32 power
= float32 accrue
=
float32 fall

   
Цитата