【问题标题】:How to draw this object with OpenGL如何用 OpenGL 绘制这个对象
【发布时间】:2013-12-22 04:48:20
【问题描述】:

我正在尝试在 OpenGL 2.1 中使用 GLU 和 GLUT 基元(例如 gluCylinder、glutSolidCylinder 等)绘制类似的东西。

基本上它是一个中间有孔的实心圆柱体。到目前为止,我无法实现它。 我还尝试将波前 obj 从 Blender 导入到我的 C++ 程序中,但我得到的是这个。

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+。

有什么建议吗?

【问题讨论】:

  • 如果您重视自己的理智,请在绘图循环中摆脱atoi。转换应该在加载阶段进行一次,而不是在每次绘制时进行。
  • 当然。这只是为了测试。
  • @keltar 我什至会从[] 开始而不是at()

标签: opengl glut


【解决方案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();

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

编辑:
这似乎更好:

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

【讨论】:

    【解决方案2】:

    为我自己找到 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多