2013-10-26 3 views
0

Итак, я могу прочитать вершин, нормалей и индексов, которые мне нужны из файла .ply, и записать их в VBO. Однако я не получаю правильные формы. Кажется, мои индексы отключены.Rendering .ply файлы в OpenGL

Вот мои: Структуры

typedef struct vtx { 
    float x, y, z; 
    float nx, ny, nz; 
} vtx; 

typedef struct Face { 
    unsigned int count; 
    unsigned int *vertices; 
    float nx, ny, nz; 
} Face; 

typedef struct PLY_vals { 
    Face **f; 
    vtx **v; 
    unsigned int vcount; 
    unsigned int fcount; 
    int norms; 
    float center[3]; 
} PLY_vals; 

Настройка вершин и треугольников:

nindices = ply.fcount * 3; 
nvertices = ply.vcount; 
pindices = new GLuint[nindices]; 
plyverts = new Vertex[nvertices]; 

for (int i = 0; i < nvertices; i++) 
{ 
    // Vertices 
    plyverts[i].location[0] = ply.v[i]->x; 
    plyverts[i].location[1] = ply.v[i]->y; 
    plyverts[i].location[2] = ply.v[i]->z; 
    plyverts[i].location[3] = 1; 

    // Normals 
    plyverts[i].normal[0] = ply.v[i]->nx; 
    plyverts[i].normal[1] = ply.v[i]->ny; 
    plyverts[i].normal[2] = ply.v[i]->nz; 
    plyverts[i].normal[3] = 0; 
} 

// set indices (assumes all faces have 3 vertices 
int pos=0; 
for (int i = 0; i < nindices/3; i++) 
{ 
    pindices[pos++] = ply.f[i]->vertices[0]; // first vertex 
    pindices[pos++] = ply.f[i]->vertices[1]; // second vertex 
    pindices[pos++] = ply.f[i]->vertices[2]; // third vertex 
} 

Это должно быть кролик:

enter image description here

Любая идея? Я предполагаю, что вершины находятся не в правильном порядке, но я проверил, и они, похоже, совпадают.

+0

Кажется, вершины верны, потому что это похоже на форму кролика, что, по моему мнению, неверно, это индексы, поскольку он создает эти огромные треугольники. – Caesar

+0

Попробуйте визуализировать вершины как точки. Это скажет вам, верны ли веры или нет. – bames53

+0

У каждого Лица есть 3 вершины? – usr2564301

ответ

2

У меня была такая же проблема, когда я использовал GL_UNSIGNED_SHORT вместо спецификатора типа GL_UNSIGNED_INT для функции glDrawElements. Модель кролика (я предполагаю, что это стэнфордский кролик?) Имеет более 200 000 вершин, поэтому для сохранения индексов недостаточно числа без знака, так как его максимальное значение равно 65535, поэтому следует использовать unsigned int. Может быть, это ответ на вашу проблему?

+0

Это было в значительной степени. Я использовал GL_UNSIGNED_BYTE, а не GL_UNSIGNED_INT. Благодаря! – Riftus