当我从对象文件导入模型并渲染它时,一些多边形消失了。
进口商代码:
void load_m(string filename)
{
string line;
char c;
int i, j, k;
double x, y, z;
double xt, yt, zt;
string si, sj, sk;
ifstream in(filename);
while (getline(in, line))
{
if (line.find_first_of("vVfFtT") == string::npos) continue;
std::istringstream ss(line);
ss >> c;
switch (c)
{
case 'v':
case 'V':
ss >> x >> y >> z;
vertices.push_back({ x, y, z });
break;
case 't':
case 'T':
ss >> xt >> yt >> zt;
texture.push_back({ xt, yt, zt });
break;
case 'f':
case 'F':
ss >> si >> sj >> sk;
i = stoi(si); j = stoi(sj); k = stoi(sk);
faces.push_back({ i, j, k });
break;
}
}
in.close();
}
渲染代码:
string draw_model()
{
sf::Texture::bind(&tt);
glEnable(GL_TEXTURE_2D);
glColor3f(1, 1, 1);
glBegin(GL_TRIANGLES);
for (int i = 0; i < faces.size(); i++)
{
Point v1 = vertices[faces[i].v1 - 1];
Point v2 = vertices[faces[i].v2 - 1];
Point v3 = vertices[faces[i].v3 - 1];
glVertex3f(v1.x, v1.z, v1.y);
glVertex3f(v2.x, v2.z, v2.y);
glVertex3f(v3.x, v3.z, v3.y);
glTexCoord3f(texture[i].xt, texture[i].yt, texture[i].zt); //Draw texture
}
return "123";
glEnd();
}
还有,如果我将多边形模式从实体更改为网格,使用以下命令:
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
模型绘制正常。我想这是因为只渲染多边形的边。
也许有人有这样的问题,可以帮助我吗?
我想做的是:
1.我试着写自己的模型加载器。它工作得更快,但加载模型有更多的工件。
1.然后在这一行:
glVertex3f(v1.x, v1.y, v1.z);
我这样修改y和z索引:
glVertex3f(v1.x, v1.z, v1.y);
这把模型正常,但不解决我的问题在所有...
错误型号截图:
1条答案
按热度按时间os8fio9y1#
您的obj文件具有:
这是一个4边的面(4个顶点,也就是“四边形”)。但是看起来你的代码只使用了前3个顶点。也许你只想到了3边的面(也就是“三角形”)。
你的面数据结构似乎有手工制作的变量名,每个面有3个顶点。例如
faces[i].v1
.v2
.v3
。但是在obj文件格式中,面可以有3个以上的顶点。这段代码不足以支持包含四边形的obj文件的复杂性,因为它只使用了面的前3个顶点。
如果你想保持
faces
为三角形(硬编码为3个顶点),那么在阅读obj文件时,你需要正确地将 faces 转换为 triangles。这意味着将面细分为三角形。例如,一个四边形将变成2个三角形。