2012-06-23 28 views
0

我是OpenGL的新手。我已經成功地繪製立方體,並試圖提高代碼,與此上來了,但這只是吸引立方體的第一面:在OpenGL中繪製立方體。較短的迭代代碼,但不起作用

glPushMatrix(); 
glColor3d(1,0,0); 
glRotatef(45,0,1,0); 
glTranslatef(0,0,3); 

for(int i=0;i<6;i++){ 
    glBegin(GL_QUADS); 
    glVertex3f(0,0,0); 
    glVertex3f(3,0,0); 
    glVertex3f(3,3,0); 
    glVertex3f(0,3,0); 
    glEnd(); 
    if(i<4) 
    glRotatef(90,0,1,0); 
    if(i=4) 
    glRotatef(90,1,0,0); 
    if(i=5) 
    glRotatef(180,1,0,0); 
} 

glRotatef(90,1,0,0); 

glPopMatrix(); 

迭代似乎並沒有在所有的工作!我錯過了關於OpenGL的工作原理的基本知識嗎?

回答

1

第一個答案是:您使用的是OpenGL的古老版本。現在你不要一個發送一個頂點,而是:

  • 創建一個內存緩衝區一些頂點
  • 發送緩衝區,緩衝區(VBO)在GPU內存
  • 從那裏直接呈現使用glDrawArraysglDrawElements

嘗試它的某個時候,工作大大加快:-)


而且對什麼是錯了你的示例 - 你也許意味着這個...?

if (i == 4) 

if (i == 5) 

請啓用編譯器警告,讓你趕上。 (順便說一句,我沒有看到它 - 我的編譯器確實如此:-))

1

您的方法存在的問題是,一旦旋轉結束,您必須在z軸上進行平移,繪製四邊形,然後然後翻回原來的點。

爲你正在嘗試將一般的處理方法:

glPushMatrix(); 

<initial-setup> 

for i = 0 to 5 
    translate on z-axis +(width/2) units 
    draw the quad 
    translate on z-azis -(width/2) units 
    if i<=3 
     rotate 90 about y-axis 
    elif i == 4 
     rotate 90 about x-axis 
    else 
     rotate 180 about x-axis 
glPopMatrix(); 

而作爲@kos正確地指出,替代由if (i==4)if(i=4),併爲下一語句相似。