關於 3D 模型的座標變換
物質
首先
您可能經常在電視螢幕上看到 3D 圖像,在遊戲中看到顯示器,但如何在 2D 螢幕上顯示存在於 3D 空間中的物件,例如在螢幕上移動的角色和建築物?
在 2D 遊戲中,只有 「X 和 Y」 的二維元素作為座標值,顯示也是 2D 的,所以如果你通過指定 X 和 Y 的座標位置來繪製一個物體,你會直觀地理解它將如何在哪個位置繪製。
然而,在 3D 中,這並不是那麼容易。 顧名思義,3D 是 “3 維” ,具有三個座標資訊:“X、Y 和 Z”。 由於座標與 2D 顯示不同,因此無法按原樣繪製物件。
那麼,要做的就是“把三維信息轉換成二維資訊”。 這通常稱為 「座標轉換」。 請記住,此座標轉換對於 3D 程式設計至關重要。
將 3D 轉換為 2D 的座標變換有多種類型,但程式師處理的座標變換主要有三種類型:“世界變換”、“視圖變換”和“投影變換”。 在這裡,我們將解釋與座標變換相關的所有內容。
左手和右手座標系
在 3D 中,有兩個座標系,即“左手座標系”和“右手座標系”,每個座標的方向不同,如下圖所示。
Direct3D 主要使用左手座標系,但也有用於計算右手座標系的函數。 但是,XNA 僅提供右手座標系的計算方法。 這似乎與其他應用程式經常使用右手座標系的事實一致。
此網站上的所有 XNA 提示都使用右手座標系。
局部座標系 (Model Coordinate System)
每個模型都有一個以原點為中心的座標系。 使用建模軟體創建模型時,我認為如果您想像以原點為中心創建模型,則更容易理解。
世界座標系
世界座標系允許您將模型放置在任何位置。 如果在此世界變換中不執行任何操作,則模型將以與本地座標相同的方式放置在原點處。 放置不僅要從原點移動,還要旋轉和縮放。
視圖座標系
將模型放置在世界座標中后,您需要有關您正在查看的位置以及您在 3D 空間中查看的位置的資訊。 這就是我們所說的 「視圖轉換」。 視圖變換通常表示為攝像機。
此轉換所需的參數是 「camera position」(攝像機位置)、“Camera point of interest”(攝像機目標點)和 “camera upward direction”(攝像機向上方向)。 相機的方向由這三個參數決定。 下圖顯示了第三方視角的攝像頭。
下圖實際上是從相機的角度看到的,上面圖所示的排列方式(此時我們還沒有將座標轉換到螢幕上,所以只是一個圖像)。
在前面的解釋中,看起來是相機定位,座標被變換,但在實際計算中,世界座標是根據相機的位置和方向進行轉換的。 因此,原點是相機的位置,如下圖所示。
投影座標系
確定從哪個位置查看 3D 空間後,下一步是處理“遠處的小物件”和“附近的大物件”的顯示。 這稱為投影變換。 投影變換有兩種方法,「透視投影」和“正交投影”,但常用的“透視投影”圖像如下。
透視投影使用以下參數:Viewing Angle、Aspect Ratio、Forward Clip Position 和 Rear Clip Position。 上圖中標記為 「frustum」 的區域最終將出現在螢幕上。
“Viewing Angle” 指定從攝像機可見的 view 範圍。 減小角度可放大,增加角度可縮小。 視角將是視錐體的垂直值。
縱橫比 用於確定水平視角,而視角是垂直角度。 水準角度通常由 「視角×縱橫比」 決定,縱橫比基本上是你要顯示的螢幕的 「寬 ÷ 高 」的值。 如果更改此值,則顯示的 3D 物件將顯示為水準或垂直拉伸。
指定 Forward Clip Position 和 Rear Clip Position 以確定對像是顯示在前部還是後部範圍內。 由於計算機的性質,不可能顯示到無窮大,因此我們將設置一個限制。 此值也會影響 Z 緩衝區的精度,因此不建議將其包含在繪圖區域中,超出不需要顯示的範圍。
透視變換的物件將轉換為如下所示的空間。 靠近攝像機的物件被放大,而遠離的對象被縮小。
這在下面的易於理解的圖表中進行了說明。
如果你真的從相機的角度來看,它看起來像下面。
投影變換的另一種方法是正交投影,它投影一個可見區域,如下所示。 由於寬度和高度是恆定的,而與深度無關,因此物件的大小不會隨深度而變化。
螢幕座標系
投影轉換后,它將轉換為實際螢幕的座標。 即使它是一個屏幕,顯示的位置和範圍也會根據設備上設置的視口設置而變化。 但是,在遊戲的情況下,視窗的用戶端座標通常是視區,因此我認為您無需太擔心。
螢幕的座標 (0, 0) 是從投影座標 (-1, 1, z) 轉換而來的。 同樣,螢幕座標 (width, height) 是從投影座標 (1, -1 ,z) 轉換而來的。