C ++ OpenGL Неправильные координаты текстуры Collada

Я разбираю Collada file для анимации. Я хорошо нарисовал и анимировал, но теперь проблема в том, как установить координаты текстуры. Я кормлю его OpenGL точно, как файл collada dae дает его мне, но он отображается совершенно неправильно. Координаты находятся в диапазоне от [0-1].

Должен ли я изменить это?

Если я так сделаю, пожалуйста, объясните мне, как это сделать. Я пытался использовать GL_LINEAR и GL_NEAREST, но это не решает проблему. Есть идеи почему?

Модели, которые я использую, это AstroBoy, который http://www.wazim.com/Collada_Tutorial_1.htm дает и амнезия слуга ворчать.

2

Решение

Исходя из того, как вы сказали, что оно оказалось совершенно неверным, я предполагаю, что вы не приняли во внимание значения индекса текстуры. У меня была похожая проблема (хотя и с другой моделью). Точно так же, как вы можете иметь массив значений индекса, чтобы OpenGL знал, в каком порядке рисовать вершины, Collada назначает значения индекса UV (и нормальные значения индекса), и, к сожалению, они никогда не находятся в одном и том же порядке. Возьмите следующий образец Collada, например:

<source id="Box001-POSITION">
<float_array id="Box001-POSITION-array" count="1008">
-167.172180 -193.451920 11.675772
167.172180 -193.451920 11.675772 .....
....
....
<source id="Box001-Normal0">
<float_array id="Box001-Normal0-array" count="5976">
-0.000000 -0.025202 -0.999682
-0.000000 -0.025202 -0.999682 .....
....
....
<source id="Box001-UV0">
<float_array id="Box001-UV0-array" count="696">
0.000000 0.000000
1.000000 0.000000
0.000000 1.000000 .....
....
....
<triangles count="664" material="_13 - Default">
<input semantic="VERTEX" offset="0" source="#Box001-POSITION"/>
<input semantic="NORMAL" offset="1" source="#Box001-Normal0"/>
<input semantic="TEXCOORD" offset="2" set="0" source="#Box001-UV0"/>
<p> 169 0 171 170 1 172 171 2 173 171 3
173 168 4 170 169 5 171 173 6 175 174
7 176 175 8 177 175 9 177 172 10 174 173 11 175 108 ....

Первые три раздела указывают значения вершин / нормалей / текстур-координат, но последний раздел указывает индекс каждого значения. Обратите внимание, что первый индекс вершины равен 169, но первый нормальный индекс равен 0. На самом деле нормальные индикаторы полностью нормальны, они прогрессируют как «0..1..2..3», но индикаторы для вершин и текстур повсюду! Вы должны упорядочить свои значения вершин и текстур так, как это делает файл Collada.

Другой способ — написать небольшую программу, которая анализирует файл collada и упорядочивает все ваши значения вершин, нормалей и UV в правильном порядке на основе значений индекса. Тогда вы можете просто направить свои очки прямо в OpenGL без вопросов. Конечно, вам решать, каким образом вы хотите с этим справиться.

(PS: Если вы можете сделать хороший анализатор для файлов Collada, то «interleaved-indexing» на самом деле очень удобен, если нет, я нахожу это чрезмерным осложнением со стороны Collada, но вы ничего не можете поделать с Это.)

3

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

Нет, я советую вам прочитать некоторые базовые знания о коллада.

 <triangles count="664" material="_13 - Default">
<input semantic="VERTEX" offset="0" source="#Box001-POSITION"/>
<input semantic="NORMAL" offset="1" source="#Box001-Normal0"/>
<input semantic="TEXCOORD" offset="2" set="0" source="#Box001-UV0"/>
<p> 169 0 171 170 1 172 171 2 173 171 3......

169 — это индекс первой точки треугольника, 0 — это первый нормальный индекс, а 171 — это первый индекс texcoord и т. д.

1