Расширение |
|
---|---|
Сигнатура |
xof |
Разработан | |
Тип формата | |
Развит в |
.sdkmesh |
X — формат файла для хранения 3D объектов, созданный компанией Microsoft.
Этот формат хранит информацию о геометрии 3D объекта (координаты вершин и координаты нормалей), текстурные координаты, описание материалов, пути и названия к текстурам, которые используются. Хранится иерархия объектов, хранится анимация, и хранятся привязки вершин к «костям» с описанием весов. В X файле может отсутствовать какая-либо информация об объекте (например в X файле могут содержаться только координаты вершин).
X файл может быть текстовым либо бинарным.
Содержание |
В начале X файла идёт заголовок, затем идёт описание информации об объекте. Описание информации может быть в произвольном порядке, но заголовок всегда идёт в самом начале.
Заголовок имеет следующий вид:
Тип | Подтип | Размер | Содержит | Пояснение |
---|---|---|---|---|
Магическое слово | 4 байта | "xof " | ||
Номер версии формата | основной номер | 2 байта | 03 | Основной номер версии формата — 3 |
дополнительный номер | 2 байта | 02 | Дополнительный номер версии формата — 2 | |
Тип формата | 4 байта | "txt " | Текстовый формат | |
"bin " | Бинарный формат | |||
"com " | Сжатый формат | |||
Тип сжатия (нужен, если формат "com ") | 4 байта | "lzw " | ||
"zip " | ||||
«и т. д.» | ||||
Размер в битах дробного числа | 4 байта | 0064 | 64 битное число | |
0032 | 32 битное число |
Заголовок всегда в текстовом виде и обычно выглядит так: xof 0303txt 0032
Далее, обычно, идёт описание Templates. Это своеобразная подсказка, чтобы лучше понять какие данные и в каком виде представлены.
Вообще порядок описания данных в X файле может быть произвольным. Ниже следует описание в таком порядке, в котором X файл генерируют популярные экспортёры.
После описания Templates обычно следует описание самого объекта (может следовать и анимация). Сам объект может быть простым или составным. Для того чтобы хранить сложные составные объекты разработали иерархию связей, через которую можно понять, какой объект с каким связан или от какого зависим. Эти данные используются например в скелетной анимации. Если двигать «кость» плеча, то должны двигаться и все зависимые от неё «кости» (объекты) — это вся рука. В иерархии связь так и хранится в явном виде. На вершине находится плечо, затем предплечье, затем кисть, далее от кости идёт несколько пальцев, которые друг от друга независимы, но зависимы от кисти, и далее следуют фаланги пальца.
В X-файле иерархия описана через ключевое слово Frame. За ключевым словом следует имя данного узла иерархии и фигурные скобки.
Пример:
Frame TopBone { }
Все узлы, вложенные в фигурные скобки TopBone { }, будут зависимы от этого узла. Вложенность может быть неограничено глубокой. Узлы, не вложенные в TopBone { }, будут независимыми друг от друга.
Пример вложенных узлов иерархии:
Frame TopBone { Frame Bone2 {} }
Здесь Bone2 зависим от TopBone и изменения, которые происходят с TopBone, влияют и на Bone2. Изменения с Bone2 не влияют на TopBone.
Пример независимых узлов:
Frame TopBone {} Frame Bone2 {}
Вообще в X файле может и не быть иерархии. Экспортёр от Microsoft в вершину иерархии всегда ставит узел SCENE_ROOT или DXCC_ROOT независимо от того, есть в этом необходимость или нет.
Поле Frame имеет следующий вид:
Название поля (TeamPlate) | UUID | ||
---|---|---|---|
Frame | <3D82AB46-62DA-11cf-AB39-0020AF71E433> | ||
Названия членов поля | Тип | размер данных | Дополнительные сведения |
FrameTransformMatrix | |||
Примечание | Если это поле отсутствует внутри Frame, | ||
то не нужно производить никаких локальных трансформаций | |||
Mesh | |||
Примечание | Количество Mesh может быть любым внутри Frame |
Пример Frame со всеми полями:
Frame Имя {
FrameTransformMatrix {}
Mesh Имя {}
}
Исторически сложилось, что объекты в 3DS MAX хранятся в своих локальных координатах. Хранится матрица трансформации этого объекта. Всё, что рисуется на сцене 3DS MAX, — рисуется в глобальных координатах. При экспортировании из 3DS MAX экспортёр не проводит анализа сцены и сохраняет её так, как есть. Ещё можно экспортировать только выбранный объект из всей сцены. Эти два условия и привели к рождению Frame, чтобы сохранить матрицу трансформации в FrameTransformMatrix (FrameTransformMatrix не может существовать обособленно от Frame) и сохранению локальных координат объектов 3D объекта, а не глобальных.
Если требуется, можно сохранить и глобальные координаты без Frame и FrameTransformMatrix, но стандартный экспортёр от Microsoft этого не делает.
Матрица трансформации FrameTransformMatrix представляет собой матрицу аффинных преобразований в однородных координатах. Пример матрицы трансформации:
FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000, 0.000000,1.000000,0.000000,0.000000, 0.000000,0.000000,1.000000,0.000000, 0.000000,0.000000,0.000000,1.000000;;}
Синтаксис должен быть именно таким, как показано в данном примере.
Далее, если требуется, следует описание геометрии после ключевого слова Mesh.
Cинтаксис следующий:
Mesh Имя_Меша {}
Если производится экспорт из 3DS MAX, то Имя_Меша совпадает с именем узла иерархии. И из 3DS MAX данные не экспортируются так, чтобы на один Frame приходилось несколько Mesh, хоть стандарт файла этого и не запрещает.
Поле Mesh имеет следующий вид:
Название поля (TeamPlate) | UUID | ||
---|---|---|---|
Mesh | <3D82AB44-62DA-11cf-AB39-0020AF71E433> | ||
Названия членов поля | Тип | размер данных | Дополнительные сведения |
nVertices | DWORD | Любой | |
vertices | массив Vector | nVertices | |
nFaces | DWORD | ||
faces | массив MeshFace | nFaces | |
Примечание | Это поле (Mesh) определяет базовую геометрию меша. Первый массив - это перечень координат вершин,второй - определяет фейсы. Три числа фейса - это индексы первого массива. | ||
Поля, которые могут быть внутри поля Mesh | |||
MeshFaceWraps | Если этого поля нет, то wrapping for both u and v defaults to false. | ||
MeshTextureCoords | Если этого поля нет, то нет и текстурных координат | ||
MeshVertexColors | Если этого поля нет, то цвет определён белым | ||
MeshMaterialList | Если этого поля нет, то материал - белый |
Поле MeshFaceWraps редко встречается в файлах. В этом поле хранятся текстурные координаты[источник?- Microsoft DirectX File Format Specification Version 1.13. Переписал 1 в 1. Перевод понимаю как: MeshFaceWraps хранит сразу и u и v координату. Нигде не нашёл применения на практике].
формат поля:
Название поля (TeamPlate) | UUID | ||
---|---|---|---|
MeshFaceWraps | <4885AE62-78E8-11cf-8F52-0040333594A3> | ||
Названия членов поля | Тип | размер данных | Дополнительные сведения |
nFaceWrapValues | DWORD | нет | |
faceWrapValues | Boolean2d | ||
Примечание | This template is used to define the texture topology of each face in a wrap. nFaceWrapValues should be equal to the number of faces in a mesh. |
В поле MeshTextureCoords хранятся текстурные координаты. формат поля:
Название поля (TeamPlate) | UUID | ||
---|---|---|---|
MeshTextureCoords | <F6F23F40-7686-11cf-8F52-0040333594A3> | ||
Названия членов поля | Тип | размер данных | Дополнительные сведения |
nTextureCoords | DWORD | нет | |
textureCoords | массив Coords2d | nTextureCoords | |
Примечание | Это поле определяет текстурные координаты меша |
В поле MeshVertexColors хранится цвет вершины. Обычно поля MeshTextureCoords и MeshVertexColors являются взаимоисключаемыми, т. к. если есть текстурные координаты (собственно сама текстура), то цвет точек не используется.
Название поля (TeamPlate) | UUID | ||
---|---|---|---|
MeshVertexColors | <1630B821-7842-11cf-8F52-0040333594A3> | ||
Названия членов поля | Тип | размер данных | Дополнительные сведения |
nVertexColors | DWORD | нет | |
vertexColors | массив IndexedColor | nVertexColors | |
Примечание | Это поле определяет цвет меша |
В поле MeshMaterialList хранится список материалов, используемых для отображения данного меша. В этом списке указываются и текстуры (файловые пути), в которые «одет» меш. Сама текстура не хранится в X файле.
Название поля (TeamPlate) | UUID | ||
MeshMaterialList | <F6F23F42-7686-11cf-8F52-0040333594A3> | ||
---|---|---|---|
Названия членов поля | Тип | Размер данных | Дополнительные сведения |
nMaterials | DWORD | Материал | |
nFaceIndexes | DWORD | ||
FaceIndexes | массив DWORD | nFaceIndexes | |
vertexColors | массив IndexedColor | nVertexColors | |
Примечание | |||
Это поле предназначенно для того, чтобы показать на каком фейсе меша какой материал используется. nMaterials показывает сколько материалов в данном меше. |
В текстовом X файле допускаются комментарии. После символов // разрешается писать любую поясняющую информацию, которая будет проигнорирована при загрузке меша. Данный комментарий действует до конца строки.
Ниже приведён полученный X файл:
xof 0303txt 0032 // это заголовок X файла // указано, что это текстовый x файл версии 3.3 с 32 битным форматом дробного числа // далее идет поясняющая информация об используемых полях template // пара пояснений, т. к. они занимают много места template Frame { <3d82ab46-62da-11cf-ab39-0020af71e433> [...] } template Matrix4x4 { <f6f23f45-7686-11cf-8f52-0040333594a3> array FLOAT matrix[16]; } // тот самый верхний узел иерархии Frame DXCC_ROOT { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000, 0.000000,1.000000,0.000000,0.000000, 0.000000,0.000000,1.000000,0.000000, 0.000000,0.000000,0.000000,1.000000;; } Frame Quad { FrameTransformMatrix { 1.000000,0.000000,0.000000,0.000000, 0.000000,-0.000000,-1.000000,0.000000, 0.000000,1.000000,0.000000,0.000000, -10.067115,43.624161,-0.000002,1.000000;; } Mesh Quad { 6; 15.067116;0.000002;-38.624161;, 5.067116;-0.000001;-48.624161;, 5.067116;0.000002;-38.624161;, 5.067116;-0.000001;-48.624161;, 15.067116;0.000002;-38.624161;, 15.067116;-0.000002;-48.624161;; 2; 3;0,1,2;, 3;3,4,5;; MeshNormals { 6; -0.000000;-0.000000;-1.000000;, -0.000000;-0.000000;-1.000000;, -0.000000;-0.000000;-1.000000;, 0.000000;-0.000000;-1.000000;, 0.000000;-0.000000;-1.000000;, 0.000000;-0.000000;-1.000000;; 2; 3;0,1,2;, 3;3,4,5;; } MeshTextureCoords { 6; 0.999501;-0.999500;, 0.000499;-0.000500;, 0.000500;-0.999501;, 0.000499;-0.000500;, 0.999501;-0.999500;, 0.999500;-0.000500;; } MeshMaterialList { 1; 2; 0, 0; Material { 0.588235;0.588235;0.588235;1.000000;; 0.100000; 0.900000;0.900000;0.900000;; 0.000000;0.000000;0.000000;; TextureFilename { "E:\\\\3dsmax7\\\\images\\\\terrain1.bmp"; } } } VertexDuplicationIndices { 6; 4; 0, 1, 2, 1, 0, 5; } } } }
Анимация может быть сохранена как в виде скелетной анимации, так и в виде трансформации вершин.
X (DirectX).