Как файлы .dae хранят данные сетки?

Я пытаюсь прочитать сетку из файла .dae в проект DirectX, используя TinyXML, и мне трудно понять, как файлы .dae хранят данные сетки.

Я считаю, что я нашел, где хранятся данные сетки: внутри тега <library_geometries> есть следующий код:

<library_geometries>
<geometry id="Tall_bodyShape" name="Tall_bodyShape">
<mesh>
<source id="Tall_bodyShape-positions" name="position">
<float_array id="Tall_bodyShape-positions-array" count="2910"> *** lots of numbers *** </float_array>
<technique_common>
<accessor source="#Tall_bodyShape-positions-array" count="970" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<source id="Tall_bodyShape-normals" name="normal">
<float_array id="Tall_bodyShape-normals-array" count="3948"> *** lots of numbers *** </float_array>
<technique_common>
<accessor source="#Tall_bodyShape-normals-array" count="1316" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
</technique_common>
</source>
<source id="Tall_bodyShape-UVChannel_1" name="UVChannel_1">
<float_array id="Tall_bodyShape-UVChannel_1-array" count="2892"> *** lots of numbers *** </float_array>
<technique_common>
<accessor source="#Tall_bodyShape-UVChannel_1-array" count="1446" stride="2">
<param name="S" type="float"/>
<param name="T" type="float"/>
</accessor>
</technique_common>
</source>
<vertices id="Tall_bodyShape-vertices">
<input semantic="POSITION" source="#Tall_bodyShape-positions"/>
</vertices>
<triangles material="Tall_bodySG" count="1883">
<input semantic="VERTEX" source="#Tall_bodyShape-vertices" offset="0"/>
<input semantic="NORMAL" source="#Tall_bodyShape-normals" offset="1"/>
<input semantic="TEXCOORD" source="#Tall_bodyShape-UVChannel_1" offset="2" set="0"/>
<p> *** lots of numbers *** </p>
</triangles>
</mesh>
<extra>
<technique profile="MAYA">
<double_sided>1</double_sided>
</technique>
</extra>
</geometry>
</library_geometries>

Таким образом, вершины хранятся внутри <source> названный тег "position", нормали хранятся в пределах <source> названный тег "normal" и <triangles> В теге указывается, какие координаты UV и нормали связаны с какой вершиной.

Я предполагаю, что треугольники перечислены в «линейном» или «зачистном» методе, но в нем не говорится, что и что бы я ни пытался, они оба показывают зубчатый, заштрихованный беспорядок треугольников.

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

РЕДАКТИРОВАТЬ: Дополнительное примечание: Я уверен, что файл .dae является правильным и действительным, поскольку он может быть правильно загружен в PhyreEngine (я использую .dae, который я использовал для университетского проекта в прошлом году).

1

Решение

Я понимаю, что это относительно старый вопрос, но так как на него действительно не было ответа, я постараюсь решить его для потомков.

Вы правы в том, что позиции, нормали и т. Д. Хранятся в виде массивов с плавающей точкой в <source> элементы. <p> Элемент («примитив») хранит индексы для трех входов, перечисленных непосредственно перед <triangles> элемент. То есть первые 3 целых числа (например, «0 0 0») указывают на соответствующие значения VERTEX, NORMAL и TEXCOORD (UVChannel) для первой вершины. Что это в <triangles> Элемент указывает, что каждый набор из 3 вершин (9 целых чисел индекса) описывает новый треугольник, поэтому ни один из индексов не используется повторно. Если бы геометрия была настроена на использование полос (повторное использование двух предыдущих вершин) или вееров (повторное использование первой и предыдущих вершин), родительский элемент был бы вызван <tristrips> или же <trifans>соответственно. Второй набор из 3 целых чисел (например, «1 1 1») описывает вторую вершину в первом треугольнике и так далее.

Также, как указывает @jterrace, геометрические координаты являются внутренними по отношению к объекту, описанному в геометрии. Чтобы правильно разместить объект на сцене в целом, вам придется применить соответствующие преобразования (<translate>, <rotate>и т. д.) со сцены, как описано в <library_visual_scenes>,

2

Другие решения

Я использовал Assimp для загрузки данных сетки. Объяснение и код здесь:
http://www.youtube.com/watch?v=ClqnhYAYtcY
http://www.mediafire.com/download/006lk0xomup7laq/assimpLinux.zip

1