Проанализировал мой файл .obj, но он отображается странно - PullRequest
1 голос
/ 06 декабря 2011

Я следовал руководству по созданию замка в blender, затем экспортировал его в файл .obj и проанализировал его в формате, который выглядит следующим образом:

GLfloat mesh01_coords[] = {
50, 0.1, 50,
-50, 0.1, 50,
-50, 0.1, -50,
50, 0.1, -50,
-9.6351, 9.94983, 17.4283,
-9.6351, 9.94983, 18.7616,
-9.07887, 9.94983, 18.7616,
-9.07887, 9.94983, 17.4283,
10.2729, 9.94983, 18.8564,
10.2729, 9.94983, 17.523,
9.71662, 9.94983, 17.523,
9.71662, 9.94983, 18.8564,
10.3075, 9.94983, 20.0883,
8.97417, 9.94983, 20.0883,
8.97417, 10.9498, 20.0883,
...

РЕДАКТИРОВАТЬ: у меня настроен индексный массив

GLubyte mesh01_indices[] = {
0, 2, 1,
0, 3, 2,
4, 6, 5,
4, 7, 6,
...

Не будет ли моя модель загружена просто

glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glNormalPointer(GL_FLOAT, 0, mesh01_normals);
glVertexPointer(3, GL_FLOAT, 0, mesh01_coords);
glDrawElements(GL_TRIANGLES, n, GL_UNSIGNED_BYTE, mesh01_indices);

Это приводит к случайным объектам, ничего похожего на мой желаемый результат

EDIT2: Спасибо всем за помощь, у меня все получилось.

Ответы [ 3 ]

1 голос
/ 08 декабря 2011

Используя GL_UNSIGNED_INT для моих индексов, а также перекомпилируя файл блендера, чтобы убедиться, что все действительно было треугольниками, я смог увидеть замок

1 голос
/ 07 декабря 2011

Файлы Obj используют индексы. В основном это означает, что вы исключаете повторяющиеся вершины, указывая треугольники как индексы в вашем массиве вершин, вместо непосредственного указания треугольников с вершинами.

Вот пример «наивного» способа рисования квадрата (псевдокод):

// Triangle 1
Vertex v1 = (-1, 1, 0)
Vertex v2 = (-1, -1, 0)
Vertex v3 = (1, -1, 0)
// Triangle 2
Vertex v4 = (1, -1, 0)
Vertex v5 = (-1, 1, 0)
Vertex v6 = (1, 1, 0)

При использовании индексов это будет выглядеть так:

Vertex v1 = (-1, 1, 0)
Vertex v2 = (-1, -1, 0)
Vertex v3 = (1, -1, 0)
Vertex v4 = (1, 1, 0)

indices = {v1, v2, v3, // First triangle
          v3, v1, v4}  // Second triangle

Теперь, так как вы загружаете свои данные «наивным» способом, вы в основном пропускаете некоторые треугольники, которые необходимо будет визуализировать (отсюда и «отсутствующие аспекты»). Кроме того, некоторые треугольники отображаются неправильно, поскольку вы создаете их из вершин, которые могут не иметь отношения друг к другу.

Использование GL_QUADS не решит вашу проблему. Вы можете либо создать индексный буфер, который работает как во втором примере, либо сохранить вершины, а затем перебрать индексы и создать отдельные вершины из индекса в массив вершин, что приведет к чему-то похожему на первый пример. Однако, выполнение этого последним способом приведет к более низкой производительности и большему потреблению памяти, поскольку вы храните больше вершин и, следовательно, должны передавать больше информации на видеокарту.

0 голосов
/ 07 декабря 2011

Ваш код

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_BYTE, mesh01_indices);

нарисует только один треугольник, поскольку он будет использовать только первые 3 индекса.Попробуйте

glDrawElements(GL_TRIANGLES, n, GL_UNSIGNED_BYTE, mesh01_indices);

, где n - количество индексов в mesh01_indices.

...