MDL
Материал из GTAModding.ru
Версия от 03:30, 7 сентября 2012; Solom (обсуждение | вклад)
MDL – внутренный формат моделей (не путайте его с другими MDL-файлами, содержащимися в прочих видеоиграх), используемый в GTA LCS и GTA VCS. Данный формат жестко привязан к игровой платформе (PSP/PS2), т.е. не является кроссплатформенным в отличие от DFF, использовавшегося в предыдущих играх серии GTA до покупки RenderWare фирмой EA Games.
Используется в ресурсах, обобщенных расширением .MDL и .WRLD.
Содержание |
Основные данные
PSP-версия MDL была разобрана J-Fox, им же написана программа, читающая структуру MDL-файлов с рендерингом геометрии и UV-координат с текстурами из *.chk
-файлов. Как и остальной многочисленный софт для GTA: LCS и GTA: VCS, программа от J-Fox не была выпущена.
PS2-версия MDL разобрана AK-73 aka Alex, им же написан уникальный скрипт к 3D Studio MAX для загрузки любого *.mdl
-файла PS2-версии (поддерживается как GTA LCS, так и и GTA VCS).
Структура
Общее для всех *.mdl
- наличие глобального заголовка и atomic-заголовка. Остальные секции *.mdl
строго специфические для каждой из поддерживаемых платформ - PSP или PS2
Основные термины:
Tri-Strips - серия связанных треугольников и вершин. Специально используется в играх данной серии для быстрого рендеринга.
Pre-Light - предварительное освещение модели во время её рендеринга.
Глобальный заголовок
Информация будет добавлена позже...
Atomic
Информация будет добавлена позже...
Clump
Информация будет добавлена позже...
Список материалов
Информация будет добавлена позже...
MDL-версия
Информация будет добавлена позже...
WRLD-версия
Содержится исключительно в *.wrld
и является сжатой по сравнению с *.mdl
-версией для быстрого чтения и экономии памяти консоли. Вместо имён текстур содержит их id (хэши). Заголовок списка геометрии из *.mdl
- количество материалов в *.mdl
+ размер секции в байтах без заголовка. Длина строки списка геометрии = 20 байт. Код строки на условном языке:
id текстуры[2], unknown1[2], множитель для U[2], множитель для V[2], unknown2[2], код оптимизации[10]
Список геометрии
PSP-версия
Информация будет добавлена позже...
PS2-версия
Вся геометрия модели разбита на тристрипсы (поддержка тристрипсов присутствует и в DFF-файлах GTA: SA).
Чтение первого тристрипса в [[MDL|*.mdl]
начинается сразу после списка материалов. Началом чтения геометрии тристрипса служит флаг 6С018000. За флагом 2 раза повторяется количество вершинок в тристрипсе. Затем идёт технический сектор 40404020, который необходим для движка (для импорта модели он не важен).
Далее идут собственно блоки, содержащие элементы модели:
- Блок 79 - Гео - содержит все координаты вершинок в тристрипсе. Одна координата закодирована 2мя байтами и представляет собой обычный множитель на размер ограничивающей модель коробки из клампа. Размер блока = заголовок блока (4 байта) + (XYZ (6 байтов) * количество вершинок в тристрипсе).
Блок геометрии заканчивается техническим блоком 50505020, который необходим для движка (для импорта модели он не важен).
- Блок 76 - UV - содержит все координаты UV-маппинга в тристрипсе. Одна координата закодирована 1м байтом, вычисляется делением на 255 и умножением на 2 (иногда умножение на 2 не требуется - импортёр должен проверять получившуюся цифру после деления). Размер блока = заголовок блока (4 байта) + (UV (2 байта) * количество вершинок в тристрипсе).
- Блок 6F - Прилайт GTA Stories - содержит RGBA для предварительного освещения вершинки. Используется только в GTA LCS и GTA VCS. Вычисляется по хитрой формуле AK-73. Размер блока = заголовок блока (4 байта) + (RGBA (2 байта) * количество вершинок в тристрипсе).
- Блок 6A - Нормали - содержит все координаты векторов нормалей в трипстрипсе. Одна координата закодирована одним байтом и вычисляется делением на 127. Размер блока = заголовок блока (4 байта) + (XYZ (3 байта) * количество вершинок в тристрипсе).
- Блок 6С - Скиннинг - содержит таблицу весов вершинок для их анимации. Это id косточки (1 байт) + её вес (3 байта). Соответственно, каждая вершинка содержит 4 id (т.е. в анимации она управляется 4 косточками). Размер блока = заголовок блока (4 байта) + ((id_weight (4 байта) * 4) * количество вершинок в тристрипсе.
Чтение следующего тристрипса начинается сразу же за флагом окончания тристрипса - 14000006. Общее количество тристрипсев в модели так же записано в клампе.