轉載請說明出處!程序員
http://blog.csdn.net/zhanghua1816/article/details/8067669
算法
第一章,咱們簡單介紹了什麼是Ogre,它能用來作什麼。OGRE(Object-Oriented Graphics RenderingEngine是一個面向對象圖形渲染引擎,它用C++開發而成,並且,它隱藏了底層系統庫(如:Direct3D和OpenGL)的全部細節。旨在讓開發人員更容易、更直接地開發應用。在開始學習Ogre以前,咱們須要具有一些相應的基礎知識,例如計算機高級語言C++、計算機圖形學以及數學等方面的知識。若是讀者已經具有了這些基礎知識,能夠跳過本章,開始第3章的學習,若是讀者對這些基礎知識還不甚瞭解,那麼就立刻跟我一塊兒來學習吧。編程
2.1 計算機圖形學框架
計算機圖形學(Computer Graphics,簡稱CG)是一種使用特定的算法將二維或三維圖形轉化爲計算機可識別形式的科學。也就是說,計算機圖形學主要研究如何在計算機中存儲圖形、表示圖形、以及如何利用計算機對圖形進行處理。計算機圖形學的主要目的就是要利用計算機產生使人賞心悅目的真實感圖形。ide
筆者注:函數 讀者應該區分圖形和圖像這兩個概念。圖形和圖像雖然僅一字之差,不過區別仍是很大的。圖像一般是指那些經由輸入設備輸入到計算機中,以數字化形式在計算機中存儲和顯示的信息。圖像是由一些排列的像素組成的,在計算機中以矩陣的形式存儲。圖像常見的存儲格式有BMP、JPG、GIF等。而圖形通常指利用計算機軟件繪製的畫面,如直線、圓、矩形等,總得來講,圖形是計算機利用某些特定點以及特定的圖形生成算法自動生成的。工具 |
計算機圖形學的研究內容很是普遍,包括曲線曲面造型、圖形交互技術、光柵圖形生成算法、實體造型、計算機動畫、真實感圖形計算與顯示算法、非真實感繪製,以及科學計算可視化、天然景物仿真、虛擬現實等。在計算機三維遊戲和動畫中,計算機圖形學的知識可謂無處不在。利用它,能夠在影視做品中實現真人與動畫的完美結合,還能夠將特效應用於各類遊戲和動畫中等等。學習
2.2 計算機輔助幾何設計動畫
在前面的2.1小節中,咱們大體瞭解了計算機圖形學這門學科。其實,計算機圖形學是研究如何在計算機內存儲和顯示圖形,這些圖形最終構成一個完整的、逼真的、跟現實世界中極爲類似的場景。並且,這個場景要盡最大可能與現實中的真實場景保持一致,也就是說,盡最大限度地模擬顯示中的場景,並讓其在計算機屏幕上顯示出來。爲了達到這個效果,必須將場景分解爲不一樣的幾何體、圖形、點、線等,再利用計算機模擬某種光照、以及幾何體上的材質、紋理等效果,最終達到一個較高的仿真水平。所以,咱們在有了計算機圖形學的基礎之後,還須要掌握另外一門與計算機圖形學密切相關的學科:計算機輔助幾何設計。spa
計算機輔助幾何設計(Computer Aided Geometric Design: CAGD)是涉及計算機科學與數學的一門新興學科,也是一門邊緣學科, 它研究的主要內容是"在計算機圖像系統的環境中曲面的表示和逼近", 它主要側重於計算機內如何對幾何體進行構造。
計算機輔助幾何設計(CAGD)雖然是一門新興學科,可是學習它所用到的理論工具相信你們都很熟悉,例如交換代數、逼近論、微分幾何、計算數學、代數幾何等等。隨着計算機技術的不斷髮展,以及計算機愈來愈強大的圖形功能,計算機輔助幾何設計這門新興學科也在不斷髮展,並被普遍應用到諸如飛機, 船舶, 汽車的設計以及工程器件模具的設計中,另外,它還被普遍應用到了醫學圖像處理等領域。
2.3 OpenGL
OpenGL(Open Graphics Library)是一個底層的圖形庫,它的功能很是強大且調用方便。做爲一個圖形開發庫,OpenGL是徹底獨立的,它不依賴於任何的平臺,能夠在任何平臺下進行開發,若是再利用一些計算機高級語言開發主框架,而後結合OpenGL就能夠開發出三維遊戲等應用程序。也就是說,OpenGL是個與硬件無關的軟件接口,能夠在不一樣的平臺如Windows 9五、Windows NT、Unix、Linux、MacOS、OS/2之間進行移植。所以,若是一個軟件支持OpenGL,那麼它必然擁有很是好的移植性,從另外一個角度說,移植性強也是OpenGL普遍應用的一個重要緣由。
筆者注: OpenGL與Ogre的區別: OpenGL是系統底層的API,跟它同級的還有Direct X。 Ogre能夠說就是對OpenGL和Directx的二次封裝。通俗的說,Ogre把底層的東西封裝起來,以一種更貼近現實的方式,供咱們使用,即絕大多數的細節對程序員來講是透明的,即系統底層的細節都被封裝起來,程序員無需知道具體的細節是什麼,只須要簡單的調用Ogre提供給咱們的函數接口就能夠實現咱們想要實現的功能。對於OpenGL或者DirectX這種底層API來講,是不具有這種封裝性的,要實現任何功能,都須要程序員經過代碼對系統底層直接操做,過程可謂十分繁瑣。 |
2.4 C++知識
接觸太高級語言編程的讀者,對C++確定都不陌生。Ogre是一個用C++開發完成的圖形庫,在Ogre中編寫的代碼,都遵循了C++語法的原則。所以,在咱們開始使用Ogre以前,必須得學會C++的基本概念、函數、語法和運行原理等相關知識。
C++語言是從C語言的基礎上發展而來的。C語言是一種面向過程的計算機高級語言,若是要處理的程序規模較小,C語言使用起來可謂駕輕就熟,可是,若是程序的規模太大,使用C語言進行設計就必須細緻的處理程序中的每一處小細節,例如,程序員必須知道每一個時刻,程序中各個變量的狀態,各個變量接下來如何變化等。這無疑大大增長的程序設計的難度,縱使高水平的程序員也顯得力不從心。在這種狀況下,C++語言就應用而生了。
C++語言繼承了C語言的幾乎全部優勢,在此基礎上,增長了面向對象的機制,也就是說,C++語言是一種面向對象的高級程序語言,在C語言的基礎上引入了類的概念。並且,C++語言還引入了繼承機制,使得代碼能夠被重複利用。所以,學習Ogre3D前,咱們要掌握C++中最基本的類的概念、重載、多態、繼承等一些重要的概念。
2.5 變換中的數學
在3D圖形學中,須要咱們具有至關的數學知識才能更好的理解各個方面的知識,這一節咱們就詳細討論一下咱們常常會涉及到的一些變換知識,不過,咱們不可能面面俱到的講到每一個方面,若是讀者朋友想更好的理解這些知識,還需參考相關書籍。
2.5.1 點和距離
點表示一個位置,是在座標系中以座標值指定的位置。一點p(x,y,z)在座標系中的座標,就是該點在座標軸上的垂直投影 (以下圖所示爲二維平面上的點p(x,y)在x,y軸上的投影).
設三維空間中的兩個點p1(x1,y1,z1)和p2(x2,y2,z2)則兩點之間的距離爲:
2.5.2 矢量
矢量是一個n元組,在座標系中它對應於n維空間的一個點,這個點 能夠表明物體在空間的位置,也能夠表明其運動狀態等。下面經過三維矢量來講明有關矢量的概念及運算。
設有任意兩個三維矢量:
1.矢量和
矢量能夠進行求和運算,遵循平行四邊形規則,以下圖所示:
2.矢量的數乘
設存在一個實常數k,矢量的數乘是經過對矢量的各份量同時乘以k來實現。矢量的數乘能夠實現對矢量的放縮。若k>0,則所得的新矢量與原矢量方向相同,不然方向相反。
3.矢量的模
任何三個線性無關的矢量都構成三維空間的一組基。以下三個特殊的矢量是三維空間的一組基:
也就是說,任何三維矢量均可以表示成這三個矢量的線性組合,矢量U可表示爲:
這三個主矢量一般也分別被稱爲 , , 。矢量的模指的是矢量的長度,定義爲:
4.單位矢量
對於給定矢量,若是隻對它的方向感興趣而不在意它的長度,爲了方便計算,可使用與其方向相同的單位矢量。設U的單位矢量爲 ,則
5.矢量的點乘
矢量U和V的點乘表示爲 ,定義以下:
U和V夾角 的餘弦定義以下:
點乘的幾何意義如圖所示:
U·V即U在V上的投影乘以V的模
由以上定義能夠獲得點乘的以下性質:
該性質的含義是兩個互相垂直的矢量(通常稱爲矢量正交)的點乘爲0。
6.矢量的叉乘
矢量的叉乘表示爲 ,它構成了一個新矢量。
其中 , , 分別爲 , , 軸的單位矢量。
叉乘有以下性質:
(1).
(2).矢量 U×V垂直於矢量U 和V,即U×V是U和V構成的平面法向。U、V和U×V三矢量的方向聽從右手系。
2.5.3 矩陣
m×n階矩陣A定義爲:
其中 爲A的第 行第 列元素,矩陣A也記爲 或 。若是m=n,則稱A爲n階矩陣或n階方陣。下面以4×4階矩陣爲例討論矩陣性質。
設有兩個4×4階矩陣:A= ,B= 。
1.矩陣的加法
把兩個矩陣對應位置的元素相加獲得的矩陣稱爲矩陣的和,記爲A+B。
注意:只有兩個矩陣的階數(行數和列數)相同時才能進行加法運算。矩陣的加法運算歸爲它們元素的加法,也就是數的加法。
2.矩陣的數乘
對於任意實數k,k與矩陣A的數乘定義爲k與A的每一個元素相乘,即:
3.矩陣的乘法
當矩陣A的列數和矩陣B的行數相同時,可對它們進行乘法運算。例如:若A爲m×n階矩陣,B爲n×p階矩陣,設C爲它們的乘積,則C爲m×p階矩陣。
4.單位矩陣
若一個n階矩陣的主對角線元素均爲1,其他各元素均爲0,則稱該矩陣爲n階單位矩陣,記爲 。一個4階單位矩陣爲:
5.矩陣的轉置
把矩陣A=的行、列互換而獲得的n×m階矩陣叫作A的轉置矩陣,記爲AT。例如,將上面的4×4階矩陣B進行轉置獲得BT。
矩陣的轉置知足:
(AB)T=BTAT
6.矩陣的逆
對於n階矩陣A,若存在一個n階矩陣B,使得AB=BA=In,則B爲A的逆矩陣,記做B=A-1。同時A也稱爲B的逆矩陣,即A和B互爲逆矩陣。矩陣A可逆的充分必要條件是其行列式不爲0。例如:
2.6幾何變換
觀察一個物體,因爲觀察角度或位置的改變,會看到不一樣的畫面。觀察角度和物體位置的改變能夠經過在世界座標系中對物體進行各類變換來實現。
2.6.1 基本變換
1.平移變換
設點P(x,y,z)沿x、y和z軸方向分別移動距離Δx, Δy和Δz獲得點P′(x′,y′,z′),則這兩點座標之間的關係是:
x′=x+Δx y′=y+Δy z′=z+Δz
用矩陣表示爲:
(1)
2.放大和縮小變換
設點P(x,y,z)沿x、y和z軸方向分別放縮sx、sy和sz倍後獲得點P′(x′,y′,z′),則有:
(2)
寫成矩陣形式爲:
(3)
比例因子sx、sy和sz相等時,上式是以原點爲類似中心的類似變換,以下圖所示,是對一三角形作類似比爲2的類似變換的情形:
原圖形距離座標原點越遠,圖形變換後的位置改變越明顯,爲了使放縮變換後的圖形仍在原來位置附近,可另外定義一個類似中心(如可取圖形的中心)(xp,yp,zp),而後再進行放縮變換。要對圖形造成以(xp,yp,zp)爲類似中心、以(sx,sy,sz)爲放縮比例的變換,可先對圖形進行平移變換,把整個圖形沿x、y和z方向分別平移-xp、-yp和-zp,類似中心就移到了座標原點,而後對每一點按照上面的公式進行放縮變換,最後再沿x、y和z方向分別平移xp、yp和zp,把變換後的圖形移回到原處,就完成了以(xp,yp,zp)爲中心的放縮變換。其變換公式爲:
以(xp,yp,zp)爲中心的縮放變換
3.旋轉變換
設點P(x,y, z)= (rcos , rsin , z),繞z軸旋轉 角度後獲得點P′(x′,y′,z′)。這裏規定繞一軸旋轉 角度是按右手法則,即若 >0,大拇指指向軸的方向,其它手指指向旋轉方向。這樣可獲得P和P′兩點座標之間的關係爲:
用矩陣形式表示爲:
(4)
同理可獲得繞y和x軸做旋轉變換的矩陣表示分別爲:
和
下面討論空間任一經過座標原點的軸的旋轉變換,設旋轉軸方向爲(Ax,Ay,Az)。由上述討論知,沿z軸的旋轉變換很容易實現,所以可把繞任意軸的旋轉變換歸結爲z軸的變換實現。爲此,創建一個新的座標系 ,座標軸的指向和旋轉軸方向一致,以下圖所示。
把要進行旋轉變換的對象從原座標系 變換到新座標系 ,而後在新座標系中繞Ow軸對其進行旋轉變換,最後把旋轉的對象由新座標系 變換到原座標系中 ,這樣實現了繞空間任一經過座標原點的軸旋轉的變換。
如今創建兩個座標系 和 之間的變換關係。Ow軸方向的單位矢量 的座標爲:
因爲Ou軸方向的矢量和矢量和點乘爲零,因此,當 時,Ou軸的方向可取矢量(-Ay,Ax,,0)的方向,當 ,此時Ow軸和z軸重合,Ou軸的方向取(Az,0,0)的方向,即x軸方向。Ou軸方向的單位矢量 的座標爲:
若
或
若
因爲Ouvw爲右手座標系,因此Ov軸方向的單位矢量 爲 ,即
設P=(x,y,z)是座標系Oxyz中的任意一點,則P在Ouvw下的座標就是矢量 在Ouvw三個軸的投影長度。因爲矢量 在Ou軸上的投影u等於 和Ou軸上的單位矢量 的點乘,因此 ,同理可知,矢量 在Ov和Ow軸上的投影v和w爲:
因此從座標系Oxyz至Ouvw的變換爲:
(5)
因爲矢量 、 和 相互正交,因此矩陣A的逆矩陣就是A的轉置矩陣。這樣,從座標系Ouvw至Oxyz的變換公式爲:
(6)
按照上述繞任意經過原點的軸進行旋轉變換的實現方法和式(4)、式(5)和式(6)可得變換公式:
(7)
若是旋轉軸經過點(xp,yp,zp),而不經過座標原點,則可先進行平移變換把對象沿x、y和z方向分別平移-xp、-yp和-zp,而後按照式(4)進行旋轉變換,最後再把圖形沿x、y和z方向分別平移、和,這樣就能夠獲得圖形繞任意軸和旋轉變換。
4.錯切變換
在下圖中,OA'B'C'是矩形OABC沿x軸正向切變後的形狀,x軸稱爲方向軸,y軸稱爲依賴軸。
切變的程度由s=tan 決定,已知
由此可知s的幾何意義是y=1的點在切變時沿x軸正向平移的距離。設點(x,y,z)經錯切變換後稱爲(x',y',z'),則該變換用矩陣表示爲:
(8)
若是依賴軸和方向軸改爲其它的座標軸,上式中的矩陣要進行相應的變更。
2.6齊次座標與變換的矩陣表示
對圖形進行操做時,常常須要對圖形連續進行幾回變換,例如平移、旋轉以及放縮等,這樣對沒一點的座標要依次用咱們前面介紹的公式進行計算,計算量較大。若是隻有旋轉和放縮,則可把前面的式(7)和式(3)合併成一個矩陣。旋轉和放縮變換可寫成以下形式:
(9)
其中T1是4個矩陣的乘積。對一圖形進行上述變換時,只要用乘以各點的座標就能夠了,但若是再加上平移變換,因爲式(1)右邊比其它變換多了一項,變換矩陣就沒法合併。爲了是平移變換也能像式(5)、式(6)、式(7)和式(8)那樣容易合併,引進矢量的齊次座標表示。所謂齊次座標表示法就是用n+1維矢量表示n維矢量。例如,使用齊次座標(xh,yh,zh,h)來表示每一個三維空間座標位置(x,y,z),其中參數h可取爲任意非零值,最簡單的選擇是取h=1,所以每一個三維位置均可用齊次座標(x,y,z,1)進行表示。這樣式(1)的齊次座標表示式能夠寫爲:
(10)
式(10)和式(1)是等價的。引進齊次座標表示的優勢是全部上述變換矩陣可寫成統一形式,使變換合併容易。例如式(4)的變換可寫成齊次座標形式:
另外,利用齊次座標還能夠表示無窮遠點。例如,n+1維中,h=0的齊次座標實際上表示了一個n維的無窮遠點。在三維狀況下,利用齊次座標表示視點在原點時的投影變換,其幾何意義會更加清晰,因此在計算機圖形軟件包中通常都用齊次座標來表示變換。
PS:好久之前就打算把學習Ogre中遇到的知識分享給你們(雖然只是一些皮毛),可是說來慚愧,一直很懶,直到最近才抽出點時間寫一些本身的理解(Ogre入門級的東西),因此不免會有不少不足之處,分享是一種快樂,同時也但願和你們多多交流!
(因爲在Word中寫好的東西發佈到CSDN頁面須要從新排版(特別是有不少圖片時),因此之後更新進度可能會比較慢,同時每章節發佈的時間可能不同(好比說我首選發佈的是第二章,其實第一章就是介紹下Ogre的前世此生神馬的,相信讀者早就瞭解過~~~),可是我會盡可能作到不影響你們閱讀,還望你們諒解。)