координаты текстуры opengl es 2.0 - PullRequest
0 голосов
/ 24 марта 2012

Я написал простую программу просмотра моделей для Android, которая анализирует файл волнового фронта .obj для создания 3d-модели. Я экспортирую простую икосферу, текстурированную с помощью ультрафиолетовой карты, из Blender, которая поставляется в этом формате

v 0.000000 -1.000000 0.000000
v 0.723600 -0.447215 0.525720
v -0.276385 -0.447215 0.850640
.
.
.
v -0.723600 0.447215 -0.525720
v 0.276385 0.447215 -0.850640
v 0.894425 0.447215 0.000000
vt 0.238062 0.172144
vt 0.314133 0.212645
vt 0.264721 0.263452
.
.
.
vt 0.176955 0.098382
vt 0.327646 0.115775
vt 0.361262 0.040083
f 103/1 15/2 48/3
f 48/3 44/4 103/1
f 13/5 103/1 44/4
.
.
.
f 47/12 105/8 46/10
f 14/9 46/10 105/8
f 105/8 47/12 15/2

«v» представляет вершины, «vt» представляет координаты текстуры, а «f» представляет грани со значениями перед косой чертой, являющимися индексами, соответствующими вершинам, а значения после косой черты являются индексами, соответствующими координаты текстуры. Моя проблема в том, что я не уверен, как ввести индексы координат текстуры в открытые окна, поэтому моя текущая модель выглядит очень странно, так как координаты текстуры не совпадают.

enter image description here

1 Ответ

0 голосов
/ 24 марта 2012

OBJ определяет начало текстуры в левом верхнем углу.OpenGL определяет это, чтобы быть в левом нижнем углу.Вам нужно инвертировать координаты y, поступающие из OBJ.

РЕДАКТИРОВАТЬ: в ответ на то, что я интерпретирую как скептицизм со стороны Кристиана Рау ниже, для целей OpenGL и ограничения свойств только теми, которые вы фактически используетевершина - это комбинация позиции и координаты текстуры.Это две вещи вместе.Вы можете подумать, что они логически различны, но OpenGL - нет.Вы можете ответить на вопрос "какая вершина OBJ находится в записи 23 в списке, переданном в OpenGL?"с ответом типа «это вершина 46/10».

Один из способов реализовать это при загрузке - через любой из подклассов Dictionary (например, Hashtable).При возникновении необходимости использовать вершину 46/10 вы должны создать подходящий составной ключ и проверить Hashtable на соответствие позиции индекса массива OpenGL.Если вам не удалось найти его, вы должны выделить следующую доступную позицию индекса и сохранить запись в своем словаре.

Итак, из вашего вопроса следующее:

f 103/1 15/2 48/3
f 48/3 44/4 103/1
f 13/5 103/1 44/4
.
.
.
f 47/12 105/8 46/10
f 14/9 46/10 105/8
f 105/8 47/12 15/2

Дает повышение додесять вершин, которые являются вершинами 103/1, 13/5, 48/3, 44/4, 15/2, 47/12, 105/8, 46/10, 14/9 и 46 / 10.

...