OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理_第1頁(yè)
OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理_第2頁(yè)
OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理_第3頁(yè)
OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理_第4頁(yè)
OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理_第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、、為什么有時(shí)候和能顛倒有時(shí)候又不能?OpenGL中的glLoadIdentity、glTranslatef、glRotatef原理單位矩陣對(duì)角線上都是1,其余元素皆為0的矩陣。在矩陣的乘法中,有一種矩陣起著特殊的作用,如同數(shù)的乘法中的1,我們稱這種矩陣為單位矩陣它是個(gè)方陣,除左上角到右下角的對(duì)角線(稱為主對(duì)角線)上的元素均為1以外全都為0.中的坐標(biāo)用齊次坐標(biāo)表示,即表示成,其中通常取比如空間中的點(diǎn)3在中將表示成齊次坐標(biāo)表示方式適合于矩陣運(yùn)算,也很方便地表示了無(wú)窮遠(yuǎn)的點(diǎn),比如就表示軸上無(wú)窮遠(yuǎn)的點(diǎn),因?yàn)槭菬o(wú)窮大,這里約定接著要說(shuō)點(diǎn)矩陣線性代數(shù)的知識(shí)。里面的平移、旋轉(zhuǎn)、縮放等變換均是線性變換,用矩陣

2、相乘來(lái)表示。以平移變換為例,請(qǐng)見(jiàn)官方對(duì)函數(shù)的說(shuō)明。假設(shè)有點(diǎn),如果把該點(diǎn)沿軸移動(dòng)單位,沿軸移動(dòng)單位,沿軸移動(dòng)單位,那么該點(diǎn)會(huì)是用矩陣表示是:左邊的矩陣稱為平移變換矩陣,若把、換成、,則用它乘以一個(gè)齊次坐標(biāo)表示的向量,就可以將該向量平移旋轉(zhuǎn)變換和縮放變換都像平移變換一樣可用一個(gè)矩陣來(lái)表示。這里可以不用理會(huì)這些矩陣長(zhǎng)什么樣,只需清楚它們乘以一個(gè)齊次坐標(biāo)表示的向量,就可以使該向量發(fā)生需要的變換。把平移變換矩陣記為、旋轉(zhuǎn)變換矩陣記為,表示繞向量旋轉(zhuǎn)角度;把向量記為。這里只需要知道它們是矩陣就行了,現(xiàn)在要把一個(gè)點(diǎn),如,移動(dòng)單位,再繞軸旋轉(zhuǎn)度角,用矩陣表示即*可以理解為離最近的矩陣最先作用。理解這個(gè)順序很重

3、要,這樣,所有變換都可以用一串矩陣的相乘來(lái)表示,計(jì)算機(jī)里面也確實(shí)是這么做的。介紹完基本的數(shù)學(xué)知識(shí),下面說(shuō)的作用機(jī)制。有個(gè)變換矩陣堆棧,堆棧就像子彈夾一樣,先進(jìn)的后出。中的每個(gè)向量,在被定義之后進(jìn)入到世界中,都必須先乘以這個(gè)變換矩陣堆棧的棧頂變換矩陣。如下圖所示:理解完上面的知識(shí),再來(lái)理解、這些函數(shù)干了什么就容易多了。這些函數(shù)就是對(duì)這個(gè)堆棧的操作:假設(shè)目前棧頂變換矩陣為右乘與堆棧的棧頂變換矩陣。右乘的解釋,,那么就相當(dāng)于把修改為右,乘與,與、堆棧)的棧頂變換矩陣。:將堆棧的棧頂變換矩陣設(shè)置成單位矩陣。:將堆棧的棧頂變換矩陣復(fù)制一份,然后到堆棧中。所謂、就像塞子彈一樣把一個(gè)矩陣壓入到堆棧中,此時(shí),

4、棧頂就是這個(gè)新的矩陣了,注意定義的向量都是和棧頂變換矩陣作用的。:將堆棧的棧頂變換矩陣出來(lái)。該講的講完了,下面出幾道題目練習(xí)下吧。1代碼是:請(qǐng)問(wèn)此時(shí)棧頂變換矩陣是什么?這個(gè)點(diǎn)到了世界中的點(diǎn)是什么?答:棧頂變換矩陣是,到世界中的坐標(biāo)是2解釋為什么使用和的組合可以隔離這兩個(gè)函數(shù)中的變換,使之不影響后面的點(diǎn)?答:新壓入的變換矩陣是復(fù)制了原來(lái)的棧頂變換矩陣,所以它繼承了之前的變換,此后執(zhí)行、這些函數(shù)時(shí),修改的是棧頂變換矩陣,在之前的點(diǎn)都將受到棧頂變換矩陣的作用,之后用:把棧頂變換矩陣掉,此時(shí)的棧頂變換矩陣又還原成原來(lái)的那個(gè)棧頂變換矩陣。答:矩陣乘以矩陣未必等于矩陣乘以矩陣,當(dāng)它們相等時(shí),很多只是巧在o

5、pengl中,函數(shù)glTranslatef的作用就是移動(dòng)坐標(biāo)原點(diǎn)。對(duì)應(yīng)的3個(gè)參數(shù)對(duì)應(yīng)著3個(gè)坐標(biāo)軸。如果你調(diào)用一次glTranslatef(1.0f,0.0f,0.0f)然后畫(huà)一個(gè)小球,接著再調(diào)用次glTranslatef(0.0f,1.0f,0.0f)再畫(huà)一個(gè)小球。此時(shí),兩個(gè)小球中,一個(gè)在另外一個(gè)正右方。所以,如果要使兩個(gè)小球分別處于x、y軸,則需要在第二次畫(huà)之前調(diào)用gILoadIdentity()函數(shù),使坐標(biāo)原點(diǎn)歸位。另外,此處的坐標(biāo)系為右手坐標(biāo)系。切記切記。2、glPushMatrix、glPopMatrix操作其實(shí)就相當(dāng)于棧里的入棧和出棧。許多人不明白的可能是入的是什么,出的又是什么。我

6、也是自己反復(fù)做了下測(cè)試才懂的(利用無(wú)聊的web上機(jī)時(shí)間)。例如你當(dāng)前的坐標(biāo)系原點(diǎn)在你電腦屏幕的左上方。現(xiàn)在你調(diào)用glPushMatrix,然后再調(diào)用一堆平移、旋轉(zhuǎn)代碼等等,然后再畫(huà)圖。那些平移和旋轉(zhuǎn)都是基于坐上角為原點(diǎn)進(jìn)行變化的。而且都會(huì)改變坐標(biāo)的位置,經(jīng)過(guò)了這些變化后,你的坐標(biāo)肯定不再左上角了。那如果想恢復(fù)怎么辦呢?這時(shí)就調(diào)用glPopMatrix從棧里取出一個(gè)“狀態(tài)”了,這個(gè)狀態(tài)就是你調(diào)用glPushMatrix之前的那個(gè)狀態(tài)。就如很多opengl的書(shū)上所講:調(diào)用glPushMatrix其實(shí)就是把當(dāng)前狀態(tài)做一個(gè)副本放入堆棧之中。將當(dāng)前的用戶坐標(biāo)系的原點(diǎn)移到了屏幕中心:類似于一個(gè)復(fù)位操作坐標(biāo)

7、軸從左至右,坐標(biāo)軸從下至上,坐標(biāo)軸從里至外。屏幕中心的坐標(biāo)值是和軸上的點(diǎn)。中心左面的坐標(biāo)值是負(fù)值,右面是正值。移向屏幕頂端是正值,移向屏幕底端是負(fù)值。移入屏幕深處是負(fù)值,移出屏幕則是正值。沿著和軸移動(dòng)。注意在中當(dāng)您移動(dòng)的時(shí)候,您并不是相對(duì)屏幕中心移動(dòng),而是相對(duì)與當(dāng)前所在的屏幕位置。其作用就是將你繪點(diǎn)坐標(biāo)的原點(diǎn)在當(dāng)前原點(diǎn)的基礎(chǔ)上平移一個(gè)向量。程序的運(yùn)行結(jié)果如下:左邊的三角形是第一步繪制的,可以看到該三角形繪制的坐標(biāo)系,實(shí)際上是以為原點(diǎn)的。使原點(diǎn)重新回到屏幕中第二個(gè)三角形繪制的時(shí)候,由于使用心來(lái),因此其原點(diǎn)位于屏幕的中心。與類似,也是對(duì)坐標(biāo)系進(jìn)行操作。旋轉(zhuǎn)軸經(jīng)過(guò)原點(diǎn),方向?yàn)樾D(zhuǎn)角度為,方向滿足右手定則。在未旋轉(zhuǎn)的情況下如圖所示:繞軸正向旋轉(zhuǎn)度角,因?yàn)檩S正方向由屏幕內(nèi)指向屏幕外,由右手定則可知方向?yàn)槟鏁r(shí)針轉(zhuǎn)動(dòng)。由于直角頂點(diǎn)即為原點(diǎn),因此將圍繞直角逆時(shí)針旋轉(zhuǎn)。/glLoadIdentity();glRotatef(45,0.0f,0.0f,1.0f);glLoadIdentity();glTranslatef(0.0f,0.0f

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論