Я работаю на платформе генератора трехмерных карт на C ++ / OpenGL, и после окончания работы с Perlin’s Noise мне нужно было загрузить на экран несколько 3d-моделей. Я никогда не пробовал это до, и после прочтения об этом я решил использовать формат модели COLLADA. Первым делом я прочитал XML-файл через TinyXML и преобразовал его в понятные классы внутри моего кода. Я могу получить доступ ко всему без проблем. Пока все было хорошо, но проблема для меня появилась, когда я попытался правильно преобразовать информацию XML в 3d-статические модели. Я прочитал много уроков о, но я думаю, что я не уловил «сущность» COLLADA, и тогда я здесь с просьбой о помощи. Мой файл «.dae» состоит из простой сферы, созданной в Blender. Не имеет значения, что я делаю, всякий раз, когда я пытаюсь загрузить его на свой экран, я всегда получаю что-то вроде «острого предмета», как на этом изображении:
http://s2.postimg.org/4fdz2fpl4/test.jpg
Конечно, я не беру правильные координаты, или, по крайней мере, я не правильно их применяю.
Вот это именно тот файл COLLADA, который я тестирую. Короче говоря, я делаю следующее:
1 — Сначала я получаю доступ к «polylist» и получаю значения «p», а также идентификатор, семантика которого VERTEX, в данном случае «ID2-mesh-vertices»
2 — Я получаю доступ к «вершинам» и получаю идентификатор источника, семантика которого — POSITION, в данном случае «# ID2-mesh-позиции»
3 — я получаю доступ к источнику «# ID2-mesh-позиции» и принимаю значения с плавающей точкой
4 — После этого я начал циклически перебирать значения «p» от трех до трех (соответственно «техники_коммон»), чтобы получить, соответственно, индексы вершин X, Y и Z, расположенных в пределах значений float источника. Например, что делает код =>
Очевидно, я делаю что-то очень неправильное, потому что не могу получить простую сферу.
*
<input semantic="VERTEX" source="#ID2-mesh-vertices" offset="0"/>
<input semantic="NORMAL" source="#ID2-mesh-normals" offset="1"/>
Это говорит о том, что для каждой вершины у вас есть 2 индекса, указывающих на ссылочные источники. 0 0
это первый сет, 1 1
это второе, 2 2
это третий. так как ваше первое значение полилиста равно 3 (на самом деле, все они равны), это составляет ваш первый треугольник.
Теперь эти индексы проходят через источник доступа для массива float …
<accessor source="#ID2-mesh-normals-array" count="266" stride="3">
<param name="X" type="float"/>
<param name="Y" type="float"/>
<param name="Z" type="float"/>
</accessor>
Это говорит вам о том, что для считывания нормали, связанной с индексом, вы должны разбить массив на 3 элемента, а каждый вектор состоит из 3-х чисел с плавающей запятой (X, Y, Z). Обратите внимание, что для шага не обязательно должно быть количество элементов в каждой вершине, хотя это часто имеет место.
Итак, чтобы завершить этот пример, чтобы прочитать индекс 2 нормального массива, вам нужно прочитать элементы, индексированные с помощью X_index=index*stride=6, Y_index=X_index+1=7, Z_index=X_index+2=8
, чтобы найти нормальный (X,Y,Z) = (-0.2561113 0 -0.8390759 -0.4953154)
И да, это означает, что у вас есть несколько индексов на вершину, то, что OpenGL не поддерживает изначально. Смотрите эти различные вопросы в качестве справочного материала.
Используйте de-indexer collada для предварительной обработки .dae и устранения нескольких индексов на вершину. Пока вы занимаетесь этим, преобразуйте в треугольники в предварительном процессе, чтобы еще больше упростить загрузчик.
https://collada.org/mediawiki/index.php/COLLADA_Refinery