【譯】計算機圖形學基礎第四版(7.1)

語言: CN / TW / HK

theme: fancy highlight: ascetic


持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第17天,點選檢視活動詳情

特別宣告

本文翻譯的是由Steve MarschnerPeter Shirley主要參與編寫的的第四版《計算機圖形學基礎》[英]。\ 版權歸原作者所有。

正文

## 7 檢視(Viewing) 在上一章中,我們看到了如何使用矩陣轉換作為在2D或3D空間中排列幾何物件的工具。幾何轉換的第二個重要用途是在3D世界的3D位置之間移動物件,在3D世界的2D檢視中。這個3D至2D對映稱為檢視轉換,它在物件訂購渲染中起著重要作用,在物件訂購渲染中,我們需要迅速找到場景中每個物件的影象空間位置。

當我們在第4章中研究射線跟蹤時,我們介紹了不同型別的透檢視和拼字檢視,以及如何根據任何給定的檢視生成觀看射線。本章是關於該過程的倒數的。在這裡,我們解釋瞭如何使用矩陣變換來表達任何平行或透視檢視。本章中的轉換專案3D點(世界空間)中的影象(影象空間)中的2D點,它們將在給定畫素的檢視射線上投射任何點,回到該畫素在影象空間中的位置。

如果您最近沒有看過它,建議在閱讀本章之前,請回顧第4章中對觀點和射線生成的討論。

就其本身而言,從世界到影象的指向點的能力僅適用於生成線框渲染 - 渲染僅繪製物件的邊緣,並且更緊密的表面不會閉塞更遙遠的表面(圖7.1)。就像射線示蹤劑需要找到沿每個觀看射線的最接近的表面交點一樣,顯示固體看起來物件的物件訂購渲染器也必須弄清楚在螢幕上任何給定點繪製的(可能是許多)表面中的哪個是最接近的(可能是許多)表面僅顯示那個。在本章中,我們假設我們正在繪製一個模型,該模型僅由3D線段組成,這些模型由其兩個端點的(x,y,z)座標指定。稍後的章節將討論生產實心表面渲染所需的機械。 image.png

7.1檢視轉換

檢視轉換的任務是將 3D 位置(表示為規範座標系中的 (x, y, z) 座標)對映到影象中的座標(以畫素為單位表示)。它是一種複雜的野獸,取決於許多不同的東西,包括相機的位置和方向、投影的型別、視野和影象的解析度。與所有複雜的轉換一樣,最好將其分解為幾個更簡單的轉換的產物。大多數圖形系統通過使用一系列三個轉換來做到這一點:

• 相機變換或眼睛變換,這是一種剛體變換,可將相機放置在原點的方便方向。它僅取決於相機的位置和方向或姿勢。

• 投影變換,它從相機空間投影點,使所有可見點在 x 和 y 中的範圍為 -1 到 1。它僅取決於所需的投影型別。

• 視口變換或視窗變換,將這個單點陣圖像矩形對映到畫素座標中所需的矩形。它僅取決於輸出影象的大小和位置

一些 API 使用“檢視轉換”只是我們稱為相機轉換的檢視轉換部分。

為了便於描述過程的各個階段(圖 7.2),我們為座標系命名,這些座標系是這些變換的輸入和輸出。

image.png

相機轉換將指標轉換為規範座標(或世界空間),以將相機座標或將它們放置在相機空間中。投影轉換將點從相機空間轉移到規範檢視卷。最後,視口轉換將規範檢視卷對映到螢幕空間。

這些轉換中的每一個都非常簡單。我們將詳細討論從視口轉換開始的拼字法案,然後介紹支援透視預測所需的更改。

其他名稱:相機空間也是“眼睛空間”,相機變換有時是“觀看變換”;規範檢視體積也是“剪輯空間”或“標準化裝置座標”;螢幕空間也是“畫素座標”。

7.1.1視口轉換

我們從一個問題開始,該問題的解決方案將在任何檢視條件下重複使用。 我們假設我們想要檢視的幾何圖形位於規範檢視體積中,並且我們希望使用朝 -z 方向看的正交相機來檢視它。 規範檢視體積是包含笛卡爾座標在 -1 和 1 之間的所有 3D 點的立方體,即 (x, y, z) ∈ [-1, 1]3(圖 7.3)。我們將 x = -1 投影到螢幕左側,x = 1 投影到螢幕右側,y = -1 投影到螢幕底部,y = 1 投影到螢幕頂部。

image.png

回憶第 3 章中畫素座標的約定:每個畫素“擁有”一個以整數座標為中心的單位正方形;影象邊界與畫素中心有半個單位的過沖;最小畫素中心座標為(0, 0)。如果我們正在繪製具有 nx x ny 畫素的影象(或螢幕上的視窗),我們需要將正方形 [−1, 1]2 對映到矩形 [−0.5, nx − 0.5] × [−0.5, ny - 0.5]。

“規範”這個詞再次出現——它意味著為了方便而任意選擇的東西。\ 例如,單位圓可以稱為“標準圓”。

現在,我們假設所有要繪製的線段都完全在規範檢視體積內。稍後我們會在討論剪裁時放寬這個假設。

將正方形對映到潛在的非正方形矩形不是問題; x 和 y 最終會得到從標準座標到畫素座標的不同比例因子。

由於視口變換將一個軸對齊的矩形對映到另一個,這是公式(6.6)給出的視窗變換的一種情況:

image.png

請注意,此矩陣忽略了規範檢視卷中點的z座標,因為沿投影方向的點的距離不會影響影象中的點何處。但是,在我們正式將其稱為檢視埠矩陣之前,我們添加了一個行和列以沿Z座標而不更改它。我們在本章中不需要它,但是最終我們將需要Z值,因為它們可以用來使更緊密的表面隱藏更遙遠的表面(請參閱第8.2.3節)。

image.png

7.1.2拼字圖投影轉換

當然,我們通常希望在標準檢視體積之外的空間區域中渲染幾何圖形。我們概括檢視的第一步將保持檢視方向和方向固定,沿 -z 方向看,y 向上,但允許檢視任意矩形。我們不會替換視口矩陣,而是通過將其與右側的另一個矩陣相乘來增加它。

在這些約束下,檢視體積是一個軸對齊的盒子,我們將命名它的邊座標,使得檢視體積為 [l, r] × [b, t] × [f,n]​​ 如圖所示7.4.我們將此框稱為正交檢視體積,並按如下方式引用邊界平面:

image.png

image.png

該詞彙假設一個觀眾,他的頭指向y方向。1這意味著n> f,這可能是不直覺的,但是如果您假設整個拼字圖檢視卷具有負z值。然後,僅當n> f時,z = n“近”平面就更靠近檢視器;這裡f的數量小於n,即絕對值的負數大於n。

這個概念如圖 7.5 所示。從正交檢視體積到規範檢視體積的變換是另一種視窗變換,因此我們可以簡單地將正交檢視和規範檢視體積的邊界代入方程(6.7)以獲得該變換的矩陣:

image.png

image.png

這個矩陣與 OpenGL 中傳統使用的矩陣非常接近,除了 n、f 和 zcanonical 的符號相反。

為了在正交檢視體積中繪製 3D 線段,我們將它們投影到螢幕 x 和 y 座標並忽略 z 座標。我們通過結合方程(7.2)和(7.3)來做到這一點。請注意,在程式中,我們將矩陣相乘以形成一個矩陣,然後按如下方式操作點:

image.png

z 座標現在位於 [−1, 1] 中。我們現在不利用這個,但是當我們檢查 z-buffer 演算法時它會很有用。

以 ai 和 bi 為端點繪製許多 3D 線的程式碼因此變得既簡單又高效:

image.png

這是矩陣變換機器如何使圖形程式簡潔高效的第一個示例。

7.1.3 相機變換

我們希望能夠在 3D 中改變視點並朝任何方向看。

有許多用於指定檢視器位置和方向的約定。我們將使用以下一個(見圖 7.6):

image.png

image.png

眼睛位置是眼睛“看到”的位置。如果您將圖形視為攝影過程,那麼它就是鏡頭的中心。凝視方向是觀察者正在觀看的方向上的任何向量。上視向量是平面中的任何向量,既將觀察者的頭部平分為左右兩半,又為站在地面上的人指向“天空”。這些向量為我們提供了足夠的資訊來建立一個以原點 e 和 uvw 為基礎的座標系,使用第 2.4.7 節的構造:

image.png

image.png

如果我們希望轉換的所有點都儲存在原點 e 和基向量 u、v 和 w 的座標中,我們的工作就完成了。但如圖 7.7 所示,模型的座標以標準(或世界)原點 o 和 x、y 和 z 軸的形式儲存。要使用我們已經開發的機器,我們只需要將我們希望繪製的線段端點的座標從 xyz 座標轉換為 uvw 座標。這種變換在 6.5 節中討論過,實現這種變換的矩陣是相機座標系的規範到基礎矩陣:

image.png

或者,我們可以將相同的轉換視為首先將 e 移動到原點,然後將 u、v、w 與 x、y、z 對齊。

為了使我們之前的僅 z 軸檢視演算法適用於具有任何位置和方向的相機,我們只需將此相機變換新增到視口和投影變換的乘積中,以便它將來自世界的傳入點轉換為相機座標在它們被預測之前:

image.png

同樣,一旦矩陣基礎設施到位,幾乎不需要任何程式碼。