2012-11-24 25 views
0

我有以下代碼:廣東話加載和保存矩陣的Opengl

void setupCamera() { 

    // Clear the screen buffer 
    glClear(GL_COLOR_BUFFER_BIT); 

    // reset the projection matrix // 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    // and set the perspective with the current field of view, 
    // and the current height and width 
    gluPerspective(fov, ratio, objDepth - objRadius * 2, 
      objDepth + objRadius * 2); 
    glViewport(0, 0, WINDOW_SIZE, WINDOW_SIZE); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    if(first){ 
     glMultMatrixf(rotMatrix); 

    } 
    first = true; 

    //translate everything to be in objDepth// 
    glTranslatef(initX * 0.01, initY * 0.01, (-1) * objDepth); 

    glRotatef(200 * angle, rotationVector[0], rotationVector[1], 
      rotationVector[2]); 

    glutWireTeapot(1.5); 


    glGetFloatv (GL_MODELVIEW_MATRIX, rotMatrix); 


    } 

旋轉矢量保持旋轉軸,

翻譯用於所有移動到正確的位置。

的事情是,我爲了使用上次保存的矩陣現在用glMultMatrixf

做旋轉,然後平移,然後用glGetFloatv再次保存矩陣。

這個功能不斷呼籲與計時器,但由於某些原因

我想不通,矩陣不會保存任何東西,總是被初始化一遍又一遍,

意味着旋轉總是與使用小角度(因爲矩陣沒有保存)。

保存的矩陣未在代碼中的其他任何地方使用。

任何想法的?

+0

難道你不想使用glLoadMatrix而不是多矩陣嗎?另外,顯示如何構建GLfloat數組。另外你爲什麼要做getFloat等?你爲什麼不使用數學庫來處理矩陣乘法?像這樣從OpenGL推動和獲取東西會導致速度放慢。甚至使用GLpush/pop。 – zero298

+0

它使用glGetFloatv, 後第一次初始化,然後'first'布爾變量是'true',並可以加載和乘以矩陣 – Itzik984

回答

0

你打電話給setupCamera()每打勾嗎?如果你是,你可能想停下來。您無需在每一幀重置您的投影矩陣,除非您需要,您也不需要重置模型視圖矩陣。考慮增加角度和你自己的翻譯,而不是存儲整個矩陣。

你可能要採取的步驟是:

1)初始矩陣。初始化投影以識別和使用gluPerspective。然後切換到modelview並將其初始化爲標識。這應該只能做一次。

2)在您的更新循環中,增加角度和翻譯其代表性變量。

3)在繪製循環中,使用glPushMatrix()來推動模型視圖矩陣。用gltranslate和glrotate應用你的矩陣變化,然後繪製你正在繪製的任何東西。之後,glPopMatrix()才能返回到標識。

我還是不太明白,如果你想繪製一些東西,並認爲你需要閱讀,存儲和恢復每幀的當前glMatrix,或者如果你真的想要評估OpenGL對矩陣和真正的你需要把它讀出來。

+0

感謝您的答案zero298,我同意你的意見,但仍然, 我不想總是把角度加在一起,因爲它可能會變成另一個角度。我想繪製的東西(在代碼中編輯),但我不明白如何保存模型視圖矩陣即時通訊工作,然後做所有需要的轉換 – Itzik984