gpt4 book ai didi

c++ - 在 OpenGL 中渲染 .ply 文件

转载 作者:行者123 更新时间:2023-11-30 02:51:37 24 4
gpt4 key购买 nike

因此,我能够从 .ply 文件中读出我需要的顶点、法线和索引,并将它们写入 VBO。但是,我没有得到正确的形状。看来我的索引已关闭。

这是我的结构:

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

有什么想法吗?我猜顶点的顺序不正确,但我检查了一下,它们似乎是匹配的。

最佳答案

当我为 glDrawElements 函数使用 GL_UNSIGNED_SHORT 而不是 GL_UNSIGNED_INT 类型说明符时,我遇到了完全相同的问题。兔子模型(我假设它是斯坦福兔子?)有超过 200000 个顶点,所以 unsigned short 不足以存储索引,因为它的最大值是 65535 - 因此应该使用 unsigned int。也许这就是您的问题的答案?

关于c++ - 在 OpenGL 中渲染 .ply 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19609248/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com