c++ - 使用 for 循环的 OpenGL 立方体

标签 c++ xcode opengl

我使用 C++ 和 OpenGL 使用四边形、直线和点绘制了一个立方体。我现在正在尝试使我的代码更密集。为此,我想使用 for 循环。

我的立方体的顶点在一个二维数组中,如下所示:

double vertices[8][3] = {
    { 1.0f, 1.0f, 1.0f}, //0
    { 1.0f, 1.0f,-1.0f}, //1
    { 1.0f,-1.0f,-1.0f}, //2
    {-1.0f,-1.0f,-1.0f}, //3
    {-1.0f,-1.0f, 1.0f}, //4
    {-1.0f, 1.0f, 1.0f}, //5
    {-1.0f, 1.0f,-1.0f}, //6
    { 1.0f,-1.0f, 1.0f}  //7
};

目前我使用线条绘制立方体的代码是

void drawLines(){
    glBegin(GL_LINES);
    //Front Lines
    //Left
    glVertex3f(vertices[5][0],vertices[5][1],vertices[5][2]);
    glVertex3f(vertices[4][0],vertices[4][1],vertices[4][2]);
    //Top
    glVertex3f(vertices[5][0],vertices[5][1],vertices[5][2]);
    glVertex3f(vertices[0][0],vertices[0][1],vertices[0][2]);
    //Bottom
    glVertex3f(vertices[4][0],vertices[4][1],vertices[4][2]);
    glVertex3f(vertices[7][0],vertices[7][1],vertices[7][2]);
    //Right
    glVertex3f(vertices[7][0],vertices[7][1],vertices[7][2]);
    glVertex3f(vertices[0][0],vertices[0][1],vertices[0][2]);
    //Middle Lines
    //Top Left
    glVertex3f(vertices[6][0],vertices[6][1],vertices[6][2]);
    glVertex3f(vertices[5][0],vertices[5][1],vertices[5][2]);
    //Top Right
    glVertex3f(vertices[1][0],vertices[1][1],vertices[1][2]);
    glVertex3f(vertices[0][0],vertices[0][1],vertices[0][2]);
    //Bottom Left
    glVertex3f(vertices[3][0],vertices[3][1],vertices[3][2]);
    glVertex3f(vertices[4][0],vertices[4][1],vertices[4][2]);
    //Bottom Right
    glVertex3f(vertices[2][0],vertices[2][1],vertices[2][2]);
    glVertex3f(vertices[7][0],vertices[7][1],vertices[7][2]);
    //Back Lines
    //Left
    glVertex3f(vertices[6][0],vertices[6][1],vertices[6][2]);
    glVertex3f(vertices[3][0],vertices[3][1],vertices[3][2]);
    //Top
    glVertex3f(vertices[6][0],vertices[6][1],vertices[6][2]);
    glVertex3f(vertices[1][0],vertices[1][1],vertices[1][2]);
    //Bottom
    glVertex3f(vertices[3][0],vertices[3][1],vertices[3][2]);
    glVertex3f(vertices[2][0],vertices[2][1],vertices[2][2]);
    //Right
    glVertex3f(vertices[2][0],vertices[2][1],vertices[2][2]);
    glVertex3f(vertices[1][0],vertices[1][1],vertices[1][2]);

    glEnd();                    // Done Drawing Edges
}

这实现了这个结果: enter image description here

为了压缩我的代码,我试图使用 for 循环获得相同的结果,目前我有这个:

glBegin(GL_LINES);

for ( int i=0; i<8; i+=1 ) {
    for (int j=0; j<8; j+=1) {
        glVertex3f(vertices[i][0],vertices[i][1],vertices[i][2]);
        glVertex3f(vertices[j][0],vertices[j][1],vertices[j][2]);
    }
}
glEnd();

这给了我这个结果: enter image description here

我的问题是,任何人都可以给我指导以获得与我的原始代码相同的结果吗?

最佳答案

为索引添加一个数组:

int[12][2] indices = {
    {5,4},
    {5,0},

    {4,7},
    {7,0},

    {6,5},
    {1,0},

    {3,4},
    {2,7},

    {6,3},
    {6,1},

    {3,2},
    {2,1}
}

然后循环:

glBegin(GL_LINES);

for ( int i=0; i<12; i+=1 ) {

    glVertex3f(vertices[indices[i][0]][0],vertices[indices[i][0]][1],vertices[indices[i][0]][2]);
    glVertex3f(vertices[indices[i][1]][0],vertices[indices[i][1]][1],vertices[indices[i][1]][2]);
}
glEnd();

但是,不建议像您一样使用旧的(和已弃用的)openGL 进行学习。相反,建议的方法是将顶点数据上传到 VBO;创建一组着色器并使用 glDrawArraysglDrawElements 代替。

关于c++ - 使用 for 循环的 OpenGL 立方体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33606951/

相关文章:

c++ - 带有 setjmp 的 C++ 对象上的警告 "might be clobbered"

c++ - 遍历列表映射?

c - LIne 不使用 glFrustum() 显示?

java - JFrame + JOGL 仅在调整大小或最小化 + 最大化时显示内容

c++ - OpenGL 奇怪的顶点着色器问题

c++ - 视觉 C++ 开发

c++ - 如何使用值获取结构的索引

xcode - macOS - 如何将 com.apple.developer.driverkit 权利添加到团队配置文件

ios - imagePickerController 在 Xcode 6.3 中损坏

ios - 超出屏幕边界时如何正确删除节点?