- X (DirectX)
-
Формат X файла — формат файла для хранения 3D объектов, созданный компанией
Этот формат хранит информацию о геометрии 3D объекта (координаты вершин и координаты нормалей), текстурные координаты, описание материалов, пути и названия к текстурам, которые используются. Хранится иерархия объектов, хранится анимация, и хранятся привязки вершин к «костям» с описанием весов. В X файле может отсутствовать какая-либо информация об объекте (например в 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 Имя {}
}
Чтобы лучше понять зачем нужен Frame (или почему сделано именно так, как сделано), необходимо иметь представление о редакторе 3D объектов 3DS MAX. Так уж исторически сложилось, что объекты в 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 показывает сколько материалов в данном меше. Пример экспорта квадрата из 3DS MAX
В текстовом 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 File Format Reference
- Microsoft DirectX File Format Specification Version 1.13
- DirectX 9.0 SDK
Wikimedia Foundation. 2010.