Как настроить / рассчитать текстурбуфдер в GltexcoordPointer при импорте из obj-файла

StackOverflow https://stackoverflow.com/questions/4233152

  •  26-09-2019
  •  | 
  •  

Вопрос

Я разбираю файл OBJ в Android, и моя цель - регларировать и отображать объект. Все работает нормально, за исключением правильного сопоставления текстуры (импортирование ресурса / изображения в OpenGL и т. Д. Точно).

Я не знаю, как заполнить данные, связанные с текстурой, связанные с файлом OBJ в текстурбуфтер-объект.

В OBJ-файле у меня VT-Lines:

vt 0.495011 0.389417 
vt 0.500686 0.561346

и линию лица:

f 127/73/62 98/72/62 125/75/62

Моя розыгрыш выглядит как (только соответствующие части):

gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glNormalPointer(GL10.GL_FLOAT, 0, normalsBuffer);

gl.glTexCoordPointer(2, GL10.GL_SHORT, 0, t.getvtBuffer());

gl.glDrawElements(GL10.GL_TRIANGLES, t.getFacesCount(), GL10.GL_UNSIGNED_SHORT, t.getFaceBuffer());

Выход отсчетов obj-файла:

Vertex-count: 1023
Vns-count: 1752
Vts-count: 524
/////////////////////////
Part 0
Material name:default
Number of faces:2037
Number of vnPointers:2037
Number of vtPointers:2037

Любой совет приветствуется.

Это было полезно?

Решение

Извините, не уверен, в какой степени это покровительствует, но сверху:

f 127/73/62 98/72/62 125/75/62

Означает треугольник между вершиной с 127-й позицией, приведенной в файле, 73-й позиции текстуры в файле и 62-й нормальном и двух других вершинах, указанных аналогичным образом.

В OpenGL вы указываете только один индекс на вершину (так как все это проходит через преобразование как единое целое), поэтому вам нужно выяснить все различные комбинации позиции, координату текстуры и нормально и устраивать буферы, которые вы передаете glVertexPointer, glNormalPointer и glTexCoordPointer соответственно. Например, приведенное выше лицо может быть указано через GL_TRIANGLES как между вершинами 0, 1 и 2, где вы бы скопировали 127-е место до первой в своем внутреннем буфере вершины, вы скопировали координату 73-й текстуры для первого В вашем внутреннем буфере координат текстуры, и вы скопировали 62-й нормальный в первый в вашем внутреннем нормальном списке.

Вполне возможно, вы хотите, чтобы Hashmap принимал комбинированную клавишу вершины / текстуры координаты / Normal и отображение в положение в ваших внутренних массивах. Когда вы сталкиваетесь с каждым лицом в Incoming Obj, вы можете проверить, вы уже получили эту комбинацию, выделенную на место в ваших внутренних буферах и дайте ему следующую доступную, если нет.

VT - это текстура координат, так, например, координата текстуры:

vt 0.495011 0.389417

Означает, что в рамках текстурного пространства X = 0,495011, y = 0,389417. Из памяти форма формата файла OBJ и OpenGL имеют оси Y в противоположных направлениях. Таким образом, в условиях OpenGL вы хотите S = 0,495011, T = 1 - 0,389417 = 0,610583.

Если ваш объект использует соответствующую сложную текстуру ATLAS или Shinkning, я представляю, это будет далеко не очевидно, что координаты Y перевернуты; Если у вас просто есть что-то вроде куба с одной и той же текстурой, повторяется полностью на каждом лице, возможно, вы, вероятно, просто увидите его как перевернуты по вертикали.

Это охватывает источник путаницы?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top