Некоторый свет на логику COLLADA

Я работаю на платформе генератора трехмерных карт на 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 источника. Например, что делает код =>

  • 0 0 1 = {X -> 0,4330127; Y -> 0,4330127; Z -> 0,25}
  • 1 2 2 = {X -> 0,25; Y -> 0; Z -> 0}
  • 1 1 0 = {X -> 0,25; Y -> 0,25; Z -> 0,4330127}

Очевидно, я делаю что-то очень неправильное, потому что не могу получить простую сферу.

0

Решение

*

<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 не поддерживает изначально. Смотрите эти различные вопросы в качестве справочного материала.

Рендеринг сеток с несколькими индексами

Как использовать разные индексы для массива координат координат и массива вершин, используя glDrawElements

3 индексных буфера

0

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

Используйте de-indexer collada для предварительной обработки .dae и устранения нескольких индексов на вершину. Пока вы занимаетесь этим, преобразуйте в треугольники в предварительном процессе, чтобы еще больше упростить загрузчик.
https://collada.org/mediawiki/index.php/COLLADA_Refinery

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector