void display(void) { glClear(GL_COLOR_BUFFER_BIT); glPushMatrix();//將原點的座標壓入棧中 glTranslatef( -0.3, 0.0, 0.0);執行完後的座標? glRotatef( (GLfloat)sh, 0.0, 0.0, 1.0 );執行完後的座標? glTranslatef(1.0, 0.0, 0.0);執行完後的座標? glPushMatrix();執行完後的座標? glScalef(2.0, 0.4, 1.0);執行完後的座標? glutWireCube(1.0);畫正方體時座標是在哪的?中心又是哪? glPopMatrix();執行完後的座標? glTranslatef(1.0, 0.0, 0.0); glRotatef( (GLfloat)el, 0.0, 0.0, 1.0 ); glTranslatef(1.0, 0.0, 0.0); glPushMatrix(); glScalef(2.0, 0.4, 1.0); glutWireCube(1.0); glPopMatrix(); glPopMatrix(); glutSwapBuffers(); }
我有更好的答案算法
分享到:url
2012-04-02 21:29StarArchon | 一級 最快回答spa
先前我在調用OpenGL開發圖形環境時,座標變換也曾困擾我好長一陣子,記得當時是在爲每一個圖形實例配置各自的軌跡球時要求修正軌跡球算法。 言歸正傳,首先您須知道OpenGL中的矩陣爲列主序矩陣,這是您關於OpenGL矩陣變換進行正確理解與運用的大前提(若對此沒有概念請先花半小時上網弄明白,這裏不贅述)。其次須要注意,對於座標變換矩陣操做的有兩種理解方式,不妨稱「順式」與「反式」(若不明白還請自已上網查閱,這裏點到爲止),都是正確的,在不一樣的時候選擇恰當的理解方式能夠事半功倍哦!就本例子而言「順式」理解更爲方便 下面分析相關代碼: glPushMatrix();將當前的變換矩陣壓棧,容許以後經過矩陣彈棧以撤銷之間的變換操做(比如系統還原中設置「還原點」) glTranslatef( -0.3, 0.0, 0.0); 這是您問題的重點吧?!先來普及知識: OpenGL中有個絕對座標系,它以屏幕中心爲原點,水平向右爲X軸,豎直向上爲Y軸,垂直屏幕向外爲Z軸。在「順式」理解下,該座標系是不動的,而想象初始時你就出在原點位置,眼睛看着Z軸負方向,1.隨後命令——glTranslatef( -0.3, 0.0, 0.0);好,這下你沿X負方向走了0.3f,來到(-0.3, 0.0, 0.0)處(注意你並無轉頭,眼睛仍然看着Z軸負方向) 2.再命令glRotatef( (GLfloat)sh, 0.0, 0.0, 1.0 );對,你以Y軸正方向爲轉軸將腦殼身子扭轉了sh角,但注意你的位置並未改變。 3.又glTranslatef(1.0, 0.0, 0.0);這下你沿X正方向走了1.0f,但重點注意!!——這裏的X軸是相對你而言的,不是絕對座標系中的X軸(所謂「順式」就體如今這裏),即每一步變換都是在以下座標系中進行的:你眼睛看着的是Z軸負方向,腦殼指向Y軸正方向,右手邊爲X軸正方向 glPushMatrix();再次壓棧 4.glScalef(2.0, 0.4, 1.0);將尺度進行縮放,該步驟無所謂座標系 glutWireCube(1.0);你在本身的位置放了一個立方體,至於你本身在哪裏,應很容易即可算出吧~ glPopMatrix();彈棧,即還原至第4步前的變換狀態 相信已解釋得夠通俗的了,不懂再問吧~
追問code
這段代碼是爲了作一個機器人手臂的旋轉的!但我不知道爲何第二個(就是你的編號3)glTranslatef會影響旋轉點,當glTranslatef(1.0, 0.0, 0.0)和glutWireCube(1.0)的值相同時,是繞着一個點旋轉的,就是第一個glTranslatef後的點,若是他們的值不一樣,則旋轉的點就不是那個點。。。
回答開發
glTranslatef命令固然會影響旋轉點,在上述的理解下,我已說的很清楚了:每次的旋轉時考慮的座標系都是當前狀況下——虛擬世界中的「你」所在的位置爲原點O,「你」眼睛看着爲Z軸負方向,腦殼指向的爲Y軸正方向,右手邊爲X軸正方向。當調用glTranslatef命令時「你」的位置顯然改變(平移)了,那麼旋轉時所考慮的座標系也就相應平移了,且顯然單步的旋轉是不會改變「你」在虛擬世界的位置的,僅改變面對的方向。至於「當glTranslatef(1.0, 0.0, 0.0)和……不是那個點。。。」我不理解你在說什麼,glutWireCube(1.0)意思即:在「你」所在的位置處繪製一個線框立方體(方向與「你」面對的方向相應),1.0應該是尺寸的參數吧