轉載:http://www.cnblogs.com/shanhaobo/articles/1065380.html
要談座標系變換,那麼座標系有哪些呢。依次有:物體座標系,全局座標系,相機座標系,投影座標系以及螢幕座標系.我要討論的就是這些座標系間的轉換。 這些座標系不是憑空而來,他們都是為了完成電腦3D圖形學最最最基本的目標而出現.
電腦3D圖形學最最最基本的目標就是:將構建好的3D物體顯示在2D螢幕座標上.
初看好像就是將最初的物體座標系轉換到螢幕座標系就可以了呀,為什麼多出了全局座標系,相機座標系,投影座標系。這是因為:在一個大世界裡有多個物體,而每個物體都有自己的座標系,如何表述這些物體間相對的關係,這個多出了全局座標系;如果只需要看到這個世界其中一部分,這裡就多出了相機座標系;至於投影座標系那是因為直接將3D座標轉換為螢幕座標是非常複雜的(因為它們不僅維度不同,度量不同(螢幕座標一般都是像素為單位,3D空間中我們可以現實世界的米,厘米為單位),XY的方向也不同,在2D空間時還要進行座標系變換),所以先將3D座標降維到2D座標,然後2D座標轉換到螢幕座標。
理解3D圖形學的第一步:理解左手座標系與右手座標系
為什麼會有左手座標系與右手座標系之分。
在3D空間(沒錯。就是3D)中,所有2D座標系是等價的(就是通過一系列的仿射變換,可以互相轉換)
而3D座標系不是等價的,通過仿射變換,是無法將左手座標系轉換到右手座標系;也就是說,物體座標系用的就是左手座標系,全局座標系用的是右手座標系,那麼物體可能就是不會是我們所希望的樣子了,可能是倒立的,也可能是背對著我們的,所以我們要區分左手座標系與右手座標系。也許在4D空間,左右手座標系就可以互相變換了吧。
進入正題吧:
首先討論的是物體座標系->全局座標系
前面說了為了描述多個物體間相對的關係,這裡引進了全局座標系,所以全局座標系是個參考座標系。
這一步的目的將所有的物體的點都轉移到全局座標系,這裡主要涉及的是旋轉,縮放,平移等。
不過我將詳細說明為何及如何用矩陣來描述這些變換。
例:如果有兩個座標系C與C`, C`是C繞Z軸旋轉θ得到的。下面是各座標軸的變換:
如果是C座標系的點P(x, y, z),而在C`的表示就是
這時該如何建立矩陣呢? 答案就是區分你用的是行向量還是列向量.也許有人會問為什麼不區分是左手座標系還是右手座標系呢。因為C可以變換到C`,那麼他們一定是同在左手座標系或右手座標系,變換隻能在可以互相轉換的座標系之間進行。
如果你用的是行向量:由於行向量只能左乘矩陣(注意乘與乘以的區別)
所以矩陣形式應該是這樣
只有這樣,在左乘矩陣時才能得到上面P`的形式。
如果你用的是列向量: 由於列向量只能右乘矩陣(注意乘與乘以的區別)
所以矩陣形式應該是這樣
只有這樣,在右乘矩陣時才能得到上面P`的形式。
至於如何旋轉,縮放,平移我不在多說。
…………………………………覺得自己好像跑題了.還好這兩個座標系變換很簡單。
我們再討論全局座標系->相機座標系
引進相機的目的就是只需看到世界的一部分,而哪些是可以在相機裡看到的,就需要進行篩選。將物體轉換到相機座標系,這樣相機座標系進行篩選時就會簡單很多。這裡的重點是構建相機座標系。
物體座標系,全局座標系是美工在繪製時就定義好了的。而相機座標系是需要程式即時構建的。(當然這是通常情況下,如果你要建立一個世界,這個世界都是圍繞你轉,要即時改變所有物體座標系,固定相機座標系(其實這時候相機座標系就是全局座標系),建立一個地心說的世界,我也沒辦法,你的思維也太不一樣了。)
如何構建相機座標系呢。首先我們要明確目標:我們是要構建3D座標系(好像是廢話),三個座標軸要互相垂直(也好像是廢話).
我們一般用UVN相機。例如:D3D的D3DXMatrixLookAtLH,D3DXMatrixLookAtRH,OGL的gluLookAt(右手座標系).
如何建立呢UVN相機呢? 我們就要利用叉積這個工具了:兩個不平行,不重疊的向量的叉積可以得到與這兩個向量互相垂直的向量。
如果有了相機的位置與目標的位置那麼我們可以確定一個Z軸(有人問為什麼是Z軸,因為物體的遠與近我們就習慣用Z值來表示的)。求Z軸時要注意是左手座標系還是右手座標系,左右手座標系XY軸方向相同時,Z軸的方向相反。所以左手座標系是目標位置減去相機位置,而右手座標系則是相機位置減去目標位置。記得normalize
這是我們要得到X與Y軸了。如何求X,Y軸呢。
一般方法是:
1、選擇一個臨時Y軸,
2、對臨時Y 與Z 軸進行叉積求得一個X軸
3、X軸再與Z軸進行叉積,得到一個Y軸。
有了XYZ就可以求出旋轉的相機矩陣了。
如何選擇一個Y軸呢。大多數情況下是(0,1,0),但是如果是相機位置E與目標位置T垂直,即(E-T=(0,+/-1,0)時),這時就不能用(0,1,0)了, 因為兩個平行向量的叉積是零向量,所以我們就要另選一個Y軸。
但是我覺得我們可以改變方法。
如果不能選Y軸,我們就選擇一個臨時X軸,這個臨時X軸就是(1,0,0)。
然後再對臨時X軸與Z軸進行叉積求得一個Y軸。
最後Y軸再與Z軸進行叉積,得到X軸。
這樣可以得到XYZ軸。
最後再根據行向量與列向量建立相機矩陣,再進行平移。
相機座標系->投影座標系.
投影的目的就是:降維.
兩種投影方式:正交投影與透視投影.
在我們TEAM中易穎已經寫了,我就不多說了,大家去看他的文章。
投影座標系->螢幕座標系
這是最簡單的。2D座標變換。也不多說。