如下圖,位於xy平面的單位正方形投影到任意平面p上後,變成了不規則的四邊形abcd,我們能根據正方形的四個頂點投影前後的座標,計算出平面xy上任意點 (x,y) 投影到平面p 上之後的座標 (x', y') 嗎?
我們注意到正方形的四個邊投影到平面p之後,分別變為線段ab,bc,cd,da,也就是說投影前位於一條直線上的點,投影後仍然位於一條直線上,對於直線來說,這種變換是線性的;但投影前平行的兩條直線,投影後不再平行,對於平面而言,這種變換不是線性的。不過,雖然這種變換不能表示成線性變換,但可以表示成兩個線性變換相除,於是就有了齊次座標,
齊次座標的好處是,可以把投影變換轉化成線性變換,從而使用矩陣運算來對問題求解。
使用齊次座標,可以有以下變換
寫成方程式表達:
x' = ax + by + cw
y' = dx + ey + fw
w'= gx + hy + iw
其中 (x,y,w) 是變換前的座標,(x',y',w')是變換後的座標,(a b c ...)是變換矩陣
根據上面的討論,我們已知四邊形四個頂點變換前後的二維座標,每個點可以寫出三個方程式,總共有12個方程式,而變換矩陣共有9個未知數,再加上變換之後的座標w也是未知數,總共有13個未知數,於是這個方程組有無限多組解,但是在投影平面上,每個點的齊次座標本身就可以有無數個表達,我們只要把w規則化為1,就可以求出x, y
根據仿射變換理論,係數c,f表示變換前後的原點位移(平移變換),為了簡化計算,我們假定c,f都等於0(即變換前後原點沒有位移),並且把係數i 調整成1,於是有
其中 p是比例因子
寫成方程式
px' = ax + by (1)
py' = dx + ey (2)
p = gx + hy + 1 (3)
用式3消去式1和式2中的p,就得到2個方程式
ax + by - gxx' - hyx' = x' (4)
dx + ey - gxy' - hyy' = y' (5 )
我們假定由點(0,0)(1,0)(0,1)(1,1)四個點組成的單位正方形區域對映到目標平面後的座標分別是 (0,0) (x1',y1') (x2', y2') (x3', y3'), 原點(0,0)對映到 (0,0)不在計算之列,把其它三個點分別代入式(4),式(5),一共得到六個方程式
a - gx1' = x1' (6)
b - hx2' = x2' (7)
a + b - gx3' - hx3' = x3' (8)
d - gy1' = y1' (9)
e - hy2' = y2' (10)
d + e - gy3' - hy3' = y3' (11)
把式(6)(7)(10)(11)變換,得到
a = x1』 + gx1』 (12)
b = x2』 + hx2' (13)
d = y1』 + gy1』 (14)
e = y2』 + hy2' (15)
然後代入式(8)(11),得到
x1' + gx1' + x2' + hx2' - gx3' - hx3' = x3'
y1' + gx1' + y2' + hy2' - gy3' - hy3' = y3'
整理後為
g(x3' - x1') + h(x3' - x2') = x1' - (x3' - x2')
g(y3' - y1') + h(y3' - y2') = y1' - (y3' - y2')
令 dx31 = x3' - x1'
dx32 = x3' - y2'
dy31 = y3' - y1'
dy32 = y3' - y2'
從以下 開始,為書寫方便,去掉了x,y後面的撇號
dx31g + dx32h = x1 - dx32
dy31g + dy32h = y1 - dy32
求解此方程
係數矩陣 m =
dx31 dx32
dy31 dy32
det(m) = dx31dy32 - dy31dx32
逆矩陣m-1 = 1 / det(m)*
dy32 -dx32
-dy31 dx31
於是g * det(m) = dy32 * (x1 - dx32) - dx32 * (y1 - dy32)
= x1 * dy32 - dx32 * dy32 - y1 * dx32 + dx32 * dy32
= x1 * dy32 - y1 * dx32
h * det(m) = -dy31 * (x1 - dx32) + dx31 * (y1 - dy32)
注意到x1 - dx32 = x2 - dx31, y1 - dy32 = x2 - dy31, 於是
h * det(m) = -dy31 *(x2 - dx31) + dx31 *(y2 - dy31)
= -x2*dy31 + dy31*dx31 + y2*dx31 - dx31*dy31
= y2*dx31 - x2 * dy31
把 g,h 分別代入(12)(13)(14)(15)
就可以求出a,b,c,d
a = x1 * (1 + g)
b = x2 * (1 + h)
d = y1 * (1 + g)
e = y2 * ( 1 + h)
這樣就求出了變換矩陣的全部係數。
深入研究透視投影變換
深入研究透視投影變換 3d世界變換主要有世界變換 觀察變化 投影變換。世界變換做的事情是把座標從模型空間變換到世界空間,而觀察變換是把座標從世界空間變換到觀察空間。3d世界裡,所有的物體 包括相機等 都可以認為是3d模型,他們開始建立的時候都是處於自身座標系內,渲染的時候,我們需要把這些模型從模型空...
投影變換 透視投影和正交投影
2.3 投影變換 3.2.3.1 基本概念 在計算機圖形軟體中所採用笛卡爾 cartesian 直角三維座標系統,按照 z軸方向的不同有兩種形式 1 右手系統 當用右手握住 z軸時,大姆指指向 z軸的正方向 圖 3.20 a 其餘四個手指從x軸到 y軸形成乙個弧。2 左手系統 當用左手握住 z軸時,...
正交投影變換與透視投影
相機投影模型 三維計算機圖形學的基本問題之一就是三維觀察問題 即如何把三維場景投影到要顯示的二維影象。大多數經典的解決投影變換方法有兩種 正交投影變換和透視投影變化。正交投影變換用乙個長方體來取景,並把場景投影到這個長方體的前面。這個投影不會有透視收縮效果 遠些的物體在影象平面上要小一些 因為它保證...