MME編寫入門(二)MVP矩陣、頂點坐標變換(可選)
關(guān)于矩陣的學(xué)習,涉及到線性代數(shù),所以可能會難一些。不過我覺得有看不懂的地方也沒關(guān)系,等后續(xù)的學(xué)習跟進,也許之前的問題就自然而然地化解了。某種意義上來說,會調(diào)用就行了。所以這篇當作可選的。

幾何圖形管線的第一個階段會將模型的頂點從其本地坐標系轉(zhuǎn)換到由場景中的所有對象使用的坐標系。 重新定位頂點的過程稱為世界轉(zhuǎn)換。 這種新方向通常稱為世界空間,世界空間中的每個頂點都使用世界坐標聲明。
在下一個階段,相對于相機確定描述你的 3D 世界的頂點的方向。 也就是說,應(yīng)用程序為場景選擇一個視點,世界空間坐標將重新定位并旋轉(zhuǎn)在相機視圖周圍,將世界空間轉(zhuǎn)換為相機空間。 這是視圖轉(zhuǎn)換。
下一階段是投影轉(zhuǎn)換。 在管道的這一部分,對象通常與觀眾的距離進行縮放,以便為場景提供深度的錯覺:關(guān)閉對象顯示為大于遙遠的對象,依此類之。 為簡單起見,將投影轉(zhuǎn)換后頂點所在的空間稱為投影空間。 (在一些圖形書籍中,可能會將投影空間稱為后透視齊性空間。) 并非所有投影轉(zhuǎn)換都會按比例縮放場景中對象的大小。 此類投影有時稱為仿射或正交投影。
在管線的最后一個部分中,將刪除屏幕上所有不可見的頂點,這樣一來,光柵器便無需花時間計算不可見項的顏色和著色。 此過程稱為剪裁。 在剪裁后,剩余頂點將根據(jù)視口參數(shù)進行縮放并轉(zhuǎn)換為屏幕坐標。 生成的頂點(光柵化場景時可在屏幕上看到)存在于屏幕空間中。
轉(zhuǎn)換用于將對象幾何圖形從一個坐標空間轉(zhuǎn)換到另一個坐標空間。
MVP矩陣分別是模型(Model),觀察(View),投影(Projection)三個矩陣。我們的頂點坐標起始于局部空間(Local Space),在這里它稱為局部坐標(Local Coordinate),它在之后會變?yōu)槭澜缱鴺耍╓orld Coordinate),觀察坐標(View Coordinate),裁剪坐標(Clip Coordinate),并最后以屏幕坐標(Screen Coordinate)的形式結(jié)束。
M矩陣 模型空間 → 世界空間的轉(zhuǎn)換矩陣
模型空間是以自身中心為原點的空間坐標系。
世界空間是以世界中心為原點的空間坐標系。
在不同的建模軟件或者游戲引擎中使用的坐標系是不一樣的。MMD是右手坐標系。


V矩陣 世界空間 → 視覺空間的轉(zhuǎn)換矩陣
視覺空間是以攝像機中心為原點的空間坐標系。
P矩陣 視覺空間 → 裁剪空間
判斷頂點是否在可見范圍內(nèi),若在可見范圍內(nèi)即渲染出來,若不在范圍內(nèi)則將該頂點剔除掉。

在MME中給出六種頂點坐標變換矩陣
頂點坐標變換使用的矩陣。坐標變換分為世界坐標系變換、 視圖變換和投影 變換。使用以下 6個語義將可以直接獲得對應(yīng)的變換矩陣 (類型是 float4x4)?
WORLD:世界坐標系變換矩陣
VIEW 視圖變換矩陣
PROJECTION 投影變換矩陣
WORLDVIEW 世界坐標系變換矩陣乘視圖變換矩陣
VIEWPROJECTION 視圖變換矩陣乘投影變換矩陣
WORLDVIEWPROJECTION 世界坐標系變換矩陣乘視圖變換矩陣乘投影變換矩陣
你可以在各個語義的末尾加上"INVERSE"來得到逆矩陣,如"WORLDINVERSE";你可以在各個語義的末尾加上"TRANSPOSE"來得到轉(zhuǎn)置矩陣,如 "WORLDTRANSPOSE";你可以在各個語義的末尾加上"INVERSETRANSPOSE"來得到轉(zhuǎn)置矩陣的逆矩陣。
(一寸長一寸強,WORLDVIEWPROJECTION簡稱MVP,將會是最常用的一個矩陣。)
(整理至此,我翻閱了很多博客文章。教程可能算不上,個人筆記吧。我是使用FlowUs寫的,有些部分不是很必要,我選擇性地刪了刪,把鏈接附在文下,上傳到b站專欄。FlowUs可以導(dǎo)出PDF版,等基本寫完了打包成PDF包,或許會更好。)
(管線的編寫本身并不難,但需要一定的理論去支撐,可能難就難在這些數(shù)學(xué)的理論上了。)
拓展閱讀
GAMES101-現(xiàn)代計算機圖形學(xué)入門-閆令琪 Lecture 03-04 Transformation
https://www.bilibili.com/video/BV1X7411F744
矩陣乘法是不滿足乘法交換律的。
一個三維場景中的各個模型一般需要各自建模,再通過坐標變換放到一個統(tǒng)一的世界空間的指定位置上。 這個過程在 3D 圖形學(xué)中稱作“世界變換” 。 世界變換有三種,平移、旋轉(zhuǎn)和縮放 。 這三種變換按各種順序執(zhí)行,結(jié)果是不同的。 實際的應(yīng)用中一般按照 縮放 -> 旋轉(zhuǎn) -> 平移的順序進行。 這樣做的原因是可以獲得最符合常理的變換結(jié)果。
https://blog.csdn.net/zsq306650083/article/details/50561857
KarlvonDonitz:為啥圖形學(xué)需要4x4的矩陣來表示三維的變換?
https://www.bilibili.com/read/cv200169
3×3的矩陣無法解決平移的問題,4×4的矩陣可以解決,使用后可以建立簡潔、統(tǒng)一的運算操作來處理所有變換。
詳細變化參考《Real-Time Rendering 4th Edition》全文翻譯 - 第4章 變換4.1-4.7
https://westriverlin.blog.csdn.net/article/details/105381222
轉(zhuǎn)換 (Direct3D 9)
https://learn.microsoft.com/zh-cn/windows/win32/direct3d9/transforms
線性代數(shù)的本質(zhì)