2012-04-30 57 views
6

我想在空間的某些點使用glutSolidCube繪製多個立方體。我發現的例子只是調用glutSolidCube,它可以工作,但是一個立方體爲我繪製的唯一方法是,如果該行被包含在glBegin(GL_POLYGON)中,這在我見過的示例中不需要,並且我只獲得一個立方體而不是幾個。我所擁有的是:如何在OpenGL中繪製多個立方體

glColor3f(1, 0, 0); 
glLoadIdentity(); 
glTranslatef(5,2,1); 
glutSolidCube(1); 


glLoadIdentity(); 
glTranslatef(10,8,0); 
glutSolidCube(1); 

glLoadIdentity(); 
glTranslatef(3,7,9); 
glutSolidCube(1); 

glLoadIdentity(); 
glTranslatef(1,4,6); 
glutSolidCube(1); 

當我運行這個沒有任何反應。我知道在我看來並不存在問題,因爲如果我在相同的點上繪製頂點,我可以看到它們。據我讀過的例子和文檔可以看出,我沒有做任何不正確的事情。有人可以告訴我我做錯了什麼,或給我一小段代碼繪製多個立方體?

+0

你可以在那裏插入一些glGetError調用嗎?檢查它是否非零。 – Tim

+0

該問題是類似於[這一個](http://stackoverflow.com/questions/1064/how-to-display-100-floating-cubes-using-directx-or-opengl) – toolchainX

+0

我在每個之後添加glGetError調用glutSolidCube行,它始終爲0 – Bob

回答

5

試試這個:

glColor3f(1, 0, 0); 
glPushMatrix(); 
glTranslatef(5,2,1); 
glutSolidCube(1); 
glPopMatrix(); 

glPushMatrix(); 
glTranslatef(10,8,0); 
glutSolidCube(1); 
glPopMatrix(); 

glPushMatrix(); 
glTranslatef(3,7,9); 
glutSolidCube(1); 
glPopMatrix(); 

glPushMatrix(); 
glTranslatef(1,4,6); 
glutSolidCube(1); 
glPopMatrix(); 

,而無需重新設置模型視圖矩陣glLoadIdentity()。請注意,首先您需要撥打glOrtho()glPerspective()來設置相機一次。

+0

確保發出'glEnable(GL_NORMALIZED)'以便在發生轉換時對法向量進行重新規範化。 – ja72

5
#include <GL/glut.h> 

void init() 
{ 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_COLOR_MATERIAL); 
} 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    GLint viewport[4]; 
    glGetIntegerv(GL_VIEWPORT, viewport); 
    double aspect = (double)viewport[2]/(double)viewport[3]; 
    gluPerspective(60, aspect, 1, 100); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    // move back a bit 
    glTranslatef(0, 0, -35); 

    static float angle = 0; 
    angle += 1.0f; 

    glPushMatrix(); 
     glTranslatef(0,0,0); 
     glRotatef(angle, 0.1, 0.2, 0.5); 
     glColor3ub(255,0,255); 
     glutSolidCube(5); 
    glPopMatrix(); 

    glPushMatrix(); 
     glTranslatef(10,-10,0); 
     glRotatef(angle, 0.1, 0.2, 0.5); 
     glColor3ub(255,0,0); 
     glutSolidCube(5); 
    glPopMatrix(); 

    glPushMatrix(); 
     glTranslatef(10,10,0); 
     glRotatef(angle, 0.1, 0.2, 0.5); 
     glColor3ub(0,255,0); 
     glutSolidCube(5); 
    glPopMatrix(); 

    glPushMatrix(); 
     glTranslatef(-10,10,0); 
     glRotatef(angle, 0.1, 0.2, 0.5); 
     glColor3ub(0,0,255); 
     glutSolidCube(5); 
    glPopMatrix(); 

    glPushMatrix(); 
     glTranslatef(-10,-10,0); 
     glRotatef(angle, 0.1, 0.2, 0.5); 
     glColor3ub(255,255,0); 
     glutSolidCube(5); 
    glPopMatrix(); 

    glutSwapBuffers(); 
} 

void reshape(int w, int h) 
{ 
    glViewport(0, 0, w, h); 
} 

void timer(int extra) 
{ 
    glutPostRedisplay(); 
    glutTimerFunc(16, timer, 0); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitWindowSize(640,480); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 
    glutCreateWindow("CUBES"); 

    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutTimerFunc(0, timer, 0); 

    init(); 

    glutMainLoop(); 
    return 0; 
} 
+0

謝謝你。比接受的答案更有幫助。 – nick