MDL — различия между версиями

Материал из GTAModding.ru
Перейти к: навигация, поиск
Строка 44: Строка 44:
  
 
   4b: тип секции
 
   4b: тип секции
   4b: 0 в первом фрейме либо переход на первый фрейм
+
   4b: смещение на родительский фрейм (у первого = 0)
  4b: позиция в файле
+
   4b: смещение на первый Atomic в цикле чтения привязанной к фрейму геометрии
  4b: позиция в файле-4
+
   4b: смещение на последний Atomic в цикле чтения привязанной к фрейму геометрии
{цикл - чтение матрицы положения пустышки в сцене - 2 раза
+
   matrix4x4: матрица трансформации для фрейма и привязанной к ней геометрии относительно родительского фрейма
  4b: matrix3[1][1]
+
   (для вычисления глобальной трансформации фрейма необходимо умножить данную матрицу на матрицу родительского фрейма)  
  4b: matrix3[1][2]
+
   matrix4x4: глобальная матрица трансформации для фрейма или привязанной к ней геометрии
  4b: matrix3[1][3]
+
   (в LCS у моделей со скелетом обычно единичная матрица)
  4b: не используется (всегда = 0)
+
   4b: смещение на дочерний фрейм
   4b: matrix3[2][1]
+
   4b: смещение на фрейм одного уровня в иерархии с данным фреймом (братский фрейм)
   4b: matrix3[2][2]
+
   4b: смещение на главный фрейм
   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: выравнивание (FFFFFFFF)
 
   4b: 0
 
   4b: 0
   4b: 0 или переход на Clump:FrameList:Extension:Frame
+
   4b: смещение на имя фрейма (если 0 - фрейм безымянный)
 
   4b: неизвестно
 
   4b: неизвестно
  
Строка 83: Строка 69:
 
   4b: 0
 
   4b: 0
 
   4b: выравнивание (AAAAAAAA)
 
   4b: выравнивание (AAAAAAAA)
 +
 +
==Clump:GeometryHeader:Struct==
 +
  4b float: Координата Х ограничивающей модель сферы
 +
  4b float: Координата Y ограничивающей модель сферы
 +
  4b float: Координата Z ограничивающей модель сферы
 +
  4b float: Радиус ограничивающей модель сферы
 +
  2b: размер модели в байтах
 +
  2b: количество материалов в модели (делить данное число на 16 нацело)
 +
  4b: флаг, по которому движок игры определяет какие дополнительные секции параметров вертексов присутствуют в модели (нормали, прилайт, скиннинг, UV развертка)
 +
  16b: неизвестно
 +
  4b float: множитель координаты X (ScaleFactorX)
 +
  4b float: множитель координаты Y (ScaleFactorY)
 +
  4b float: множитель координаты Z (ScaleFactorZ)
 +
  4b float: смещение координаты X (TranslateFactorX)
 +
  4b float: смещение координаты Y (TranslateFactorY)
 +
  4b float: смещение координаты Z (TranslateFactorZ) 
  
 
==Atomic==
 
==Atomic==
Строка 149: Строка 151:
 
Далее идут собственно блоки, содержащие элементы модели:
 
Далее идут собственно блоки, содержащие элементы модели:
  
* Блок 79 - '''Гео''' - содержит все координаты вершинок в тристрипсе. Одна координата закодирована 2мя байтами и представляет собой обычный множитель на размер ограничивающей модель коробки из клампа. Размер блока = заголовок блока (4 байта) + (XYZ (6 байтов) * количество вершинок в тристрипсе).
+
* Блок 79 - '''Гео''' - содержит все координаты вершинок в тристрипсе. Одна координата закодирована типом Short (2b) #signed и вычиляется следующим образом:
 +
 
 +
  (maxscript)
 +
  CoordX = (CoordX as Float)/32768*ScaleFactorX+TranslateFactorX
 +
  аналогично Y и Z
 +
 
 +
Размер блока = заголовок блока (4 байта) + (XYZ (6 байтов) * количество вершинок в тристрипсе).
  
 
Блок геометрии заканчивается техническим блоком 50505020, который необходим для движка (для импорта модели он не важен).
 
Блок геометрии заканчивается техническим блоком 50505020, который необходим для движка (для импорта модели он не важен).
  
* Блок 76 - '''UV''' - содержит все координаты UV-маппинга в тристрипсе. Одна координата закодирована 1м байтом, вычисляется делением на 255 и умножением на 2 (иногда умножение на 2 не требуется - импортёр должен проверять получившуюся цифру после деления). Размер блока = заголовок блока (4 байта) + (UV (2 байта) * количество вершинок в тристрипсе).
+
* Блок 76 - '''UV''' - содержит все координаты UV-маппинга в тристрипсе. Одна координата закодирована типом Byte (1b) #unsigned, вычисляется делением на 255 для моделей из WRLD/LVZ или делением на 128 для MDL. Размер блока = заголовок блока (4 байта) + (UV (2 байта) * количество вершинок в тристрипсе).
  
* Блок 6F - '''Прилайт Stories''' - содержит RGBA для предварительного освещения вершинки. Используется только в [[GTA LCS]] и [[GTA VCS]]. Вычисляется по хитрой формуле AK-73. Размер блока = заголовок блока (4 байта) + (RGBA (2 байта) * количество вершинок в тристрипсе).
+
* Блок 6F - '''Прилайт Stories''' - содержит RGBA для предварительного освещения вершинки. Используется только в [[GTA LCS]] и [[GTA VCS]]. Хранится в 16 битном формате RGBA 5551. Размер блока = заголовок блока (4 байта) + (RGBA (2 байта) * количество вершинок в тристрипсе).
  
* Блок 6Е - '''Прилайт Manhunt 2''' - содержит RGBA для предварительного освещения вершинки. Используется только в [[Manhunt 2]]. Каждый цвет закодирован одним байтом. Размер блока = заголовок блока (4 байта) + (RGBA (4 байта) * количество вершинок в тристрипсе).
+
* Блок 6Е - '''Прилайт Manhunt 2''' - содержит RGBA для предварительного освещения вершинки. Используется только в [[Manhunt 2]]. Каждый цвет закодирован одним байтом. Размер блока = заголовок блока (4 байта) + (RGBA (4 байта) * количество вершинок в тристрипсе). Считывать необходимо как BGRA
  
* Блок 6A - '''Нормали''' - содержит все координаты векторов нормалей в трипстрипсе. Одна координата закодирована одним байтом и вычисляется делением на 127. Размер блока = заголовок блока (4 байта) + (XYZ (3 байта) * количество вершинок в тристрипсе).
+
* Блок 6A - '''Нормали''' - содержит все координаты векторов нормалей в трипстрипсе. Одна координата закодирована типом Byte (1b) #signed и вычисляется делением на 127. Размер блока = заголовок блока (4 байта) + (XYZ (3 байта) * количество вершинок в тристрипсе).
  
* Блок 6С - '''Скиннинг''' - содержит таблицу весов вершинок для их анимации. Это id косточки (1 байт) + её вес (3 байта). Соответственно, каждая вершинка содержит 4 id (т.е. в анимации она управляется 4 косточками). Размер блока = заголовок блока (4 байта) + ((id_weight (4 байта) * 4) * количество вершинок в тристрипсе.
+
* Блок 6С - '''Скиннинг''' - содержит таблицу весов вершинок для их анимации. Это id косточки (1 байт, необходимо делить на 4 нацело) + её вес (3 байта). Соответственно, каждая вершинка содержит 4 id (т.е. в анимации она управляется 4 косточками). Размер блока = заголовок блока (4 байта) + ((id_weight (4 байта) * 4) * количество вершинок в тристрипсе.
  
 
Чтение следующего тристрипса начинается сразу же за флагом окончания тристрипса - 14000006. Общее количество тристрипсев в модели так же записано в клампе.
 
Чтение следующего тристрипса начинается сразу же за флагом окончания тристрипса - 14000006. Общее количество тристрипсев в модели так же записано в клампе.

Версия 00:10, 22 марта 2014

MDL – внутренный формат моделей игр от Rockstar Leeds (не путайте его с другими MDL-файлами, содержащимися в прочих видеоиграх), используемый в GTA LCS, GTA VCS и Manhunt2. Данный формат жестко привязан к игровой платформе (PSP/PS2), т.е. не является кроссплатформенным в отличие от DFF, использовавшегося в предыдущих играх серии GTA до покупки RenderWare фирмой EA Games.

Содержание

Основные данные

Скриншот программы J-Fox'a

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.


Структура

Общее для всех *.mdl - наличие глобального заголовка и atomic-заголовка. Остальные секции *.mdl строго специфические для каждой из поддерживаемых платформ - PSP или PS2

Структура глобального заголовка MDL (на основе данных Хероманта):

  0х00 4b: сигнатура "LDM"
  0х04 4b: флаг MultiMDL/WRLD (0 - MDL содержит 1 модель; 1 - MDL содержит много моделей)
  0х08 4b: размер MDL
  0х0С 4b: переход на таблицу смещений для распределения файла в памяти (глобалсекция на жаргоне)
  0х10 4b: переход на таблицу смещений для распределения файла в памяти (повторяется)
  0х14 4b: количество смещений в глобалсекции
  0х18 4b: адрес на конец глобалсекции (на последний оффсет в таблице адресов)
  0х1С 2b: не используется (всегда 0)
  0х1E 2b: тип чтения MDL (0х01 - модель со скинингом, 0хХС - 1цветное авто, 0хХЕ - 0цветное авто 0х1Х - 2цветное авто и т.д.)

Заголовок MDL

  0х20 4b: адрес 1 (зависит от типа MDL)
  0x24 4b: адрес 2 или количество добавочных элементов в модели (зависит от типа MDL)
  0х28 4b: переход на добавочные элементы в модели (зависит от типа MDL)
  0х2С 212b: массив переходов на материалы, перекрашиваемые цветами carcols.dat (зависит от типа MDL)
  

Clump:Struct

 4b: тип секции
 4b: переход на первый фрейм
 4b: переход на первый атомик

Clump:FrameList:Struct

 4b: тип секции
 4b: смещение на родительский фрейм (у первого = 0)
 4b: смещение на первый Atomic в цикле чтения привязанной к фрейму геометрии
 4b: смещение на последний Atomic в цикле чтения привязанной к фрейму геометрии
 matrix4x4: матрица трансформации для фрейма и привязанной к ней геометрии относительно родительского фрейма 
 (для вычисления глобальной трансформации фрейма необходимо умножить данную матрицу на матрицу родительского фрейма) 
 matrix4x4: глобальная матрица трансформации для фрейма или привязанной к ней геометрии 
 (в LCS у моделей со скелетом обычно единичная матрица)
 4b: смещение на дочерний фрейм
 4b: смещение на фрейм одного уровня в иерархии с данным фреймом (братский фрейм)
 4b: смещение на главный фрейм
 4b: выравнивание (FFFFFFFF)
 4b: 0
 4b: смещение на имя фрейма (если 0 - фрейм безымянный)
 4b: неизвестно

Clump:TextureList:Struct

 4b: тип секции
 4b: 0
 4b: 1
 4b: переход на Clump:TextureList:String
 4b: количество текстур
 4b: количество текстур (повторяется)
 4b: 0
 4b: выравнивание (AAAAAAAA)

Clump:GeometryHeader:Struct

 4b float: Координата Х ограничивающей модель сферы
 4b float: Координата Y ограничивающей модель сферы
 4b float: Координата Z ограничивающей модель сферы
 4b float: Радиус ограничивающей модель сферы
 2b: размер модели в байтах
 2b: количество материалов в модели (делить данное число на 16 нацело)
 4b: флаг, по которому движок игры определяет какие дополнительные секции параметров вертексов присутствуют в модели (нормали, прилайт, скиннинг, UV развертка)
 16b: неизвестно
 4b float: множитель координаты X (ScaleFactorX)
 4b float: множитель координаты Y (ScaleFactorY)
 4b float: множитель координаты Z (ScaleFactorZ)
 4b float: смещение координаты X (TranslateFactorX)
 4b float: смещение координаты Y (TranslateFactorY)
 4b float: смещение координаты Z (TranslateFactorZ)  

Atomic

Информация будет добавлена позже...

Список материалов

MDL-версия

12b: point3 X Y Z (не используется)
4b: множитель U
4b: множитель V
4b: цвет материала (не используется)
4b: переход на начало тристрипцев (относительно секции геометрии)
2b: количество тристрипцев в материале
2b: номер текстуры из TextureList

WRLD-версия

Содержится исключительно в *.wrld и является сжатой по сравнению с *.mdl-версией для быстрого чтения и экономии памяти консоли. Вместо имён текстур содержит их id (хэши).

Заголовок WRLD версии PS2:

 количество материалов[2], размер секции материалов[2]


Заголовок WRLD версии PSP:

 количество материалов[4], флаг 1[1], флаг 2[1], флаг 3[1], флаг 4[1]


Длина строки списка геометрии LCS PS2: = 22 байт.

 id текстуры[2], Размер тристрипа[2], множитель для U[2], множитель для V[2], unknown2[2], код оптимизации[12]


Длина строки списка геометрии VCS PS2: = 24 байт.

 размер тристрипа х2[4], id текстуры[2], множитель для U[2], множитель для V[2], unknown2[2], код оптимизации[12]
 для получения точного размера тристрипа нужно разделить "размер тристрипа х2" на 2 нацело.


Длина строки списка геометрии LCS PSP может быть в 2х вариантах: 10 байт или 24 байт. Определяется с помощью флага 4 в заголовке: если флаг 4 <>0 то длина строки = 24 байт, если =0 то, соответственно, 10 байт.

 id текстуры[2], количество вершин в тристрипе[2], множитель для U[2], множитель для V[2], unknown2[2], код оптимизации[14](секция может отсутствовать)


Длина строки списка геометрии VCS PSP: = 24 байт.

 id текстуры[2], количество вершин в тристрипе[2], множитель для U[2], множитель для V[2], unknown2[2], код оптимизации[14]

Множители U и V представляют собой half precision floating point. Описание см. здесь


DTZ-версия

MDL-файлы, "вшитые" внутри DTZ-файла. Формат ничем не отличается, поэтому MDL importer может прочитать DTZ как MDL и импортировать модели.

Список геометрии

Tri-Strips - серия связанных треугольников и вершин. Специально используется в играх данной серии для быстрого рендеринга.

PS2-версия

Вся геометрия модели разбита на тристрипсы (поддержка тристрипсов присутствует и в DFF-файлах GTA: SA).

Чтение первого тристрипса в MDL начинается сразу после списка материалов. Началом чтения геометрии тристрипса служит флаг 6С018000. За флагом 2 раза повторяется количество вершинок в тристрипсе. Затем идёт технический сектор 40404020, который необходим для движка (для импорта модели он не важен).

Далее идут собственно блоки, содержащие элементы модели:

  • Блок 79 - Гео - содержит все координаты вершинок в тристрипсе. Одна координата закодирована типом Short (2b) #signed и вычиляется следующим образом:
 (maxscript)
 CoordX = (CoordX as Float)/32768*ScaleFactorX+TranslateFactorX
 аналогично Y и Z 

Размер блока = заголовок блока (4 байта) + (XYZ (6 байтов) * количество вершинок в тристрипсе).

Блок геометрии заканчивается техническим блоком 50505020, который необходим для движка (для импорта модели он не важен).

  • Блок 76 - UV - содержит все координаты UV-маппинга в тристрипсе. Одна координата закодирована типом Byte (1b) #unsigned, вычисляется делением на 255 для моделей из WRLD/LVZ или делением на 128 для MDL. Размер блока = заголовок блока (4 байта) + (UV (2 байта) * количество вершинок в тристрипсе).
  • Блок 6F - Прилайт Stories - содержит RGBA для предварительного освещения вершинки. Используется только в GTA LCS и GTA VCS. Хранится в 16 битном формате RGBA 5551. Размер блока = заголовок блока (4 байта) + (RGBA (2 байта) * количество вершинок в тристрипсе).
  • Блок 6Е - Прилайт Manhunt 2 - содержит RGBA для предварительного освещения вершинки. Используется только в Manhunt 2. Каждый цвет закодирован одним байтом. Размер блока = заголовок блока (4 байта) + (RGBA (4 байта) * количество вершинок в тристрипсе). Считывать необходимо как BGRA
  • Блок 6A - Нормали - содержит все координаты векторов нормалей в трипстрипсе. Одна координата закодирована типом Byte (1b) #signed и вычисляется делением на 127. Размер блока = заголовок блока (4 байта) + (XYZ (3 байта) * количество вершинок в тристрипсе).
  • Блок 6С - Скиннинг - содержит таблицу весов вершинок для их анимации. Это id косточки (1 байт, необходимо делить на 4 нацело) + её вес (3 байта). Соответственно, каждая вершинка содержит 4 id (т.е. в анимации она управляется 4 косточками). Размер блока = заголовок блока (4 байта) + ((id_weight (4 байта) * 4) * количество вершинок в тристрипсе.

Чтение следующего тристрипса начинается сразу же за флагом окончания тристрипса - 14000006. Общее количество тристрипсев в модели так же записано в клампе.

PSP-версия

Информация будет добавлена позже...

Геометрия представляет собой массив тристрипсов, UV координат и прилайта и нормалей.

Геометрия WRLD

Количество вершин в тристрипсе записано в строке материала.

Первый тристрипс наченается сразу после списка материалов

Размер тристрипса = количество вершин * 1 строка массива вершин (в WRLD = 10 байт)

Каждый следующий тристрипс начинается после конца предыдущего


Одна строчка массива вершин = 10 байт

2b: UV (координаты рассчитываются аналогично PS2)

2b: Vcol (расчет прилайта аналогичен PS2)

2b: xCoord (рассчитывается с учетом скайлинга в WRLD)

2b: yCoord (рассчитывается с учетом скайлинга в WRLD)

2b: zCoord (рассчитывается с учетом скайлинга в WRLD)


MDL версии Manhunt 2

MDL версии Manhunt 2 на всех версиях кроме Wii имеет схожую структуру и может быть легко сконвертирован в любую из версий простым преобразованием формата, в котором игра хранит геометрию модели.

MDL может содержать как одну, так и нескольно моделей, принцип чтения которых описан ниже.

MDL версии PS2 и PSP имеет расширение .DFF


Структура файла

Главный заголовок

Заголовок 1 имеет типичную структуру во всех файлах движка, отличается лишь сигнатурой (см. пункт Структура главного заголовка MDL)

Заголовок MDL и цикл чтения моделей

Представляет собой цикл считывания каждой отдельной модели.

Размер заголовка = 8 байт

 4b - Переход на первую строку цикла поиска моделей. 
 4b - Переход на последнюю строку цикла поиска моделей. 
 

Строка цикла поиска моделей:

 4b - Смещение на следующую суб-модель.
 4b - Смещение на предыдущую суб-модель.
 4b - Смещение на текущую суб-модель.


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


Геометрия версии PC

Заголовок

Размер заголовка 180 байт

 4b - Смещение на список использованных текстур. Первой текстуре присваивается индекс 0, второй 1 и т.д.
 4b - количество использованных текстур в модели.
 4b - Смещение на кости для текущей модели. Если =0 - модель не имеет привязанных костей.
 4b - неизветно
 4b - неизвестно, обычно 1
 12b - padding
 4b - сигнатура (0х45D454)  
 4b - размер модели
 4b - неизвестно, обычно 0
 4b - количество материалов в модели
 4b - количество индексов полигонов. (кол-во полигонов = количество индексов полигонов/3)
 16b - 4 float - X Y Z и радиус ограничивающей сферы
 12b - 3 float, обычно 1.0 1.0 1.0
 4b - количество вершин в модели.
 12b - padding
 4b - шаг чтения одной вершины
 44b - неизвестные данные, при любом их изменении или обнулении никакого эффекта в игре не проявляется
 4b - параметры вертексов (по данным параметрам игра определяет какие секции имеют вершины - Normals, VCol, Skin и тд)
 32b - неизвестные данные, при любом их изменении или обнулении никакого эффекта в игре не проявляется


Список материалов

Расположен сразу за заголовком, длина строки материала = 44 байт

 24b - 6 floats - ограничивающая коробка
 2b - количество индексов полигонов текущего материала (кол-во полигонов = количество индексов полигонов текущего материала/3).
 2b - ID текстуры
 2b - количество индексов полигонов, пропускаемых перед началом чтения необходимых индексов для текущего материала.
 14b - неизвестно, при любом их изменении или обнулении никакого эффекта в игре не проявляется


Индексы полигонов

Таблица индексов полигонов располагается сразу после списка материалов. Каждый индекс = 2b. Количество индексов указано в заголовке.


Структура вершин и привязанные к ней параметры

В отличии от DFF, где все параметры вертексов расположены в отдельных таблицах, в MDL версии PC все параметры считываются сразу после координат вертекса.

Размер строки вертекса задается параметрами вертексов в заголовке.

Примерная структурная последовательность параметров вертексов в MDL версии PC.

 12b - 3 floats - X Y Z
 20b - Скиннинг (4 floats[4b] - веса, 4 bytes [1b] - ID костей)
 8b - Нормали (3 words [2b] - X Y Z нормали, 2b -0)
 4b - VCol (4b, хранится в BGRA а не в RGBA)
 8b - UV1 (2 floats)
 8b - UV2 (2 floats - обычно встречается в моделях персонажей, развертка для текстур кровяных пятен на теле)


п · о · р
Lcs.png GTA Liberty City Stories Vcs.png GTA Vice City Stories
Форматы файлов.anim.at3.cam.chk/.xtx.col2.cut.dtz.ifp.img/.dir.irx.gxt.lvz.mdl.pss.raw/.sdt.scm.vb.wrld
ИнструментыApacheConsole Texture Explorer (PSP/PS2)GTA Stories IMG ToolGTA Stories Texture ViewerGTA Stories Texture Explorer
GTA Stories RAW EditorGXT EditorJPCSPMDL importerMF AudioPCSX2PPSSPPStories WRLD ToolGTA Stories Map Converter v1.0UMD GenYAIE
ТуториалыМоддинг VCS и LCS (PSP/PS2)Аудио на PSPАудио на PS2Спецификация версий PS2Конфигурирование PCSX2
ПК-версииVice City StoriesLiberty City Stories