1. 程式人生 > >OpenGL(五) 三維變換之模型檢視矩陣

OpenGL(五) 三維變換之模型檢視矩陣

計算機三維圖形學中,一個基本的任務是如何描述三維空間中一個物體位置的變化,也就是如何 描述物體的運動。通常情況下,物體位置的變化包含三個基本的變化:平移、旋轉和縮放,物體的運動也可以用這三個基本的運動形態的組合來描述。

圖形學中物體運動的數學表述是:將點的初始位置座標P0對映到經過平移、旋轉、綻放後的新位置P1的過程。

平移:

平移就是在原始的三維空間座標點上分別加上對應方向上的平移量:


旋轉:

旋轉分為兩類:在二維平面和三維空間中的旋轉。

二維平面上的旋轉:


相對座標注原點旋轉角度θ:


以矩陣形式表述:


擴充套件到三維空間,先看簡單的繞某一個座標軸旋轉的情況。

繞Z軸旋轉:


繞X軸旋轉:


繞Y軸旋轉:


三維空間中繞指定的任意軸旋轉變換可以分解為分別繞三個座標軸的旋轉變換和一個平移變換的疊加。

縮放變換是三個維度上分別乘一個縮放係數:


總結以上,可以看到變換後的座標點除了平移變換是在原始座標上加上一個平移向量外,旋轉、縮放都是在原始座標點上乘以一個變換矩陣。

為了把平移變換也統一成矩陣相乘的形式,引入了齊次座標齊次座標就是將一個原來是N維的向量用一個N+1維向量來表示 。在齊次座標中用4個分量來表示三維空間中的一個點,前三個分量跟普通三維座標一樣,第四個分量設定為1。

在齊次座標下,平移變換可以表述為:


這樣,在齊次座標系下,三維空間的運動一一平移、旋轉、縮放在形式上都統一為左乘一個變換矩陣的形式。

考察一個物體的運動,先進行一次平移,再進行一次旋轉,兩個運動可以表述為:


R*T也是一個4*4的變換矩陣,這個變換包含了一次平移和一次旋轉的疊加。

推廣到更復雜的變換,只需要在當前R*T矩陣上依次左乘上對應的變換矩陣,最終得到的變換矩陣包含了物體所有變換的疊加,而這一系列的變換隻需要用初始座標左乘上這個最終的變換矩陣就可以實現,這個矩陣就是“模型矩陣”。

例如對於三維空間中的一條直線,直線經過點(x0,y0,z0),並且方向為(a,b,c),則一個物體繞該直線旋轉θ角度的運動變換可以分解為:

  • 平移(-x,-y,-z)平移到原點
  • 繞x軸旋轉角度p使指定的旋轉軸在x-z平面上
  • 繞y軸旋轉角度q使指定的旋轉軸與z軸重合
  • 繞z軸旋轉角度 繞y軸旋轉角度-q
  • 繞x軸旋轉角度-p     
  • 平移(x,y,z )

綜上可以看到,模型矩陣描述了三維空間物體的一系列變換的資訊。在物體為剛體模型(剛體是在運動中和受力作用後,形狀和大小不變,而且內部各點的相對位置不變的物體)的情況下,物體的所有頂點通過左乘模型矩陣,就可以實現物體的指定運動,所以模型矩陣大大降低了運動模型的複雜度。

模型檢視矩陣

在模型矩陣中,關心的是物體在運動之後在世界座標系下位置座標點的變化。更加普遍的情況是,我們更加關心物體相對於觀察者的位置變化,而不僅僅是關於世界座標系下的變化。例如觀察者在一輛運動著的汽車中觀察另一輛相向而行的汽車的變換,這時候觀察者和被觀察的物體都在運動。這種觀察者也在移動的情況,在現實世界中更加普遍。這也增加了確定運動模型的複雜度。

所幸的是,我們可以從另一個角度看待這個問題,即觀察者的位置和方向發生變化時(這個變換可以用一個模型矩陣來表述),可以看做是被觀察的物體進行了觀察者運動相反的運動,即需要在模型矩陣的基礎上再左乘一個觀察者變換矩陣的逆矩陣,這個逆矩陣稱為“檢視矩陣”,而這個檢視矩陣跟模型矩陣相乘得到的矩陣就是所謂的“模型檢視矩陣”。

物體左乘模型檢視矩陣後獲得的新的位置(形狀),描述 的是當觀察者和物體都在運動時,物體在觀察者眼中座標點(形狀)的變化。

數學 就是這麼奇妙,它先把一個很簡單問題複雜化,然後再把它簡單化,以彰顯其牛逼之處。