X (формат файлов)

Поделись знанием:
Перейти к: навигация, поиск
К:Википедия:Страницы на КУ (тип: не указан)
Контейнер 3D объектов
Сигнатура

xof

Тип формата

текстовый либо двоичный

Развит в

.sdkmesh

X — формат файла для хранения 3D объектов, созданный компанией Microsoft.

Этот формат хранит информацию о геометрии 3D объекта (координаты вершин и координаты нормалей), текстурные координаты, описание материалов, пути и названия к текстурам, которые используются. Хранится иерархия объектов, хранится анимация, и хранятся привязки вершин к «костям» с описанием весов. В X файле может отсутствовать какая-либо информация об объекте (например в X файле могут содержаться только координаты вершин).

X файл может быть текстовым либо бинарным.





Структура X Файла

В начале X файла идёт заголовок, затем идёт описание информации об объекте. Описание информации может быть в произвольном порядке, но заголовок всегда идёт в самом начале.

Описание заголовка

Заголовок имеет следующий вид:

ТипПодтипРазмерСодержитПояснение
Магическое слово 4 байта"xof "
Номер версии форматаосновной номер2 байта03Основной номер версии формата — 3
дополнительный номер2 байта02Дополнительный номер версии формата — 2
Тип формата 4 байта"txt "Текстовый формат
"bin "Бинарный формат
"com "Сжатый формат
Тип сжатия (применяется, если формат "com ") 4 байта"lzw "
4 байта"zip "
4 байта"и т.д."
Размер в битах типа дробного числа 4 байта006464 битное число
003232 битное число

Заголовок всегда в текстовом виде и обычно выглядит так: 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 имеет следующий вид:

Описываемый шаблон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.

Синтаксис следующий:

Mesh Имя_Меша {}

Если производится экспорт из 3DS MAX, то Имя_Меша совпадает с именем узла иерархии. И из 3DS MAX данные не экспортируются так, чтобы на один Frame приходилось несколько Mesh, хоть стандарт файла этого и не запрещает.

Шаблон Mesh имеет следующий вид:

Описываемый шаблонUUIDВложенный шаблонПоле шаблонаТипПояснение
Mesh<3D82AB44-62DA-11cf-AB39-0020AF71E433> шаблон определяет базовую геометрию
nVerticesDWORDколичество точек
Verticesarray Vectorмассив точек
nFacesDWORDколичество фейсов
Facesarray MeshFaceмассив фейсов
MeshFaceWrapsесли этого поля нет, то wrapping for both u and v defaults to false
MeshTextureCoordsесли этого поля нет, то нет и текстурных координат
MeshVertexColorsесли этого поля нет, то цвет определён белым
MeshMaterialListесли этого поля нет, то влияние материала игнорируется

Шаблон MeshFaceWraps встречается в ранних форматах X файлов и больше не используется. Хранит текстурные координаты[источник?- Microsoft DirectX File Format Specification Version 1.13. Переписал 1 в 1. Перевод понимаю как: MeshFaceWraps хранит сразу и u и v координату. Нигде не нашёл применения на практике]. Формат:

Описываемый шаблонUUIDВложенный шаблонПоле шаблонаТипПояснение
MeshFaceWraps<4885AE62-78E8-11cf-8F52-0040333594A3> 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.
nFaceWrapValuesDWORD
faceWrapValuesarray Boolean2d

Шаблон MeshTextureCoords описывает текстурные координаты. Формат:

Описываемый шаблонUUIDВложенный шаблонПоле шаблонаТипПояснение
MeshTextureCoords<.F6F23F40-7686-11cf-8F52-0040333594A3>
nTextureCoordsDWORD
textureCoordsarray Coords2d

Шаблон MeshVertexColors описывает цвет вершины. Шаблоны MeshTextureCoords и MeshVertexColors являются взаимоисключаемыми, так как если есть текстурные координаты (собственно сама текстура), то цвет точек не используется. Но при надобности эти данные можно сочетать.

Описываемый шаблонUUIDВложенный шаблонПоле шаблонаТипПояснение
MeshVertexColors<1630B821-7842-11cf-8F52-0040333594A3>
nVertexColorsDWORD
vertexColorsarray IndexColor

Шаблон MeshMaterialList описывает применённые материалы, используемые для отображения данного меша. В этом списке указываются файлы и пути текстур, в которые «одет» меш. Сама текстура не хранится в X файле.

Описываемый шаблонUUIDВложенный шаблонПоле шаблонаТипПояснение
MeshMaterialList< F6F23F42-7686-11CF-8F52-0040333594A3 >
nMaterialsDWORDколичество испольщуемых материалов
nFaceIndexesDWORDколичество задействованых фейсов
faceIndexesarray DWORDмассив фейсов

Пример экспорта квадрата из 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;

}

}

}

}

Анимация

Анимация может быть сохранена как в виде скелетной анимации, так и в виде трансформации вершин.

Источники

  • [msdn.microsoft.com/en-us/library/bb173014.aspx X File Format Reference]
  • Microsoft DirectX File Format Specification Version 1.13
  • DirectX 9.0 SDK
  • Chuck Walbourn. [blogs.msdn.com/b/chuckw/archive/2014/06/27/directxmesh.aspx#10542734 DirectX Mesh]. Проверено 21 апреля 2015.
  • [msdn.microsoft.com/en-us/library/windows/desktop/bb174837%28v=vs.85%29.aspx Microsoft - X Files (Legacy) (Direct3D 9)]

Напишите отзыв о статье "X (формат файлов)"

Отрывок, характеризующий X (формат файлов)

В это время подъехала к крыльцу карета и бричка, и из кареты вышел князь Андрей, высадил свою маленькую жену и пропустил ее вперед. Седой Тихон, в парике, высунувшись из двери официантской, шопотом доложил, что князь почивают, и торопливо затворил дверь. Тихон знал, что ни приезд сына и никакие необыкновенные события не должны были нарушать порядка дня. Князь Андрей, видимо, знал это так же хорошо, как и Тихон; он посмотрел на часы, как будто для того, чтобы поверить, не изменились ли привычки отца за то время, в которое он не видал его, и, убедившись, что они не изменились, обратился к жене:
– Через двадцать минут он встанет. Пройдем к княжне Марье, – сказал он.
Маленькая княгиня потолстела за это время, но глаза и короткая губка с усиками и улыбкой поднимались так же весело и мило, когда она заговорила.
– Mais c'est un palais, – сказала она мужу, оглядываясь кругом, с тем выражением, с каким говорят похвалы хозяину бала. – Allons, vite, vite!… [Да это дворец! – Пойдем скорее, скорее!…] – Она, оглядываясь, улыбалась и Тихону, и мужу, и официанту, провожавшему их.
– C'est Marieie qui s'exerce? Allons doucement, il faut la surprendre. [Это Мари упражняется? Тише, застанем ее врасплох.]
Князь Андрей шел за ней с учтивым и грустным выражением.
– Ты постарел, Тихон, – сказал он, проходя, старику, целовавшему его руку.
Перед комнатою, в которой слышны были клавикорды, из боковой двери выскочила хорошенькая белокурая француженка.
M lle Bourienne казалась обезумевшею от восторга.
– Ah! quel bonheur pour la princesse, – заговорила она. – Enfin! Il faut que je la previenne. [Ах, какая радость для княжны! Наконец! Надо ее предупредить.]
– Non, non, de grace… Vous etes m lle Bourienne, je vous connais deja par l'amitie que vous рorte ma belle soeur, – говорила княгиня, целуясь с француженкой. – Elle ne nous attend рas? [Нет, нет, пожалуйста… Вы мамзель Бурьен; я уже знакома с вами по той дружбе, какую имеет к вам моя невестка. Она не ожидает нас?]
Они подошли к двери диванной, из которой слышался опять и опять повторяемый пассаж. Князь Андрей остановился и поморщился, как будто ожидая чего то неприятного.
Княгиня вошла. Пассаж оборвался на середине; послышался крик, тяжелые ступни княжны Марьи и звуки поцелуев. Когда князь Андрей вошел, княжна и княгиня, только раз на короткое время видевшиеся во время свадьбы князя Андрея, обхватившись руками, крепко прижимались губами к тем местам, на которые попали в первую минуту. M lle Bourienne стояла около них, прижав руки к сердцу и набожно улыбаясь, очевидно столько же готовая заплакать, сколько и засмеяться.
Князь Андрей пожал плечами и поморщился, как морщатся любители музыки, услышав фальшивую ноту. Обе женщины отпустили друг друга; потом опять, как будто боясь опоздать, схватили друг друга за руки, стали целовать и отрывать руки и потом опять стали целовать друг друга в лицо, и совершенно неожиданно для князя Андрея обе заплакали и опять стали целоваться. M lle Bourienne тоже заплакала. Князю Андрею было, очевидно, неловко; но для двух женщин казалось так естественно, что они плакали; казалось, они и не предполагали, чтобы могло иначе совершиться это свидание.
– Ah! chere!…Ah! Marieie!… – вдруг заговорили обе женщины и засмеялись. – J'ai reve сette nuit … – Vous ne nous attendez donc pas?… Ah! Marieie,vous avez maigri… – Et vous avez repris… [Ах, милая!… Ах, Мари!… – А я видела во сне. – Так вы нас не ожидали?… Ах, Мари, вы так похудели. – А вы так пополнели…]
– J'ai tout de suite reconnu madame la princesse, [Я тотчас узнала княгиню,] – вставила m lle Бурьен.
– Et moi qui ne me doutais pas!… – восклицала княжна Марья. – Ah! Andre, je ne vous voyais pas. [А я не подозревала!… Ах, Andre, я и не видела тебя.]
Князь Андрей поцеловался с сестрою рука в руку и сказал ей, что она такая же pleurienicheuse, [плакса,] как всегда была. Княжна Марья повернулась к брату, и сквозь слезы любовный, теплый и кроткий взгляд ее прекрасных в ту минуту, больших лучистых глаз остановился на лице князя Андрея.
Княгиня говорила без умолку. Короткая верхняя губка с усиками то и дело на мгновение слетала вниз, притрогивалась, где нужно было, к румяной нижней губке, и вновь открывалась блестевшая зубами и глазами улыбка. Княгиня рассказывала случай, который был с ними на Спасской горе, грозивший ей опасностию в ее положении, и сейчас же после этого сообщила, что она все платья свои оставила в Петербурге и здесь будет ходить Бог знает в чем, и что Андрей совсем переменился, и что Китти Одынцова вышла замуж за старика, и что есть жених для княжны Марьи pour tout de bon, [вполне серьезный,] но что об этом поговорим после. Княжна Марья все еще молча смотрела на брата, и в прекрасных глазах ее была и любовь и грусть. Видно было, что в ней установился теперь свой ход мысли, независимый от речей невестки. Она в середине ее рассказа о последнем празднике в Петербурге обратилась к брату:
– И ты решительно едешь на войну, Andre? – сказала oia, вздохнув.
Lise вздрогнула тоже.
– Даже завтра, – отвечал брат.
– II m'abandonne ici,et Du sait pourquoi, quand il aur pu avoir de l'avancement… [Он покидает меня здесь, и Бог знает зачем, тогда как он мог бы получить повышение…]
Княжна Марья не дослушала и, продолжая нить своих мыслей, обратилась к невестке, ласковыми глазами указывая на ее живот:
– Наверное? – сказала она.
Лицо княгини изменилось. Она вздохнула.
– Да, наверное, – сказала она. – Ах! Это очень страшно…
Губка Лизы опустилась. Она приблизила свое лицо к лицу золовки и опять неожиданно заплакала.
– Ей надо отдохнуть, – сказал князь Андрей, морщась. – Не правда ли, Лиза? Сведи ее к себе, а я пойду к батюшке. Что он, всё то же?
– То же, то же самое; не знаю, как на твои глаза, – отвечала радостно княжна.
– И те же часы, и по аллеям прогулки? Станок? – спрашивал князь Андрей с чуть заметною улыбкой, показывавшею, что несмотря на всю свою любовь и уважение к отцу, он понимал его слабости.
– Те же часы и станок, еще математика и мои уроки геометрии, – радостно отвечала княжна Марья, как будто ее уроки из геометрии были одним из самых радостных впечатлений ее жизни.
Когда прошли те двадцать минут, которые нужны были для срока вставанья старого князя, Тихон пришел звать молодого князя к отцу. Старик сделал исключение в своем образе жизни в честь приезда сына: он велел впустить его в свою половину во время одевания перед обедом. Князь ходил по старинному, в кафтане и пудре. И в то время как князь Андрей (не с тем брюзгливым выражением лица и манерами, которые он напускал на себя в гостиных, а с тем оживленным лицом, которое у него было, когда он разговаривал с Пьером) входил к отцу, старик сидел в уборной на широком, сафьяном обитом, кресле, в пудроманте, предоставляя свою голову рукам Тихона.
– А! Воин! Бонапарта завоевать хочешь? – сказал старик и тряхнул напудренною головой, сколько позволяла это заплетаемая коса, находившаяся в руках Тихона. – Примись хоть ты за него хорошенько, а то он эдак скоро и нас своими подданными запишет. – Здорово! – И он выставил свою щеку.
Старик находился в хорошем расположении духа после дообеденного сна. (Он говорил, что после обеда серебряный сон, а до обеда золотой.) Он радостно из под своих густых нависших бровей косился на сына. Князь Андрей подошел и поцеловал отца в указанное им место. Он не отвечал на любимую тему разговора отца – подтруниванье над теперешними военными людьми, а особенно над Бонапартом.
– Да, приехал к вам, батюшка, и с беременною женой, – сказал князь Андрей, следя оживленными и почтительными глазами за движением каждой черты отцовского лица. – Как здоровье ваше?
– Нездоровы, брат, бывают только дураки да развратники, а ты меня знаешь: с утра до вечера занят, воздержен, ну и здоров.
– Слава Богу, – сказал сын, улыбаясь.
– Бог тут не при чем. Ну, рассказывай, – продолжал он, возвращаясь к своему любимому коньку, – как вас немцы с Бонапартом сражаться по вашей новой науке, стратегией называемой, научили.
Князь Андрей улыбнулся.
– Дайте опомниться, батюшка, – сказал он с улыбкою, показывавшею, что слабости отца не мешают ему уважать и любить его. – Ведь я еще и не разместился.
– Врешь, врешь, – закричал старик, встряхивая косичкою, чтобы попробовать, крепко ли она была заплетена, и хватая сына за руку. – Дом для твоей жены готов. Княжна Марья сведет ее и покажет и с три короба наболтает. Это их бабье дело. Я ей рад. Сиди, рассказывай. Михельсона армию я понимаю, Толстого тоже… высадка единовременная… Южная армия что будет делать? Пруссия, нейтралитет… это я знаю. Австрия что? – говорил он, встав с кресла и ходя по комнате с бегавшим и подававшим части одежды Тихоном. – Швеция что? Как Померанию перейдут?
Князь Андрей, видя настоятельность требования отца, сначала неохотно, но потом все более и более оживляясь и невольно, посреди рассказа, по привычке, перейдя с русского на французский язык, начал излагать операционный план предполагаемой кампании. Он рассказал, как девяностотысячная армия должна была угрожать Пруссии, чтобы вывести ее из нейтралитета и втянуть в войну, как часть этих войск должна была в Штральзунде соединиться с шведскими войсками, как двести двадцать тысяч австрийцев, в соединении со ста тысячами русских, должны были действовать в Италии и на Рейне, и как пятьдесят тысяч русских и пятьдесят тысяч англичан высадятся в Неаполе, и как в итоге пятисоттысячная армия должна была с разных сторон сделать нападение на французов. Старый князь не выказал ни малейшего интереса при рассказе, как будто не слушал, и, продолжая на ходу одеваться, три раза неожиданно перервал его. Один раз он остановил его и закричал:
– Белый! белый!
Это значило, что Тихон подавал ему не тот жилет, который он хотел. Другой раз он остановился, спросил:
– И скоро она родит? – и, с упреком покачав головой, сказал: – Нехорошо! Продолжай, продолжай.
В третий раз, когда князь Андрей оканчивал описание, старик запел фальшивым и старческим голосом: «Malbroug s'en va t en guerre. Dieu sait guand reviendra». [Мальбрук в поход собрался. Бог знает вернется когда.]
Сын только улыбнулся.
– Я не говорю, чтоб это был план, который я одобряю, – сказал сын, – я вам только рассказал, что есть. Наполеон уже составил свой план не хуже этого.
– Ну, новенького ты мне ничего не сказал. – И старик задумчиво проговорил про себя скороговоркой: – Dieu sait quand reviendra. – Иди в cтоловую.


В назначенный час, напудренный и выбритый, князь вышел в столовую, где ожидала его невестка, княжна Марья, m lle Бурьен и архитектор князя, по странной прихоти его допускаемый к столу, хотя по своему положению незначительный человек этот никак не мог рассчитывать на такую честь. Князь, твердо державшийся в жизни различия состояний и редко допускавший к столу даже важных губернских чиновников, вдруг на архитекторе Михайле Ивановиче, сморкавшемся в углу в клетчатый платок, доказывал, что все люди равны, и не раз внушал своей дочери, что Михайла Иванович ничем не хуже нас с тобой. За столом князь чаще всего обращался к бессловесному Михайле Ивановичу.
В столовой, громадно высокой, как и все комнаты в доме, ожидали выхода князя домашние и официанты, стоявшие за каждым стулом; дворецкий, с салфеткой на руке, оглядывал сервировку, мигая лакеям и постоянно перебегая беспокойным взглядом от стенных часов к двери, из которой должен был появиться князь. Князь Андрей глядел на огромную, новую для него, золотую раму с изображением генеалогического дерева князей Болконских, висевшую напротив такой же громадной рамы с дурно сделанным (видимо, рукою домашнего живописца) изображением владетельного князя в короне, который должен был происходить от Рюрика и быть родоначальником рода Болконских. Князь Андрей смотрел на это генеалогическое дерево, покачивая головой, и посмеивался с тем видом, с каким смотрят на похожий до смешного портрет.