Формат файла пока сравнительно молодой и может претерпевать некоторые изменения. Те параметры которые были изменены или добавлены в этой редакции по сравнению с предыдущей редакций, отмечены жёлтым цветом или красным словом New ! .
Файлы типа *.LOD состоят из сигнатуры и блоков.
Каждый LOD-файл начинается сигнатурой "LODka3D1". Это означает, что это именно LOD-Файл, а не что-нибудь другое. Далее идут блоки ...
Каждый блок состоит из заголовка и данных идущих за ним. Заголовок занимает 12 байт. В нём описан тип данных ( ID ), их длина ( Size ), и один дополнительный параметр данных названный Count, так как часто используется как счётчик.
При помощи Size удобно пропускать ненужные блоки. Считываем из файла/потока только заголовок, и если блок не нужен, то смещаемся по файлу/потоку на Size, таким образом оказываясь перед заголовком следующего за этим блока.
Заголовок имеет формат :
Параметр | Размер ( байт ) | Смещение ( байт ) | Тип | Описание |
ID | 4 | 0 | Символы |
Идентефикатор блока. Определяет тип данных идущих за заголовком. Например "LOD1" - означает что данные содержит LOD-файл, PHS1 - означает, что данные содержит описание физики. И т. д. |
Size | 4 | 4 | Целое |
Размер данных идущих за заголовком. Сам заголовок в эту величину не входит. Если надо получить размер данных с заголовком, то к этой величине надо прибавить 12 ( длина заголовка ). |
Count | 4 | 8 | Целое |
Дополнительный параметр данных. Часто используется как счётчки, поэтому и назван Count. |
На Паскале описание заголовка выглядит так:
type TLODChunk = packed record ID : array [0..3] of Char; Size : Integer; Count : Integer; end;
Данные некоторых блоков ( LOD1, MAL1, MSL1, ANS1, LGS1 ) могут состоять исключительно из других блоков. Данные других блоков ( INF1, MAT1, MSH1, SK1, ANM1, PSH1, LIG1 ) - нет.
LOD1 - блок содержит LOD-файл. Его данные это блоки типов : INF1, MAL1, MSL1, SKL1, ANS1, PHS1. Параметр заголовка блока Count определяет количество этих блоков.
Блок "LOD1" нужен только для того, чтобы в один файл можно было бы впихнуть много LOD-файлов подряд. Тогда чтобы считать допустим второй файл, не читая первого, можно было бы считать заголовок первого, и сдвинувшись на Size указанный в нём, оказаться в начале второго файла блока LOD1. И т. д. Программа такую мультимодельность не поддерживает. А сделано скорее на будущее.
INF1 - его данные содержат дополнительную текстовую информацию о файле. Описания, копирайты, некоторые параметры модели, и т. д. В принципе данные могут быть не только текстовые, а какие угодно, так как для них есть только один параметр - длина. Но программа считывает и выводит их как текст ( пока, по крайней мере ).
Параметр заголовка блока Count должен быть равен единице. Параметр заголовка блока Size, определяет размер данных.
SKL1 - содержит информацию о cкелете. О иерархии костей ( какая к какой крепится ) и их имена. Положения и ротации костей описываются в блоке анимаций ANM1. Блок не обязательный и может отсутствовать, если модель не анимированная.
Этот блок ( если он есть ) должен всегда предшествовать блокам ANM1 ( амимация ) и MSL1 ( меши модели ), так как иначе будет непонятно сколько всего костей, к каким костям относятся загружаемые анимации, и к каким костям крепятся точки модели.
В параметре заголовка блока Count записано количество костей скелета BonesCnt.
Данные блока - это:
Параметр | Размер ( байт ) | Смещение ( байт ) | Тип | Описание |
SkelType | 4 | 0 | Целое |
Тип скелета. Должен быть равен 1. Это резерв на будущее. |
Далее в зависимости от количества костей BonesCnt указанного в параметре Count заголовка блока, записаны следующие данные для каждой кости.
Параметр | Размер ( байт ) | Смещение ( байт ) | Тип | Описание |
BoneID | 2 | 0 | Целое 0..32767 |
Идентефикатор кости. |
BoneParentID | 2 | 2 |
Целое -1..32767 |
Идентефикатор родительской кости. То есть той кости, к которой эта должна быть прикрпелена. Если = -1, то значит эта кость корневая. Этот параметр должен указывать только на идентефикаторы уже встречавшихся костей или на корень ( -1 ). То есть первая загружаемая кость, должна иметь BoneParentID равный -1. Вторая - либо -1, либо ParentID первой, и т. д. Это нужно для того, чтобы можно было крепить кости по мере чтения файла. |
BoneNameLength | 4 | 4 | Целое |
Длина имени этой кости. |
BoneName | BoneNameLength | 8 | Символы |
Имя кости. |
Прочитав данные в соответствии с этой таблицей для первой кости, читаем данные для второй, и так далее в соответсвии с количеством заданном в параметре Count = BonesCnt, заголовка блока SKL1.
ANS1 - содержит информацию о списке анимаций. Данные этого блока - это последовательно идущие блоки типа ANM1. Количество которых указано в параметре заголовка блока Count.
Этот блок должен идти после блока SKL1, в котором описана иерархия костей и указано их количество. Так как иначе будет непонятно к какой кости какое положение/ротация относятся, и сколько их всего.
ANМ1 - содержит информацию о единичной анимации. Параметр заголовка блока Count - указывает количество фреймов FramesCnt анимации в этом блоке.
Данные блока - это:.
Параметр | Размер ( байт ) | Смещение ( байт ) | Тип | Описание |
AnimType | 4 | 0 | Целое |
Тип анимации. Должен быть равен 1. Это резерв на будущее. |
AnimInterval | 4 | 4 | Целое |
Интервал анимации. Чем больше, тем медленнее она проигрывается. |
AnimMode | 1 | 8 | Целое 0..6 |
Режим анимации. Может быть следующих типов. TLODAnimationMode = ( aamLODNone, aamLODPlayOnce, aamLODLoop, aamLODBounceForward, aamLODBounceBackward, aamLODLoopBackward, aamLODExternal); Тип aamLODNone = 0, тип aamLODPlayOnce = 1 и т. д. |
AnimNameLength | 4 | 9 | Целое |
Длина имени анимации. |
AnimName | AnimNameLength | 13 | Символы |
Имя анимации |
BonesRotPos | 24 *BonesCnt *FramesCnt | 13 +AnimNameLength | Array |
Далее идут позиции и ротации последовательно всех костей ( от первой до
последней ) для первого фрейма, потом для второго фрейма, потом для
третьего и т. д. до последнего.
|
MAL1 - список библиотек материалов. Данные блока - это блоки типа MAT1 содержащие библиотеки материалов. Правда в программе реализована поддержка только одного такого блока. Поэтому блок должен быть один. А параметр Count означающий количество таких блоков должен быть равен единице.
MAT1 - единичная библиотка материалов. Её Count - это количество материалов в ней. Параметр продублирован ниже, так что здесь он скорее только для информации.
Данные библиотеки материалов:
Параметр | Размер ( байт ) | Смещение ( байт ) | Тип | Описание |
MaterialsType | 1 | 0 | Целое |
Тип материала. Должен быть равен 2. Резерв на будущее. |
MaterialsCount | 4 | 1 | Целое |
Количество материалов. Дублирует Count в заголовке блока MAT1. |
Далее в соответствии с количеством материалов MaterialsCount читаем последовательно для каждого материала :
Параметр | Размер ( байт ) | Смещение ( байт ) | Тип | Описание |
MatNameLen | 4 | 0 | Целое |
Размер имени материала. |
MatName | MatNameLen | 4 | Символы |
Имя материала. |
TextrNameLen | 4 | 4 +MatNameLen | Целое |
Размер имени файла текстуры (текстур) TextureName задействованной в материале. См. следующий параметр. |
TextrName | TextrNameLen | 8 +MatNameLen | Символы |
Имя файла текстуры. Либо если в материале есть вторая текстура, то пишется и её имя через двоеточие. То есть имя файла первой текстуры, двоеточие ":", и имя второй текстуры. |
MaterialOptions | 101 | 8 +MatNameLen +TextrNameLen | Array |
Структура описывающая различные параметры материала. Расшифровка что в ней чего значит даётся далее в таблице . |
Назначение некоторых параметров в MaterialOptions я сам знаю не слишком точно. За тем, что они означают в OpenGL, лучше обращаться к его документации.
Некоторые комментарии перенесены в описание, из исходников GLScene. В них же можно посмотреть как это работает на практике.
Параметры MaterialOptions в виде таблицы:
Параметр | Размер ( байт ) | Смещение | Тип | Описание |
Ambient | 16 | 0 | 4 Single* |
Фоновый цвет Ambient. |
Diffuse | 16 | 16 | 4 Single* |
Цвет Diffuse. |
Emission | 16 | 32 | 4 Single* |
Цвет Emission. |
Specular | 16 | 48 | 4 Single* |
Цвет Specular. |
EnvColor | 16 | 64 | 4 Single* |
Цвет EnvColor. |
Shininess | 1 | 80 | Целое 0>=...>=128 |
Shininess. |
ImageBrightness | 4 | 81 | Single* |
Яркость текстуры ImageBrightness. Из исходников GLScene: Texture brightness correction. This correction is applied upon loading a TGLTextureImage, it's a simple saturating scaling applied to the RGB components of the 32 bits image, before it is passed to OpenGL, and before gamma correction (if any). |
ImageGamma | 4 | 85 | Single* |
Гамма текстуры ImageGamma. Из исходников GLScene: Texture gamma correction. The gamma correction is applied upon loading a TGLTextureImage, applied to the RGB components of the 32 bits image, before it is passed to OpenGL, after brightness correction (if any). |
NormalMapScale | 4 | 89 | Single* |
NormalMapScale. Из исходников GLScene: Normal Map scaling. Only applies when TextureFormat is tfNormalMap, this property defines the scaling that is applied during normal map generation (ie. controls the intensity of the bumps). |
BlendingMode | 1 | 93 | Целое 0..5 |
BlendingMode. Может быть следующих значений. TBlendingMode = (bmOpaque, bmTransparency, bmAdditive, bmAlphaTest50, bmAlphaTest100, bmModulate); Из исходников GLScene: Simplified blending options.
|
ImageAlpha | 1 | 94 | Целое 0..8 |
Представление альфа-канала текстуры ImageAlpha. Может быть следующих значений. TGLTextureImageAlpha = (tiaDefault, tiaAlphaFromIntensity, tiaSuperBlackTransparent, tiaLuminance, tiaLuminanceSqrt, tiaOpaque, tiaTopLeftPointColorTransparent, tiaInverseLuminance, tiaInverseLuminanceSqrt); Из исходников GLScene: Defines how and if Alpha channel is defined for a texture image.
|
TextureMode | 1 | 95 | Целое 0..3 |
TextureMode. Способ наложения текстуры. Может быть следующих значений: TGLTextureMode = (tmDecal, tmModulate, tmBlend, tmReplace); Соответствует параметрам OpenGL: GL_DECAL, GL_MODULATE, GL_BLEND, GL_REPLACE. Замещающая текстурная функция (GL_REPLACE) просто берет цвет, которым объект был бы нарисован без текстурирования (цвет фрагмента), отбрасывает его и замещает цветом текстуры. Функцию замещения следует использовать в случаях, когда на объект нужно наложить непрозрачную текстуру. Функция GL_DECAL (переводная картинка) похожа на замещение за исключением того, что она работает только для внутренних форматов RGB и RGBA и обрабатывает альфа величины иначе. В формате RGBA результирующий цвет является результатом наложения цвета текстуры на цвет фрагмента, причем доли этих цветов определяются альфа компонентом текстуры, а альфа фрагмента в расчетах не участвует и не изменяется. Эта функция может использоваться для наложения таких текстур, как знак авиакомпании на крыле самолета (исходный цвет крыла виден везде, кроме того места, где нарисован знак). При модуляции (GL_MODULATE) цвет фрагмента модулируется содержимым текстурной карты. Модуляция хороша для использования с освещением, поскольку цвет освещенного полигона может быть использован для ослабления цвета текстуры. Белые зеркальные полигоны часто используются для визуализации освещенных объектов, а карта текстуры предоставляет диффузный цвет. |
TextureWrap | 1 | 96 | Целое 0..3 |
TextureWrap. Может быть следующих значений. TGLTextureWrap = (twBoth, twNone, twVertical, twHorizontal); |
TextureFormat | 1 | 97 | Целое 0..11 |
TextureFormat. Может быть следующих значений. TGLTextureFormat = (tfDefault, tfRGB, tfRGBA, tfRGB16, tfRGBA16, tfAlpha, tfLuminance, tfLuminanceAlpha, tfIntensity, tfNormalMap, tfRGBAFloat16, tfRGBAFloat32); Из исходников GLScene: Texture format for OpenGL (rendering) use. Internally, GLScene handles all "base" images as 32 Bits RGBA, but you can specify a generic format to reduce OpenGL texture memory use:
The actual representation may differ, f.i. old 16bits boards may convert everything to 16bit formats, GeForce boards don't have a 24 bits format internally and will convert to 32 bits, etc. |
TextureEnabled | 1 | 98 | Boolean |
TextureEnabled. Включена или нет текстура. |
Enabled | 1 | 99 | Boolean |
Enabled. Включён или нет материал. |
MappingMode | 1 | 100 | Целое 0..7 |
MappingMode. Может быть следующих значений. TGLTextureMappingMode = (tmmUser, tmmObjectLinear, tmmEyeLinear, tmmSphere, tmmCubeMapReflection, tmmCubeMapNormal, tmmCubeMapLight0, tmmCubeMapCamera); Из исходников GLScene: Texture coordinates mapping mode. This property controls automatic texture coordinates generation. |
* - Single - вещественное 32 битное число. Занимает 4 байта.
Типы, например, TGLTextureMode = (tmDecal, tmModulate, tmBlend, tmReplace);, означают, что tmDecal - это соответсвует нулю. tmModulate - единице. tmBlend - двойке. И т. д.
Прочитав эти данные для первого материала. Переходим к чтению для второго, и так далее в соответсвии с количеством заданном в MaterialsCount.
MSL1 - библиотека мешей. Данные этого блока состоят из блоков "MSH1" содержащих единичные меши модели. Параметр Count показывает количество этих мешей.
MSH1 - единичный меш. Данные блока содержат меш модели. Параметр Count показывает количество фэйс-групп в меше. Далее этот параметр дублируется, а здесь нужен больше для информации. Просто чтобы узнать количество фэйсов не читая данных блока.
Данные блока:
Параметр | Размер ( байт ) | Смещение ( байт ) | Тип | Описание |
MeshNameLen | 4 | 0 | Целое |
Размер имени меша. |
MeshName | MeshNameLen | 4 | Символы |
Имя меша. |
isSkeletonExists | 1 | 4 +MeshNameLen | Boolean |
Есть ли в модели скелет. Нужно потому, что скелетная анимация и
статичный меш, могут быть реализованы в разных классах. И тогда, по этой
опции можно будет определить какой класс создавать.
|
MeshMode | 1 | 5 +MeshNameLen | Целое |
Режим меша. Должен быть равен 2. Соответсвует GLScene'овскому типу. TMeshObjectMode = (momTriangles, momTriangleStrip, momFaceGroups); . Два - потому, что задействованы только фэйсгруппы, то есть momFaceGroups. |
isMeshVisible | 1 | 6 +MeshNameLen | Boolean |
Видимость/включённость меша. Если True, то галочка в программе напротив меша ставится, если False, то нет. |
MeshVertexCnt | 4 | 7 +MeshNameLen | Целое |
Количество точек/вершин в меше. |
MeshPointsPos | MeshVertexCnt *12 | 11 +MeshNameLen | Array |
Позиции точек. Позиция каждой точки задаётся тремя вещественными числами типа Single. По осям X, Y и Z. Таким образом всего по 12 байт на каждую точку. Общее количество точек задано предыдущей переменной MeshVertexCnt. |
MeshNormalsCnt | 4 | 11 +MeshNameLen +(12*MeshVertexCnt) | Целое |
Количество нормалей в этом меше. |
MeshNormals | MeshNormalsCnt *12 | 15 +MeshNameLen +(12*MeshVertexCnt) | Array |
Нормали меша. Каждая нормаль - это 3 числа типа Single, описывающие вектор нормали в трёхмерном мире. Таким образом на каждую нормаль приходится по 12 байт. Общее количество нормалей задано предыдущей переменной MeshNormalsCnt. |
MeshTxCrdCnt | 4 | 15 +MeshNameLen +(12*MeshVertexCnt) +(12*MeshNormals) | Целое |
Количество текстурных координат в данном меше. |
MeshTxCrd | MeshTxCrdCnt *8 | 19 +MeshNameLen +(12*MeshVertexCnt) +(12*MeshNormals) | Array |
Текстурные координаты меша. Каждая текстурная координата - это 2 числа типа Single, описывающие её положение на плоскости текстуры. Таким образом на каждую текстурную координату приходится по 8 байт. Общее количество текстурных координат задано предыдущей переменной MeshTxCrdCnt. |
PntBnAssocCnt | 4 | 19 +MeshNameLen +(12*MeshVertexCnt) +(12*MeshNormals) +(8*MeshTxCrdCnt) | Целое |
Количество ассоциаций точек/вершин с костями скелета. Должно быть кратно MeshVertexCnt. На данный момент может быть равно либо нулю либо MeshVertexCnt. Если нулю, то значит точки со скетелом модели никак не ассоциированы ( например, статичная, не анимированная модель). Если равно MeshVertexCnt, то значит, что для каждой точки указывается по одному номеру с ней связанной кости. Номер - по списку костей. |
PntBnAssoc |
= PntBnAssocCnt, если BonesCnt<255 = PntBnAssocCnt*2, если BonesCnt>=255 | 23 +MeshNameLen +(12*MeshVertexCnt) +(12*MeshNormals) +(8*MeshTxCrdCnt) | Array |
Целые числа. Определяют номер кости, которая данной точке соответствует. То есть первая из этого списка - это номер кости соответствующей первой точки. Вторая - второй. И т. д. Размерность этого массива зависит от количества костей. Если костей меньше 255, то на кость отводится по байту, если больше ( что крайне редко ), то по два байта. |
Reserv | 4 | Целое |
Зарезервировано на будущее. Должно быть равно нулю. | |
FaceGroupsCnt | 4 | Целое |
Количество фэйс-групп. |
Описания фэйс-группы:
Параметр | Размер ( байт ) | Смещение ( байт ) | Тип | Описание |
FaceType | 4 | 0 | Целое |
Тип фэйса. Должен быть равен двойке. В предыдущей версии было: Тип фэйса. Должен быть равен единице. |
FaceMode | 1 | 4 | Целое |
Мод фэйса. Должен быть равен нулю. Это значит, что здесь не стрипы, не квадры, а обычные треугольники. |
FaceNameLength | 4 | 5 | Целое |
Длина имени фэйса. |
FaceName | FaceNameLength | 9 | Символы |
Имя фэйса. |
isFaceVisible | 1 | 9 +FaceNameLength | Boolean |
Видимость/включённость фэйса. |
FaceMatNameLen | 4 | 10 +FaceNameLength | Целое |
Длина имени материала используемого этим фэйсом. |
FaceMatName | FaceMatNameLen | 14 +FaceNameLength | Символы |
Имя материала используемого фэйсом. |
VertexIndCnt | 4 | 15 +FaceNameLength +FaceMatNameLen | Целое |
Количество индексов вершин. Три индекса - треугольник, три индекса - треугольник, и т. д. Должно быть кратно трём. |
VertexIndex |
VertexIndCnt*1 при MeshVertexCnt<=256
VertexIndCnt*2 при 256<MeshVertexCnt<=65536 VertexIndCnt*4 при MeshVertexCnt>65536 В предыдущей версии было: VertexIndCnt*1 при MeshVertexCnt<=255 VertexIndCnt*2 при 255<MeshVertexCnt<=65535 VertexIndCnt*4 при MeshVertexCnt>65535 | 19 +FaceNameLength +FaceMatNameLen | Array |
Массив индексов вершин. Три индекса определяют треугольник. Следующие три индекса определяют следующий треугольник. И т. д. Таким образом VertexIndex должен быть кратен трём. Размерность параметра зависит от количества точек в меше MeshVertexCnt ( Не путать с VertexIndCnt ! ). Если их меньше 255, то на каждый индекс отводится по байту. Если больше 255, но меньше 65535, то по два. Если больше 65535, то по четыри. Такой подход позволяет делать файлы меньшего размера. |
SmoothDataCnt | 4 | Целое |
Количество параметров групп сглаживания. Должно быть равно либо нулю, либо количеству треугольников ( = втрое меньше чем VertexIndCnt ). В предыдущей версии этот параметр отсутствовал. | |
SmoothData | SmoothDataCnt *4 | Array |
Данные группы сглаживания. Первое целое в массиве задаёт группу сглаживания для первой вершины, второе целое - для второй. И т. д. Всего групп сглаживания - 32. Если в числе установлен первый бит, то значит включена первая группа сглаживания. Если второй, то вторая. И т. д. Если ни один бит не установлен, то треугольник не сглаживается. То есть вычисляется одна нормаль для всех трёх вершин треугольника. В предыдущей версии этот параметр отсутствовал. | |
NormalsIndCnt | 4 | Целое |
Количество индексов нормалей. Три нормали - треугольник, три нормали - треугольник. и т. д. Должно быть кратно трём. | |
NormalIndex |
NormalsIndCnt*1 при MeshNormalsCnt<=256
NormalsIndCnt*2 при 256<MeshNormalsCnt<=65536 NormalsIndCnt*4 при MeshNormalsCnt>65536 В предыдущей версии было: NormalsIndCnt*1 при MeshNormalsCnt<=255 NormalsIndCnt*2 при 255<MeshNormalsCnt<=65535 NormalsIndCnt*4 при MeshNormalsCnt>65535 | Array |
Массив индексов нормалей. Полная аналогия с индексами вершин. Три индекса - треугольник. Следующие три индекса - ещё треугольник. И т. д. Размерность зависит от количества нормалей в меше MeshNormalsCnt ( Не путать с NormalsIndCnt и MeshVertexCnt ! ). . Если их меньше 255, то на каждый индекс отводится по байту. Если больше 255, но меньше 65535, то по два. Если больше 65535, то по четыри. Такой подход позволяет делать файлы меньшего размера. | |
TxCrdsIndCnt | 4 | Целое |
Количество индексов текстурных координат. Три текстурные координаты - тругольник, три текстурные координаты - треугольник и т. д. Должно быть кратно трём. | |
TxCrdsInd |
TxCrdsIndCnt*1 при MeshTxCrdsCnt<=256
TxCrdsIndCnt*2 при 256<MeshTxCrdsCnt<=65536 TxCrdsIndCnt*4 при MeshTxCrdsCnt>65536 В предыдущей версии было: TxCrdsIndCnt*1 при MeshTxCrdsCnt<=255 TxCrdsIndCnt*2 при 255<MeshTxCrdsCnt<=65535 TxCrdsIndCnt*4 при MeshTxCrdsCnt>65535 | Array |
Массив индексов текстурных координат. Полная аналогия с индексами и нормалями вершин. Три индекса - треугольник. Следующие три индекса - ещё треугольник. И т. д. Размерность зависит от количества нормалей в меше. Если их меньше 255, то на каждый индекс отводится по байту. Если больше 255, но меньше 65535, то по два. Если больше 65535, то по четыри. Такой подход позволяет делать файлы меньшего размера. |
После считывания первой фэйс-группы, считываем вторую. И так далее в соответствии со значением FaceGroupsCnt, в котором записано сколько всего фэйс-групп.
PHS1 - содержит информацию о физике. Параметр Count должен быть равен 2. Означает версию блока.
Данные блока - это:
Параметр | Размер ( байт ) | Смещение ( байт ) | Тип | Описание |
PhysType | 1 | 0 | Целое |
Тип физики. Должен быть равен единице. Резерв на будущее. |
BodyNameLengnt | 4 | 1 | Целое |
Длина строки с именами тел. |
GeomsNameLength | 4 | 5 | Целое |
Длина строки с именами геометрий. |
MeshLinksCount | 4 | 9 | Целое |
Количество элементов массива с ссылками на меши. |
BodyCount | 4 | 13 | Целое |
Количество тел. |
GeomsCount | 4 | 17 | Целое |
Количество геометрий. |
JointsCount | 4 | 21 | Целое |
Количество жоинтов. |
BodysNames | BodyNameLengnt | 25 | Символы |
Строка с именами всех физических тел. Имена тел записаны последовательно в одну строку, и отделены друг от друга двумя символами перевода строки "#13#10". Первое имя - соответствует первому телу, второе - второму, и т. д. |
GeomsNames | GeomsNameLengnt | 25 +BodyNameLengnt | Символы |
Строка с именами всех геометрий. Имена геометрий записаны в одну строку, и отделены друг от друга двумя символами перевода строки "#13#10". Первое имя - соответствует первой геометрии, второе - второй, и т. д. |
MeshLinks | MeshLinksLength |
25 +BodyNameLengnt +GeomsNameLengnt | MeshLinksLength*4 |
Это массив целых типа Integer. Количество элементов опеределено в MeshLinksLength. А умножать на четыри нужно потому, что Integer - это 4-ёх байтовое, 32-битное целое. Записанные в массиве числа - это порядковые номера мешей, на которые ссылаются геометрии. |
TBodys | 78 *BodyCount |
25 +BodyNameLengnt +GeomsNameLengnt +(MeshLinksLength *4) | Array |
Массив структур содержащих параметры тел. Один элемент структуры - одно тело. Размер каждой структуры - 78 байтов. Расшифровка значений структуры даётся ниже в отдельной таблице. |
TGeoms | 70 *GeomsCount |
25 +BodyNameLengnt +GeomsNameLengnt +(MeshLinksLength *4) +(BodyCount *78) | Array |
Массив структур содержащих параметры геометрий. Один элемент структуры - одна геомтерия. Размер каждой структуры - 70 байтов. Расшифровка значений структуры даётся ниже в отдельной таблице. |
TJoints | 101 *JointsCount |
25 +BodyNameLengnt +GeomsNameLengnt +(MeshLinksLength *4) +(BodyCount *78) +(GeomsCount *70) | Array |
Массив структур содержащих параметры жоинтов. Один элемент структуры - один жоинт. Размер каждой структуры - 101 байт. Расшифровка значений структуры даётся ниже в отдельной таблице. |
Расшифровка структуры TBody:
Параметр | Размер ( байт ) | Смещение ( байт ) | Тип | Описание |
BodyTypeA | 1 | 0 | Целое 0..4 |
Тип тела. Может принимать следующие значения : TBodyTypeA = ( bdtNone, bdtBox, bdtSphere, bdtCylinder, bdtCapsule ); , где bdtNone - ноль, bdtBox - один, и т. д. |
BodyPosition | 12 | 1 | 3*Single |
Позиция тела. Три числа типа Single, определяющих позицию по трём направлениям X, Y и Z. |
BodyScale | 12 | 13 | 3*Single |
Масштаб тела. Три числа типа Single, определяющих масштабирование тела по трём направлениям X, Y и Z. |
BodyRotation | 16 | 25 | 4*Single |
Ротация тела. Четыри числа типа Single, определяющих квантернион вращения ( X, Y, Z, W ). |
BodyAxis | 4 | 41 | Целое 0..4 |
Направление оси. Параметр можно игнорировать. |
BodyMass | 4 | 45 | Single |
Масса тела. |
BodyDensity | 4 | 49 | Single |
Плотность тела. |
isBodyTagFloat | 4 | 53 | Single |
Tag. Параметр задающийся пользователем. |
BodyEnabled | 1 | 57 | Boolean |
Включённость тела. |
isBodyGravity | 1 | 58 | Boolean |
Действует ли на тело гравитация. |
isBodyFinRotMode | 1 | 59 | Boolaen |
Параметр ODE dBodySetFiniteRotationMode. Контролирует то каким образом будет меняться ориентация тела на каждом шаге симуляции. Из справки ODE:
|
isBodyAutoDisable | 1 | 60 | Boolean Boolean |
Включённость автовыключения тела. |
isBodyAutoDisableDef | 1 | 61 | Boolean |
Включённость автовыключение тела по-умолчанию. |
BodyADLinearThr | 4 | 62 | Single |
Значения для параметра ODE, устанавливаемого функцией dBodySetAutoDisableLinearThreshold . То есть пороговое значение линейной скорости для тела, которое используется для автовыключения. |
BodyADAngularThr | 4 | 66 | Single |
Значения для параметра ODE, устанавливаемого функцией dBodySetAutoDisableAngularThreshold . То есть пороговое значение линейной скорости для тела, которое используется для автовыключения. |
BodyADisableTime | 4 | 70 | Single |
Значения для параметра ODE, устанавливаемого функцией dBodySetAutoDisableTime . То есть время симуляции в течении которого тело должно бездействовать что бы быть автоматически отключенным. |
BodyADSteps | 4 | 74 | Целое |
Значения для параметра ODE, устанавливаемого функцией dBodySetAutoDisableSteps . То есть количество шагов симуляции, в течение которых тело должно бездействовать, что бы быть автоматически отключенным. |
Расшифровка структуры TGeoms:
Параметр | Размер ( байт ) | Смещение ( байт ) | Тип | Описание |
GeomType | 1 | 0 | Целое 0..9 |
Тип геометрии. Может принимать следующие значения : TGeomTypeA = ( bdtNone, bdtBox, bdtSphere, bdtCylinder, bdtCapsule , bdtCone , bdtPlane, bdtTriMesh , bdtCCylinder , bdtRay); , где bdtNone - ноль, bdtBox - один, и т. д. |
GeomBodyIndex | 4 | 1 | Целое |
Номер тела в списке тел, к которому прикреплена эта геометрия. |
GeomPosition | 12 | 5 | 3*Single |
Позиция геометрии относительно позиции тела, к которому она прикреплена. Три числа типа Single, определяющих позицию по трём направлениям X, Y и Z. |
GeomScale | 12 | 17 | 3*Single |
Масштаб геометрии. Три числа типа Single, определяющих масштабирование тела по трём направлениям X, Y и Z. |
GeomRotation | 16 | 29 | 4*Single |
Ротация геометрии. Четыри числа типа Single, определяющих квантернион вращения ( X, Y, Z, W ). |
GeomAxis | 4 | 45 | Целое 0..4 |
Направление оси. Параметр можно игнорировать. |
GeomMass | 4 | 49 | Single |
Масса геометрии. |
GeomsDensity | 4 | 53 | Single |
Плотность геомтерии. |
GeomMeshLink | 4 | 57 | Целое |
Номер элемента массива MeshLinks, в котором собраны ссылки на меши. Таким образом можно узнать какой меш первым прикреплён к этой геометрии. |
GeomMeshLinkCount | 4 | 61 | Целое |
Количестов мешей прикреплённых к этой геометрии. Если первый меш задан через GeomMeshLink, то второй - это GeomMeshLink+1, третий - GeomMeshLink+2, и т. д. В соответствии с количеством GeomMeshLinkCount |
GeomsTagFloat | 4 | 65 | Single |
Tag. Параметр задаваемый пользователем. |
GeomsEnabled | 1 | 69 | Boolean |
Включённность геометрии. |
Расшифровка структуры TJoints:
Параметр | Размер ( байт ) | Смещение ( байт ) | Тип | Описание |
JointType | 1 | 0 | Целое 0..7 |
Тип жоинта. Может принимать следующие значения : TJointTypeA = (jtaNone, jtaBall, jtaSlider, jtaHinge, jtaHinge2, jtaUniversal , jtaCorkscrew, jtaUpVector ); , где jtaNone - ноль, jtaBall - один, и т. д. |
Joint2BodyIndex | 8 | 1 | Два целых |
Первое целое - это номер, в списке тел, первого соединяемого этим жоинтом тела. Второе целое - это номер второго соединяемого этим жоинтом тела. |
JointAxis | 32 | 9 | 8*Single |
Два квантерниона определяющих оси жоинта. Если жоинт такого типа, что имеет только одну ось, или не имеет их вообще, то остальные данные игнорируются. Квантернион - это четыри числа типа Single ( X, Y, Z, W ). |
JointPosition | 12 | 41 | 3*Single |
Позиция жоинта. Три числа типа Single, определяющих позицию по трём направлениям X, Y и Z. |
JointdParamLoStop | 4 | 53 | Single |
Параметр жоинта dParamLoStop. |
JointdParamHiStop | 4 | 57 | Single |
Параметр жоинта dParamHiStop. |
JointdParamVel | 4 | 61 | Single |
Параметр жоинта dParamVel. |
JointdParamFMax | 4 | 65 | Single |
Параметр жоинта dParamFMax. |
JointdParamFudgeFactor | 4 | 69 | Single |
Параметр жоинта dParamFudgeFactor. |
JointdParamBounce | 4 | 73 | Sinlge |
Параметр жоинта dParamBounce. |
JointdParamCFM | 4 | 77 | Single |
Параметр жоинта dParamCFM. |
JointdParamStopERP | 4 | 81 | Single |
Параметр жоинта dParamStopERP. |
JointdParamStopCFM | 4 | 85 | Sinlge |
Параметр жоинта dParamStopCFM. |
JointdParamSuspensionERP | 4 | 89 | Sinlge |
Параметр жоинта dParamSuspensionERP. |
JointdParamSuspensionCFM | 4 | 93 | Single |
Параметр жоинта dParamSuspensionCFM. |
JointdTagFloat | 4 | 97 | Sinlge |
Tag. Параметр задаваемый пользователем. |
LGS1 - содержит информацию о списке схем освещения. Данные этого блока - это последовательно идущие блоки типа LIG1. Количество которых указано в параметре Count заголовка блока.
Параметр заголовка блока Size, определяет размер данных.
LIG1 - содержит информацию о единичной схеме освещения. То есть о восьми источниках освещения, и их параметрах. Число восемь идёт из OpenGL, где число источников не должно превышать восьми.
Параметр Count заголовка блока должен быть строго равен 8. Это не число источников освещения, а скорее тип блока.
Параметр Size заголовка блока, определяет размер данных.
Данные этого блока - это:
Параметр | Размер ( байт ) | Смещение ( байт ) | Тип | Описание |
LightSchemeNameLength | 4 | 0 | Целое |
Длина имени схемы. |
Name | LightSchemeNameLength | 4 | Array |
Имя схемы освещения. |
Далее последовательно идут параметры каждого из восьми источника освещения. Сначала для первого, потом для второго и т. д.
Данные для каждого источинка освещения - это:
Параметр | Размер ( байт ) | Смещение ( байт ) | Тип | Описание |
Enabled | 1 | 0 | Boolean |
Включён или нет этот источник освещения. |
LigthStyle | 1 | 1 | Целое [0..2] |
Тип освещения. Может принимать следующие значения : 0 - Spot, 1 - Omni, 2 - Parallel. |
Position | 12 | 2 | 3*Single |
Позиция источника света. Координаты по X, Y и Z. |
SpotDirection | 12 | 14 | 3*Single |
Направление света прожектора. Используется при типе освещения Spot. |
Ambient | 16 | 26 | 4*Single |
Интенсивность фонового света |
Diffuse | 16 | 42 | 4*Single |
Интенсивность диффузного света ( значение в OpenGL по умолчанию для 0-го источника - белый свет, для остальных - черный ) |
Specular | 16 | 58 | 4*Single |
Интенсивность зеркального света ( значение в OpenGL по умолчанию для 0-го источника - белый свет, для остальных - черный ) |
SpotCutOff | 4 | 74 | Single [0..90,180] |
Угол светового конуса. Действует при типе освещения Spot. Может принимать значения от 0 до 90 градусов. А также быть равным 180, что означает, что источник светит во все стороны. |
SpotExponent | 4 | 78 | Single [>=0] |
Концентрация светового луча. В OpenGL по умолчанию равен 0, Свет имеет самую высокую интенсивность в центре конуса. При движении от центра к ребрам он ослабляется с коэффициентом равным косинусу угла между направлением света и направлением от источника света к освещаемой вершине, возведенному в степень SpotExponent. Таким образом, больший экспоненциальный коэффициент разброса света (SpotExponent) ведет к более фокусированному свету. |
ConstAtt | 4 | 82 | Single [>=0] |
Постоянный фактор ослабления. |
LinearAtt | 4 | 86 | Single [>=0] |
Линейный фактор ослабления. |
QuadAtt | 4 | 90 | Single [>=0] |
Квадратичный фактор ослабления. |
Все вышеприведённые данные читаются 8 раз. Для каждого источника освещения.
Если вы найдёте какие-либо ошибки в формате или в этом описании, или что-то здесь объяснено не однозначно, или у вас есть пожелания как формат можно улучшить/дополнить - пишите .
Об орфографических ошибках просьба не сообщать.