Как правильно отрисовать лица из файла 3ds - PullRequest
1 голос
/ 24 октября 2011

Я реализовал возможность загрузки файлов 3DS в мою программу OpenGL и столкнулся с небольшой проблемой.Все вершины расположены правильно, а грани нарисованы, но проблема в том, что большинство (или все) вершин, похоже, сохраняют связь с одной или двумя вершинами, создавая большое количество дополнительных ребер.Кто-нибудь сталкивался с этой проблемой раньше или есть предложение, как я могу это исправить?

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

glBegin(GL_TRIANGLES);
for(int x = 1; x < 4*numberOfTriangles+1; x++)
{
    //Face bit modifiers not needed, skip em.
    if(tLoop == 4)
    {
        tLoop = 0;
        continue;
    }
    else
    {
        glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]);
        tLoop++;
    }
}
glEnd();

Это изображение, представляющее проблему, с которой я столкнулся.http://img.photobucket.com/albums/v298/Reaperc89/Pistol.jpg

Ответы [ 2 ]

3 голосов
/ 25 октября 2011

Тот факт, что glBegin и glEnd находятся вне цикла, абсолютно не проблема.Рисование треугольников с использованием каждой вершины одна за другой - правильный путь.Он будет строить треугольную форму каждые 3 последовательных вершины, что вам и нужно.

Ваша проблема заключалась в том, что вы увеличили tLoop внутри блока else и поэтому фактически пропускали каждый пятый индекс вместо каждого четвертого,Развертывание помешало этому, но это не имеет ничего общего с glBegin/glEnd, не работающим вне цикла.Но, как сказано в комментарии, вам все равно не нужно tLoop, так как вы можете просто использовать x вместо:

glBegin(GL_TRIANGLES);
for(int x = 1; x < 4*numberOfTriangles+1; x++)
    if(x % 4)   //works if x starts at 1, though I don't know why x has to start at 1
        glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]);
glEnd();

или даже лучше развернуть цикл:

glBegin(GL_TRIANGLES);
for(int x = 1; x < 4*numberOfTriangles+1; x+=4) {
    glVertex3f(Vertices[Triangles[x]*3],Vertices[(Triangles[x]*3)+1],Vertices[(Triangles[x]*3)+2]);
    glVertex3f(Vertices[Triangles[x+1]*3],Vertices[(Triangles[x+1]*3)+1],Vertices[(Triangles[x+1]*3)+2]);
    glVertex3f(Vertices[Triangles[x+2]*3],Vertices[(Triangles[x+2]*3)+1],Vertices[(Triangles[x+2]*3)+2]);
}
glEnd();

Но поместить glBegin/glEnd внутрь цикла - это самая глупая вещь, которую вы можете сделать.На самом деле, если вы уже используете представление на основе массива вершин / индексов, вам будет довольно просто перенести код рендеринга на массивы вершин, которые намного быстрее, чем непосредственный режим, особенно при работе с VBO.

0 голосов
/ 25 октября 2011

Разобрался с собственной проблемой.Обратите внимание, как начальный и конечный блоки появляются за пределами цикла.Программа пыталась нарисовать треугольники, используя каждую вершину в сетке, одну за другой.Таким образом это создало один гигантский беспорядок.Я переключился на размещение трех вершин за раз (одну грань) и поместил начальный / конечный блоки внутри цикла и изменил цикл на приращение на 4 каждый раз, позволяя мне пропустить данные лица.* На всякий случай кому-то было любопытно.

...