2011-04-08 52 views
1

我已閱讀其使像這樣的立方體(只有關鍵部分)的碼:OpenGL:如何根據以前的轉換結果進行新的轉換?

static GLfloat theta[] = {0.0,0.0,0.0}; 
static GLint axis = 2; 

void display(void) 
{ 
/* display callback, clear frame buffer and z buffer, 
    rotate cube and draw, swap buffers */ 

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    glRotatef(theta[0], 1.0, 0.0, 0.0); 
    glRotatef(theta[1], 0.0, 1.0, 0.0); 
    glRotatef(theta[2], 0.0, 0.0, 1.0); 

colorcube(); 

glFlush(); 
    glutSwapBuffers(); 
} 

void spinCube() 
{ 

/* Idle callback, spin cube 2 degrees about selected axis */ 

    theta[axis] += 2.0; 
    if(theta[axis] > 360.0) theta[axis] -= 360.0; 
    /* display(); */ 
    glutPostRedisplay(); 
} 

void mouse(int btn, int state, int x, int y) 
{ 

/* mouse callback, selects an axis about which to rotate */ 

    if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) axis = 0; 
    if(btn==GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) axis = 1; 
    if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) axis = 2; 
} 

它保持一個可變thetadisplay功能以外,跟蹤角的變化 。每次它只是重新定義矩陣轉換 矩陣,然後它看起來像新的轉換基於最後一個 。

但是,這僅僅是旋轉的情況。當考慮到翻譯和 翻譯。我覺得很難用類似的方法其中 保持一些變量外跟蹤轉換和每一次重新定義了 矩陣,因爲旋轉和平移是不能互換的

我的一個想法是使用glPushMatrixglPopMatrix。但我不知道 是否這是處理這樣的事情的標準方式。

你能幫忙嗎?謝謝。

回答

1

是的,當您想要更改模型視圖矩陣時,這是標準方法,這就是glPushMatrix()glPopMatrix()所做的,將當前的模型視圖矩陣保存在矩陣堆棧上。

比方說,你有第二個對象,一個球體,它的座標有不同的變化,參數只是在OX軸上平移-5。

如果你嘗試:

//for spehere 
glTranslatef(-5.0f,0.0f,0.0f): 

drawSphere(); 

//for cube 
glTranslatef(-1.0f,0.0f,0.0f) 
glRotatef(theta[0], 1.0, 0.0, 0.0); 
glRotatef(theta[1], 0.0, 1.0, 0.0); 
glRotatef(theta[2], 0.0, 0.0, 1.0); 

drawCube(); 

你會實際上是由-6.0上牛年軸,而不是-5.0翻譯你的立方體。

要解決這個問題,您只需要使用glPushMatrix(), glPopMatrix()

//for spehere 
glPushMatrix(); 
glTranslatef(-5.0f,0.0f,0.0f): 

drawSphere(); 
glPopMatrix(); 

//for cube 
glPushMatrix(); 

glTranslatef(-1.0f,0.0f,0.0f) 
glRotatef(theta[0], 1.0, 0.0, 0.0); 
glRotatef(theta[1], 0.0, 1.0, 0.0); 
glRotatef(theta[2], 0.0, 0.0, 1.0); 

drawCube(); 

glPopMatrix(); 

這樣您可以保存您的原始模型視圖矩陣,以便您可以爲每個對象應用正確的轉換。

+0

嗯,那不是我的問題。但是'glPushMatrix'和'glPopMatrix'起作用。謝謝你們一樣。 – Roun 2011-04-09 07:19:04