opengl 从对象文件或绘图模型导入模型时出现问题

yftpprvb  于 2023-04-20  发布在  其他
关注(0)|答案(1)|浏览(226)

当我从对象文件导入模型并渲染它时,一些多边形消失了。
进口商代码:

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);

这把模型正常,但不解决我的问题在所有...
错误型号截图:

os8fio9y

os8fio9y1#

您的obj文件具有:

f 1/1/1 2/2/2 3/3/3 4/4/4

这是一个4边的面(4个顶点,也就是“四边形”)。但是看起来你的代码只使用了前3个顶点。也许你只想到了3边的面(也就是“三角形”)。
你的面数据结构似乎有手工制作的变量名,每个面有3个顶点。例如faces[i].v1.v2.v3。但是在obj文件格式中,面可以有3个以上的顶点。
这段代码不足以支持包含四边形的obj文件的复杂性,因为它只使用了面的前3个顶点。

case 'f':                                         
        case 'F':                                         
            ss >> si >> sj >> sk;                          
            i = stoi(si);  j = stoi(sj);  k = stoi(sk);  
            faces.push_back({ i, j, k });                
            break;

如果你想保持faces为三角形(硬编码为3个顶点),那么在阅读obj文件时,你需要正确地将 faces 转换为 triangles。这意味着将面细分为三角形。例如,一个四边形将变成2个三角形。

相关问题