學習OpenGL-ES: 4 - 坐標系變換(平移)


1,前言:

接下來將是數學系列,將主要講解一些初學者比較難以理解的內容,並假設讀者已經熟悉了基本的向量和矩陣運算以及其幾何意義。為了簡單化,某些數學概念不甚嚴謹,但不妨礙學習和理解。

在上一篇文章《學習OpenGL-ES: 3 - 3D繪圖原理》中,我們知道繪制3D圖形,首先需要描述物體:

  a, 我們需要描述物體位置,也經常需要平移物體,平移是指物體的形狀和朝向都不變,只是位置改變。我們通過對物體的所有頂點進行相同的平移來完成這個過程,我們稱之為對物體(頂點)進行平移變換,這個變換在計算機圖形學中是通過用頂點坐標乘以一個4X4矩陣來完成的,頂點乘以矩陣,得到一個新的頂點,這個新的頂點就是原頂點平移后的結果,我們稱這個矩陣為平移變換矩陣。

  b, 與此類似,我們通過用頂點坐標旋轉變換矩陣來旋轉物體,進行旋轉變換。

  c,通過縮放變換矩陣來對物體進行縮放變換。

平移、旋轉、縮放是最常見的變換,我們將在隨后的幾篇文章中分別講解,先來看平移變換:

2,坐標系(標架):

坐標系由原點和三個正交向量定義,三個正交向量稱為一般稱為坐標軸,相交於原點。由於位置總是相對的,所以坐標系A總是在某個坐標系B中進行描述:我們把最頂層的坐標系稱為世界坐標系,我們總是從這個坐標系出發去描述其它的坐標系。定義世界坐標系原點 [0,0,0], x軸[1,0,0],y軸[0,1,0],z軸[0,0,1]

3, 點和向量:

向量有大小和方向,但沒有位置,指定坐標系,向量總是可以由三個坐標軸的線性表示來構造,比如向量V [x, y, z] = x*[1,0,0] + y*[0,1,0] + z[0,0,1]; 對於向量來說,只需要三個坐標軸(基)就可以定義(向量空間),和原點無關。

點描述了3維空間中的位置,為了在向量空間中描述點(位置),引入了原點的概念,所有點都相對於原點進行描述(仿射空間)。

點和向量相加得到另一個點(想象一下點P沿着向量的方向移動向量的長度,其目的地就是新的點),兩點相減得到一個向量。在給定坐標系中的任意點P,都可以通過原點P0和從P0指向P的向量V定義:P = P0 + V;同樣 V = P - P0; 而每個向量又能由三個坐標軸的線性表示構造,所以每個點總能由原點 + 三個坐標軸的線性表示構造:

P = P0 + V = P0 + (ax + by + cz) = P0 + (a*[1,0,0] + b*[0,1,0] + c*[0,0,1]); 其中a\b\c為標量,x\y\z分別代表三個坐標軸向量,V代表從原點出發,指向P的向量。

另外,由於原點的坐標總是[0,0,0],所以P = P0 + V = [0,0,0] + V[x,y,z] = [x,y,z],注意:點和向量並不等同,此處只是在數值上相等,務必要分清。

4,多坐標系:

雖然點和向量的抽象定義和坐標系無關,無論有沒有坐標系,點和向量總是存在於空間中,但當我們描述(表示)以及計算它們的時候,必須先給定一個坐標系。同一個點在不同的坐標系中有不同的表示,同一個向量在不同的坐標系中也有不同的表示。而坐標系由一個點(原點P0)和三個向量(Vx,Vy,Vz)定義,將其視為四元組[P, V, V, V], 所以同一個坐標系,在不同的坐標系中也有不同的表示。

5,平移變換的兩種思考方式:

  描述平移,需要描述平移的方向和距離,而向量具有方向和大小,所以我們可以用向量來描述一個平移,沿着向量V的方向移動向量長度的距離,我們稱之為沿着V平移。

  a, 移動點:

  這是最自然的想法,有一個點P,移動V,則移動后的新點為P + V(回想一下,點 + 向量 = 點)。

  b,移動坐標系:

  移動坐標系和移動點是可互換的對偶過程。把一個點P移動一段距離,等同於保持點不動,把坐標系反方向移動相同的距離,然后在這個新坐標系中描述P,也就是計算P在新坐標系中的坐標。

  c,其它變換:

  事實上,所有變換都可以表述為變換點和變換坐標系這兩種等價的方式。在某些時刻,用一種表述(思考)方式會比另一種更合適,無論用那種方式,我們總可以通過一個逆變換轉變到另外一種方式,后面將看到這點。

6,由平移產生一個新坐標系

世界坐標系,原點 [0,0,0], x軸[1,0,0],y軸[0,1,0],z軸[0,0,1],我們把世界坐標系沿x的正方向移動1單位,也就是沿着向量[1,0,0]平移,可以得到一個新的坐標系,那么這個新坐標系在世界坐標系中的表示是什么呢?回想一下,一個坐標系由原點和三個坐標軸決定,因此移動坐標系,也就是移動原點和坐標軸,讓我們依次進行計算:

  先計算原點: 原點沿向量[1,0,0]平移,所以新的原點為:[0,0,0] + [1,0,0] = [1,0,0];

  再計算坐標軸:先考慮x軸,x軸為向量,向量沒有位置,只有方向和大小,而在平移中,x軸的方向和大小都沒有發生變化,所以x不變,同理y和z也不變。

  所以,新坐標系在世界坐標系中的表示:原點 [1,0,0], x軸[1,0,0],y軸[0,1,0],z軸[0,0,1]

可以得出這樣一個結論:所有對坐標系的平移只影響原點,不影響坐標軸。

7,計算同一個點在平移后的新坐標系中的坐標

點P,在世界坐標系中坐標為[1,2,3],在第5小節生成的新坐標系中,這個點的坐標是多少?

移動坐標系,等於逆向移動點,因此坐標系平移V[1,0,0],等同於點平移-V = [-1,0,0],所以,平移后的點為:P + (-V) = [1,2,3] + [1,0,0] = [0,2,3].

那么,假設在新坐標系中的一個點[1,2,3],在世界坐標系中的坐標P2是多少呢?首先將新坐標系移回原位置(和世界坐標系重合),需要沿-V移動,所以對坐標系來說,平移-V,對點來說則平移-(-V) = V,則 P2 = [1,2,3] + V = [1,2,3] + [1,0,0] = [2,2,3].

8,用矩陣進行平移變換

如同之前所述,我們可以用向量來描述平移變換,對一個物體進行平移V,等價於對這個物體所有的點P進行這樣的運算: P + V

但是,我們往往需要對物體進行各種變換組合,比如:先平移V,再繞X軸旋轉100度,再均勻縮放10倍,再平移V。。。所以如果有一種統一的描述和計算方式來表示所有的變換,對於理解、計算、硬件設計都有很大的好處,計算機圖形學中使用4X4矩陣來表示所有的變換,因此矩陣是一種用來進行各種變換的數學工具。那么矩陣是怎樣進行變換的呢? 

所謂變換,本質上可看做一個函數(映射),假設這個函數為T(),則對於一個頂點P,T(P)將輸出一個新的頂點P1,這個頂點就是經過T變換的結果,而T的實現,實際上是拿頂點乘以一個矩陣M,也就是P1 = P X M. 對每一種變換都有一個對應的函數T,也都有一個對應的矩陣M,所以一系列的變換可以描述為:P1 = P X M平移 X M旋轉 X M縮放 X M平移 = P平移 X M旋轉 X M縮放 X M平移 = P平移+旋轉 X M縮放 X M平移 = 。。。

而矩陣乘法滿足結合率,所以P X M平移 X M旋轉 X M縮放 X M平移 = P X (M平移 X M旋轉 X M縮放 X M平移) = P X M連乘矩陣 

 那么,用矩陣進行平移變換,關鍵就是構造一個矩陣M,令P X M  = P + V。注:在OpenGL ES中,使用4X4齊次坐標矩陣,右手坐標系,列主序,向量右乘。關於左/右手坐標系,行/列主序,向量左/右乘,向量和矩陣元素在內存(數組)中的順序等,都是初學者容易迷惑的地方,后續將有一篇文章專門對此進行講解。本文為了書寫方便,使用行主序和向量左乘.

假設將點[1,2,3]沿向量[4,5,6]進行平移,我們可以得出平移結果為[1,2,3] + [4,5,6] = [5,7,9],以下為對應的平移變換矩陣:

      1,0,0,0

[1,2,3,1] X 0,1,0,0 = [5,7,9,1]

      0,0,1,0

      4,5,6,1

[1,2,3,1]稱之為點[1,2,3]的齊次坐標表示,其中第四個分量一般稱為w分量,對3D來說,齊次坐標只是一種數學技巧,用來將各種變換統一為一種矩陣表示(3X3矩陣無法表示仿射變換,平移變換屬於仿射變換),齊次坐標可參考之前文章中推薦的書籍(學習OpenGL-ES: 0 - 方法和資料),此處不再贅述。

觀察上述矩陣,發現第四行為[4,5,6,1],恰為平移向量V的齊次坐標表示,因此沿向量V[X,Y,Z]平移的平移變換矩陣可構造如下;

  1,0,0,0

  0,1,0,0

  0,0,1,0

  X,Y,Z,1

9,總結:

對3D世界中的物體進行平移,就是對其所有頂點P進行相同的平移,這個平移可以通過一個平移向量V[X,Y,Z]描述,也可以通過一個平移變換矩陣M描述,平移變換的結果P1 = P +V = P X M。M是如下形式的4X4矩陣:

  1,0,0,0

  0,1,0,0

  0,0,1,0

  X,Y,Z,1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM