MDL — различия между версиями
Материал из GTAModding.ru
Solom (обсуждение | вклад) (→PS2-версия) |
|||
Строка 1: | Строка 1: | ||
{{stub}} | {{stub}} | ||
− | + | '''MDL''' – внутренный формат моделей игр от Rockstar Leeds (не путайте его с другими MDL-файлами, содержащимися в прочих видеоиграх), используемый в [[GTA LCS]], [[GTA VCS]] и Manhunt2. Данный формат жестко привязан к игровой платформе (PSP/PS2), т.е. не является кроссплатформенным в отличие от DFF, использовавшегося в предыдущих играх серии GTA до покупки [[RenderWare]] фирмой EA Games. | |
− | + | ||
− | '''MDL''' – внутренный формат моделей (не путайте его с другими MDL-файлами, содержащимися в прочих видеоиграх), используемый в [[GTA LCS]] | + | |
− | + | ||
− | + | ||
− | + | ||
== Основные данные == | == Основные данные == | ||
[[Изображение:Lcs J-Fox tool.jpg|200px|thumb|right|Скриншот программы J-Fox'a]] | [[Изображение:Lcs J-Fox tool.jpg|200px|thumb|right|Скриншот программы J-Fox'a]] | ||
− | PSP-версия MDL была разобрана '''J-Fox''', им же написана программа, читающая структуру MDL-файлов с рендерингом геометрии и UV-координат с текстурами из [[TEX|<code>*.chk</code>]]-файлов. Как и остальной многочисленный софт для GTA: LCS и GTA: VCS, программа от J-Fox не была | + | PSP-версия MDL была разобрана '''J-Fox''', им же написана программа, читающая структуру MDL-файлов с рендерингом геометрии и UV-координат с текстурами из [[TEX|<code>*.chk</code>]]-файлов. Как и остальной многочисленный софт для GTA: LCS и GTA: VCS, программа от J-Fox не была автором выложена в открытый доступ. |
− | PS2-версия MDL разобрана '''AK-73 aka Alex''', им же написан уникальный скрипт к [[3ds_Max|3D Studio Max]] для | + | PS2-версия MDL разобрана '''AK-73 aka Alex''', им же написан уникальный скрипт к [[3ds_Max|3D Studio Max]] для импорта любого [[MDL|<code>*.mdl</code>]]-файла PS2-версии. Подробнее о скрипте читайте в статье о [[MDL importer]]. |
+ | |||
+ | PC-версия MDL никем не разбиралась. Судя по первому впечатлению, Рокстары усложнили формат, сделав его более похожим на форматы движка RAGE. Используется исключительно в Manhunt2. | ||
== Структура == | == Структура == | ||
Строка 27: | Строка 24: | ||
''Pre-Light'' - предварительное освещение модели во время её рендеринга. | ''Pre-Light'' - предварительное освещение модели во время её рендеринга. | ||
− | = | + | '''Структура заголовка MDL (на основе данных Хероманта):''' |
− | + | ||
− | + | 0х00 4b: сигнатура "LDM" | |
+ | 0х04 4b: не используется (всегда = 0) | ||
+ | 0х08 4b: размер MDL | ||
+ | 0х0С 4b: адрес на начало глобалсекции (таблицы адресов для всех подсекций в MDL) | ||
+ | 0х10 4b: адрес на начало глобалсекции (повторяется) | ||
+ | 0х14 4b: количество оффсетов в глобалсекции | ||
+ | 0х18 4b: переход на массив имён (?) | ||
+ | 0х1С 2b: не используется (всегда 0) | ||
+ | 0х1E 2b: тип MDL | ||
+ | |||
+ | 0х20 4b: адрес 1 (секция зависит от типа MDL) | ||
+ | ... | ||
+ | |||
==Atomic== | ==Atomic== | ||
− | + | ||
− | + | 4b: идентификатор секции | |
+ | 4b: переход на первый фрейм | ||
+ | 4b: ... | ||
+ | |||
+ | ===Atomic:Frame=== | ||
+ | |||
+ | 4b: идентификатор | ||
+ | 4b: 0 в первом фрейме либо переход на первый фрейм | ||
+ | 4b: позиция в файле | ||
+ | 4b: позиция в файле-4 | ||
+ | {цикл - чтение матрицы положения пустышки в сцене - 2 раза | ||
+ | 4b: matrix3[1][1] | ||
+ | 4b: matrix3[1][2] | ||
+ | 4b: matrix3[1][3] | ||
+ | 4b: не используется (всегда = 0) | ||
+ | 4b: matrix3[2][1] | ||
+ | 4b: matrix3[2][2] | ||
+ | 4b: matrix3[2][3] | ||
+ | 4b: не используется (всегда = 0) | ||
+ | 4b: matrix3[3][1] | ||
+ | 4b: matrix3[3][2] | ||
+ | 4b: matrix3[3][3] | ||
+ | 4b: не используется (всегда = 0) | ||
+ | 4b: X координата относительно центра модели | ||
+ | 4b: Y координата относительно центра модели | ||
+ | 4b: Z координата относительно центра модели | ||
+ | 4b: 1 (конец строки) | ||
+ | конец цикла} | ||
+ | 4b: переход на следующий фрейм | ||
+ | 4b: 0 | ||
+ | 4b: переход на первый фрейм | ||
+ | 4b: выравнивание (FFFFFFFF) | ||
+ | 4b: 0 | ||
+ | 4b: переход на строку с именем фрейма | ||
+ | 4b: неизвестно | ||
+ | 4b: 0 | ||
==Clump== | ==Clump== | ||
− | + | ||
− | + | 4b: количество адресов либо номер секции (для клампа = 2) | |
+ | 4b: адрес первого фрейма | ||
+ | 4b: адрес первого атомика | ||
+ | |||
+ | ===Clump:Frame=== | ||
+ | |||
+ | 4b: количество адресов либо номер секции (для фрейма = 1) | ||
+ | 4b: переход на продолжение | ||
+ | |||
+ | 8b: нули | ||
+ | 4b: неизвестно | ||
+ | 4b: флаг | ||
==Список материалов== | ==Список материалов== | ||
Строка 51: | Строка 106: | ||
<source lang="scm">id текстуры[2], unknown1[2], множитель для U[2], множитель для V[2], unknown2[2], код оптимизации[10] </source> | <source lang="scm">id текстуры[2], unknown1[2], множитель для U[2], множитель для V[2], unknown2[2], код оптимизации[10] </source> | ||
+ | |||
+ | ====DTZ-версия==== | ||
+ | MDL-файлы, "вшитые" внутри [[DTZ]]-файла. Формат ничем не отличается, поэтому [[MDL importer]] может прочитать DTZ как MDL и импортировать модели. | ||
==Список геометрии== | ==Список геометрии== |
Версия 22:23, 17 мая 2013
MDL – внутренный формат моделей игр от Rockstar Leeds (не путайте его с другими MDL-файлами, содержащимися в прочих видеоиграх), используемый в GTA LCS, GTA VCS и Manhunt2. Данный формат жестко привязан к игровой платформе (PSP/PS2), т.е. не является кроссплатформенным в отличие от DFF, использовавшегося в предыдущих играх серии GTA до покупки RenderWare фирмой EA Games.
Содержание |
Основные данные
PSP-версия MDL была разобрана J-Fox, им же написана программа, читающая структуру MDL-файлов с рендерингом геометрии и UV-координат с текстурами из *.chk
-файлов. Как и остальной многочисленный софт для GTA: LCS и GTA: VCS, программа от J-Fox не была автором выложена в открытый доступ.
PS2-версия MDL разобрана AK-73 aka Alex, им же написан уникальный скрипт к 3D Studio Max для импорта любого *.mdl
-файла PS2-версии. Подробнее о скрипте читайте в статье о MDL importer.
PC-версия MDL никем не разбиралась. Судя по первому впечатлению, Рокстары усложнили формат, сделав его более похожим на форматы движка RAGE. Используется исключительно в Manhunt2.
Структура
Общее для всех *.mdl
- наличие глобального заголовка и atomic-заголовка. Остальные секции *.mdl
строго специфические для каждой из поддерживаемых платформ - PSP или PS2
Основные термины:
Tri-Strips - серия связанных треугольников и вершин. Специально используется в играх данной серии для быстрого рендеринга.
Pre-Light - предварительное освещение модели во время её рендеринга.
Структура заголовка MDL (на основе данных Хероманта):
0х00 4b: сигнатура "LDM" 0х04 4b: не используется (всегда = 0) 0х08 4b: размер MDL 0х0С 4b: адрес на начало глобалсекции (таблицы адресов для всех подсекций в MDL) 0х10 4b: адрес на начало глобалсекции (повторяется) 0х14 4b: количество оффсетов в глобалсекции 0х18 4b: переход на массив имён (?) 0х1С 2b: не используется (всегда 0) 0х1E 2b: тип MDL
0х20 4b: адрес 1 (секция зависит от типа MDL) ...
Atomic
4b: идентификатор секции 4b: переход на первый фрейм 4b: ...
Atomic:Frame
4b: идентификатор 4b: 0 в первом фрейме либо переход на первый фрейм 4b: позиция в файле 4b: позиция в файле-4
{цикл - чтение матрицы положения пустышки в сцене - 2 раза
4b: matrix3[1][1] 4b: matrix3[1][2] 4b: matrix3[1][3] 4b: не используется (всегда = 0) 4b: matrix3[2][1] 4b: matrix3[2][2] 4b: matrix3[2][3] 4b: не используется (всегда = 0) 4b: matrix3[3][1] 4b: matrix3[3][2] 4b: matrix3[3][3] 4b: не используется (всегда = 0) 4b: X координата относительно центра модели 4b: Y координата относительно центра модели 4b: Z координата относительно центра модели 4b: 1 (конец строки)
конец цикла}
4b: переход на следующий фрейм 4b: 0 4b: переход на первый фрейм 4b: выравнивание (FFFFFFFF) 4b: 0 4b: переход на строку с именем фрейма 4b: неизвестно 4b: 0
Clump
4b: количество адресов либо номер секции (для клампа = 2) 4b: адрес первого фрейма 4b: адрес первого атомика
Clump:Frame
4b: количество адресов либо номер секции (для фрейма = 1) 4b: переход на продолжение
8b: нули 4b: неизвестно 4b: флаг
Список материалов
Информация будет добавлена позже...
MDL-версия
Информация будет добавлена позже...
WRLD-версия
Содержится исключительно в *.wrld
и является сжатой по сравнению с *.mdl
-версией для быстрого чтения и экономии памяти консоли. Вместо имён текстур содержит их id (хэши). Заголовок списка геометрии из *.mdl
- количество материалов в *.mdl
+ размер секции в байтах без заголовка. Длина строки списка геометрии = 20 байт. Код строки на условном языке:
id текстуры[2], unknown1[2], множитель для U[2], множитель для V[2], unknown2[2], код оптимизации[10]
DTZ-версия
MDL-файлы, "вшитые" внутри DTZ-файла. Формат ничем не отличается, поэтому MDL importer может прочитать DTZ как MDL и импортировать модели.
Список геометрии
PSP-версия
Информация будет добавлена позже...
PS2-версия
Вся геометрия модели разбита на тристрипсы (поддержка тристрипсов присутствует и в DFF-файлах GTA: SA).
Чтение первого тристрипса в 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. Общее количество тристрипсев в модели так же записано в клампе.