如何使用OpenGL绘制此对象

时间:2013-12-05 09:55:16

标签: opengl glut

我试图在OpenGL 2.1中使用GLU和GLUT原语(如gluCylinder,glutSolidCylinder等)绘制类似的内容。

Cylinder with hole from Blender

基本上它是一个实心圆柱体,中间有一个洞。到目前为止,我无法实现它。 我还尝试将Blender中的wavefront obj导入到我的C ++程序中,但我得到的就是这个。 Something that is not cylinder from Blender

glBegin(GL_TRIANGLES);
    for(int i = 0; i < wheel->faces.size(); i++) {

        int nx = atoi(wheel->faces.at(i).at(0).substr(wheel->faces.at(i).at(0).find_last_of('/') + 1).c_str()) - 1;
        int ny = atoi(wheel->faces.at(i).at(1).substr(wheel->faces.at(i).at(1).find_last_of('/') + 1).c_str()) - 1;
        int nz = atoi(wheel->faces.at(i).at(2).substr(wheel->faces.at(i).at(2).find_last_of('/') + 1).c_str()) - 1;

        int vx = atoi(wheel->faces.at(i).at(0).substr(0, wheel->faces.at(i).at(0).find_first_of('/')).c_str()) - 1;
        int vy = atoi(wheel->faces.at(i).at(1).substr(0, wheel->faces.at(i).at(1).find_first_of('/')).c_str()) - 1;
        int vz = atoi(wheel->faces.at(i).at(2).substr(0, wheel->faces.at(i).at(2).find_first_of('/')).c_str()) - 1;

        glNormal3f(wheel->normals.at(nx).x, wheel->normals.at(ny).y, wheel->normals.at(nz).z);
        glVertex3f(wheel->vertices.at(vx).x, wheel->vertices.at(vy).y, wheel->vertices.at(vz).z);

    }
glEnd();

解析应该是正确的,我逐行检查它。我想这是我试图绘制它的错误方法。

但是我不想使用obj,因为我的绘图方式使得动画变得很慢(我对OpenGL来说相当新)。我也不想使用OpenGL 3+。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

在你的代码中,你用一个面绘制一个点,但是这里的面(三角形)应该有三个点。

您可以尝试以下代码:

glBegin(GL_TRIANGLES);
for(int i = 0; i < wheel->faces.size(); i++) {

    int v0 = atoi(wheel->faces.at(i).at(0).substr(0, wheel->faces.at(i).at(0).find_first_of('/')).c_str()) - 1;
    int v1 = atoi(wheel->faces.at(i).at(1).substr(0, wheel->faces.at(i).at(1).find_first_of('/')).c_str()) - 1;
    int v2 = atoi(wheel->faces.at(i).at(2).substr(0, wheel->faces.at(i).at(2).find_first_of('/')).c_str()) - 1;

    glVertex3f(wheel->vertices.at(v0).x, wheel->vertices.at(v0).y, wheel->vertices.at(v0).z);
    glVertex3f(wheel->vertices.at(v1).x, wheel->vertices.at(v1).y, wheel->vertices.at(v1).z);
    glVertex3f(wheel->vertices.at(v2).x, wheel->vertices.at(v2).y, wheel->vertices.at(v2).z);

}
glEnd();

我删除了正常部分,因为我认为你现在不需要它。您可以稍后再添加。

<强> EDTIED:
这似乎更好:

glBegin(GL_TRIANGLES);
for(int i = 0; i < wheel->faces.size(); i++) 
    for (int j = 0; j < 3; j++)
    {
        int v_id = atoi(wheel->faces.at(i).at(j).substr(0, wheel->faces.at(i).at(j).find_first_of('/')).c_str()) - 1;
        glVertex3f(wheel->vertices.at(v_id).x, wheel->vertices.at(v_id).y, wheel->vertices.at(v_id).z);
    }
glEnd();

答案 1 :(得分:1)

找到我自己的this小型库,用于打开obj文件。

使用下一个代码绘制加载的网格物体:

    glBegin(GL_TRIANGLES);
    for (size_t f = 0; f < shapes[0].mesh.indices.size(); f++) {
        glVertex3f(shapes[0].mesh.positions[3*f+0],
                   shapes[0].mesh.positions[3*f+1],
                   shapes[0].mesh.positions[3*f+2]);

    }
    glEnd();

加载网格:

std::vector<tinyobj::shape_t> shapes;
int loadMesh(const char *file) {
    const char* basepath = NULL;
    std::string err = tinyobj::LoadObj(shapes, file, basepath);
    if (!err.empty()) {
        std::cerr << err << std::endl;
        return 0;
    }
    std::cout << "# of shapes : " << shapes.size() << std::endl;
    return 1;
}
相关问题