2015-11-09 39 views
0

使用C++和OpenGL我使用四邊形,直線和點繪製了一個Cube。我現在試圖讓我的代碼更加密集。爲了實現這一點,我想使用for循環。使用for循環的OpenGL立方體

我爲我的立方體的頂點是在一個二維數組是這樣的: enter image description here

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 
} 

這實現了這樣的結果繪製出立方體

在試圖凝結我的代碼我試圖得到相同的結果使用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

我的問題是,會有人請能夠給我指導,得到相同的結果,因爲我有我的原代碼?

+2

將線條(頂點對)排列並迭代它會不會更好? – Matso

+1

在您的代碼中,每個頂點都連接到每個頂點(包括它自己)。在線框立方體中,每個頂點連接到3個其他頂點。這不能用一個簡單的for循環來完成,它需要一些額外的指導。 – usr2564301

回答

7

添加數組索引:

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