一、坐標系的基本概念及其重要作用
坐標系是建立圖形與數之間對應聯系的參考系。它可以直觀方便的描述圖形的幾何信息、大小、位置。
在計算機圖形學中,從對象的建模,到在不同顯示設備上顯示、處理圖形時會使用一系列的坐標系。例如:在屏幕上,會使用像素構成的二維坐標系來表示圖形的像素值。
對于一個給定的場景,我們通常并不是按照像素坐標來考慮。我們要考慮屏幕適配、組件復用、軟件跨平臺等等一系列工程化問題。因此,我們希望將程序中用于描述對象幾何信息(形狀,拓撲結構)的數值,和那些用于描述對象中大小和位置的數值區分開來。
前者通常被看作一個建模(moduling)的任務,后者是一個觀察(viewing)的任務。
例如,教室里一張桌子,我們需要從不同距離和角度去描繪,并顯示到屏幕。針對這個問題,我們當然可以把每次“建模-觀察”的結果一一繪制到屏幕上。但是,我們需要注意到在這個過程中,桌子的幾何信息客觀上是固定不變的。因此,我們可以把“建模”的任務和“觀察”的任務分離開來,每次繪制只需要改變觀察任務的的數值即可。
當我們把“建模”與“觀察”分開后,產生一個新的問題,即多坐標系問題。不同的坐標系具有它存在的必要性。
為了方便“建模”,我們給每一個建模任務構建一個自己的坐標系,叫做建模坐標系。同時,為了方便“觀察”,我們也給每一個觀察任務構建一個觀察坐標系。為了完成某一次圖形的顯示,我們需要建立相應“建模”任務和相應“觀察”任務的適當的映射關系,因此產生了世界坐標系的概念。為了使得計算機圖形能夠在特定的屏幕上正確顯示,我們需要知道特定屏幕的屏幕坐標系,即設備坐標系。為了使得計算機圖形能夠在不同屏幕上正確顯示,我們又定義了規范化坐標系。另外,對于一個大場景,我們可能只關注某一局部。因此,產生了裁剪坐標系。
二、計算機圖形學中坐標系的分類
1. 世界坐標系(World coodinate system)
在系統(場景)中用于描述其他坐標系位置和對象模型位置的參考坐標系,被稱為世界坐標系。
在我的理解中,世界坐標系是一個特定場景中全局的、絕對的公共參照系。
注意這句話,“全局的”、“絕對的”,都是在我們所關心的特定的場景中,這個特定場景很多情況下并非真實世界或者宇宙,它可能是一間房,一個虛擬的游戲世界。
2. 建模坐標系
用于描述對象的幾何信息的獨立于世界坐標系的參照系,叫做建模坐標系。
建模坐標系又被稱為局部坐標系。一旦定義了“局部”(相對于上面提到的世界坐標系的全局)的對象,就可以很容易地將“局部”對象放入世界坐標系中,使它由局部升為全局。
3. 觀察坐標系
觀察坐標系主要用于從觀察者的角度對整個世界坐標系中的對象進行重新定位和描述。
依據觀察窗口的方向和形狀在世界坐標系中定義的坐標系被稱為觀察坐標系。
觀察坐標系用于指定圖形的輸出范圍。
對于世界坐標系來說,觀察坐標系其實是一種特殊的建模坐標系。
4. 設備坐標系
適合特定輸出設備輸出對象的坐標系叫做設備坐標系。比如屏幕坐標系。
在多數情況下,每一個具體的顯示設備,都有一個單獨的坐標系統。
5. 規范化坐標系
規范化坐標系獨立于設備,能夠很容易地轉變為設備坐標系,是一個中間坐標系。
為使圖形軟件能在不同設備之間移植,采用規范化坐標系,其坐標軸取值范圍是[-1, 1]或[0, 1]。
三、坐標系之間的映射變換
前面提到,對于給定的問題,我們大致分為“建模”和“觀察”兩個任務。對于一個給定的對象模型,我們已知它在建模坐標系下的坐標,我們如何在觀察坐標系下得到該對象的定位和描述。
像這種已知對象在一個坐標系的坐標,要獲得該對象在另一坐標系下的坐標,我們把這一過程叫做坐標轉換。而這個過程離不開世界坐標系,因為世界坐標系決定了建模坐標系與觀察坐標系的映射關系。
需要注意,坐標轉換過程中,對象的實際位置和狀態并未發生改變,我們僅僅是使用了不同的坐標系描述對象的位置。
例下圖,在一個世界坐標系中,一個點
在建模坐標系
中的坐標為
。現在得到觀察坐標系
中
點的坐標。
從圖中,我們可以很容易的得出,點在觀察坐標系
中的坐標為
。然而,在實際問題中,我們不可能總能通過觀察得出新的坐標,這就需要通過變換計算得到。
就這個問題,我們先要得到建模坐標系到觀察坐標系
的變換矩陣R:
可以看到,坐標系A先平移向量,再平移向量
,最后基于Y軸反射
得到坐標系B(實際應用中,連續的相同變換操作可以合并,如這里的連續平移可以合并為
,這里為了更清晰表示變換過程——
,將其拆分出來)。代入式(1)得到:
所以,由式(2)可知基變換矩陣:
由式(3)可得坐標變換矩陣:
則,點P在坐標系B中的坐標為:
同樣的,我們可以得出的基變換矩陣
為:
他恰好就是的坐標變換矩陣。因此,我們要求
的坐標變換矩陣就可以改為求
的基變換矩陣,可以少一次矩陣的逆運算。
通過這個示例,我們可以得出一個結論,計算機中,圖形的顯示過程就是幾何(對象)模型在不同坐標系之間的映射變換。
在圖中我們可以觀察到,可以先經過兩次平移,再經過一次反射得到,記作
,也可以是先經過一次反射再經過兩次平移得到,記作
,或者更多的變換組合……,但結果肯定是惟一的。
我們嘗試將式(2)中的與
交換順序以實現變換
:
得到的結果是:
這與式(3)的結果不一致,因為矩陣點乘一般不滿足交換律。可是,這與我們觀察到的和
都可行的結果不一致。
其實和
兩種變換順序都沒有問題,只不過我們觀察變換
時采用的的參考系出了問題。
的所有變換操作都隱藏了一個前提:基于目標坐標系(變換操作的參照系)原點的變換。如
實際應該是:
而中第一步的反射并非基于世界坐標系
軸的變換,而是基于
的反射,所以應該先平移
,再做反射操作。正確的表達式是:
修正后的變換過程我們記作。
可以看到,結果與式(3)相同。
雖然和
都可以得到正確的結果,但是為了防止出現如
一般的錯誤或為了減少計算量,在連續不同坐標系變換過程中,我們應該始終以本次變換的目標坐標系作為參考系進行先平移后作線性變換。