計算機圖形學中,建模自小孔成像原理的透視攝像機是常用的攝像機模型。然而,由於光柵化渲染中的幾何變換多基於四階方陣與齊次坐標表示的向量的乘法,而四階方陣只能表示仿射變換,無法實現透視攝像機“近大遠小”的特性(仿射變換維持平行線相互平行,而“近大遠小”不具有該性質),因此透視攝像機模型的實現要多費一番功夫。
1. 基本原理
小孔成像是大多數人所熟知的最簡單的成像原理之一,而常用的透視攝像機就是把小孔和屏幕(成像平面)的順序交換,維持相似關系不變,因而這一模型達到了擬真的效果而被廣泛應用。
小孔成像與簡單的透視攝像機模型
透視攝像機模型用在光柵化渲染管線的結果,就是透視投影過程。考慮簡圖——
圖中從e點(原點)發出的一條射線上所有在view plane之后的點都被投影到view plane與該射線的交點。由相似關系顯然有
這就得到了所需的映射關系:
顯然並非仿射變換,也就不能直接借助四階方陣乘法來實現。這時齊次坐標表示的另一個作用就表現出來了,設齊次坐標
表示點
,定義全體
的齊次坐標上的等價關系:
當且僅當
,則有
,該式的右邊正是常用的齊次坐標中點的表示方法(
)。這樣一來,這一等價關系為我們提供了“除法”的能力,也擴充了仿射變換的能力。注意到,仿射變換可以將
、
、
中的任意一個分量設置為
,而該方法允許這樣的變換形式——
注意到透視投影需要的變換是(假設viewing transform后攝像機面向+z方向)
這就是齊次坐標投影的基本原理。
2. 完整的投影矩陣推導
現實中使用的投影矩陣因為考慮了攝像機視截體,形式更加復雜。考慮下圖中的透視投影變換——
顯然該變換把近平面(near plane)區域投影到xOy平面上的單位正方形。在這里可以把該變換過程拆分成三個子過程:完成“透視”投影、把near plane上的視窗變換為單位正方形、把near plane的z坐標變換為0。第一個過程可以利用矩陣乘法:
其中n與f分別是視截體近平面與遠平面與原點的距離。的第三行有些特殊。它的作用是保持被投影到near plane上同一點的各點間的深度關系不變(這樣才能在稍后做depth test)。此外,由於
(齊次化過程),位於near plane上的點的
、
坐標都不會變化。
然后把near plane上的有效區域變換為單位正方形。假設near plane上有效區域的寬度為,高度為
,則一個簡單的scaling即可解決問題——
再把near plane挪到xOy平面上,一個平移就能解決問題;另外深度的變化范圍應該被固定在0~1之間。注意到
故只需要令
即可得
最后是一直沒有進行的齊次化過程,即
這就求得了所需的透視投影變換矩陣——
驗證一下:
滿足透視投影的要求。使用時,只需要將乘上待投影的坐標,再齊次化即可。
3. 其他
在一些別的條件/要求下,透視投影矩陣可能具有與此稍微不同的形式。譬如,OpenGL采用右手系,通常其viewing transform把坐標變換到camera space,其中camera是指向-z的(本例使用的是+z);此外,OpenGL中的z值被映射到-1~+1(本例使用的是0~1),但是,總體的推導思路是相同的。可以證明
是一個滿足這些要求的投影矩陣(這里,l、r、t、b是視截體近平面的左、右、上、下坐標,本例中沒有考慮這種不對稱的情況)。