【转】图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵
轉自:圖形流水線中坐標變換詳解:模型矩陣、視角矩陣、投影矩陣_sherlockreal的博客-CSDN博客_視角矩陣
圖形流水線中坐標變換詳解:模型矩陣、視角矩陣、投影矩陣
- 圖形流水線中坐標變換過程
- 模型矩陣:模型局部坐標系和世界坐標系之間的橋梁
-
- 1.模型局部坐標系存在的意義
- 2.根據模型局部坐標系中點求其在世界坐標系中的坐標(Model_to_Wrold) or 根據世界坐標系的點求其在模型坐標系中的坐標(Wrold_to_Model)
- 3.結論:模型矩陣等于模型局部坐標系的矩陣表示法
- 視角矩陣:世界坐標系和視角坐標系(攝像機坐標系)直接的橋梁
-
- 1.視角坐標系如何構成
- 2.Camera_to_Wrold / World_to_Camera
- 3.結論:視角矩陣就是視角局部坐標系的矩陣表示法的逆矩陣
- 投影矩陣:3D to "2D"
-
- 1.CG中3D to "2D"原理:小孔成像
- 2.CG中模擬小孔成像與現實小孔成像的區別
- 3.區分image plane distace 和 near clipping plane distance 和 focal length
- 4.投影矩陣推導
- 窗口變換:渲染到輸出對象上
-
- 1.Resolution Gate and Film Gate Ratio
- 2.Resolution Gate and Film Gate Ratio don't match
本文重點介紹圖形流水線中出現的各種坐標系,以及實現在這些坐標系之間轉換的數學知識。希望能方便大家更加深入了解圖形學基礎,更好的學習圖形學。如果文章中有錯誤也請大家積極指正。文章的主要參考來源有:
1.Scratchapixel 2.0:Rendering an Image of a 3D Scene: an Overview
2.Scratchapixel 2.0:Computing the Pixel Coordinates of a 3D Point
3.深入探索透視投影變換
圖形流水線中坐標變換過程
模型矩陣:模型局部坐標系和世界坐標系之間的橋梁
1.模型局部坐標系存在的意義
簡單用一句話來說:方便建模人員。如果把“經緯度和高程”比作世界坐標系,那么“北京市海淀區學院路37號”就是模型局部坐標系下的一個坐標,而這個模型局部坐標系可以是“北京市”,也可以是“北京市海淀區”,甚至可以是“北京市海淀區學院路”。我們在CG中展現的各種各樣物體是很多建模人員努力的結果,我們無法規定一個統一的坐標系,讓所有物體都在這個坐標系上建模(一方面是考慮到單位精度,二是在模型局部坐標系下能更方便的描述模型的具體位置)。因此一般模型默認都是在模型坐標系下。
2.根據模型局部坐標系中點求其在世界坐標系中的坐標(Model_to_Wrold) or 根據世界坐標系的點求其在模型坐標系中的坐標(Wrold_to_Model)
那么如何從模型坐標系變換到世界坐標系呢,我們先給出一些默認參數,以及一些矩陣知識:
- CG中世界坐標系三個基底分別為e1(1,0,0), e2(0,1,0), e3(0,0,1),坐標系原點為O (0,0,0)
- 坐標系的矩陣表示法(行主序,以世界坐標系為例):
- 不同坐標系下坐標點相互轉換滿足:
P1?* M1?= P2?* M2
其中 M1為坐標系1的矩陣表示,P1為點P在坐標系1下的坐標表示;M2為坐標系2的矩陣表示,P2為點P在坐標系2下的坐標表示
根據上述,我們就可以求得模型局部點在世界坐標系下的表示。
假設世界坐標系矩陣表示為Mworld
模型坐標系矩陣表示為Mmodel
模型上點在世界坐標系下的表示為Pworld
模型上點在模型坐標系下的表示為Pmodel
則有:
Pworld?* MworldCoord?= Pmodel?* MmodelCoord
Pworld?= Pmodel?* MmodelCoord?* M-1worldCoord
由世界坐標系的特點知:MworldCoord?= I(單位矩陣)
所以:Pworld?= Pmodel?* MmodelCoord
反之,我們也可以從世界坐標反求得模型坐標
Pmodel?= Pworld?* M-1modelCoord
接下來我們來確定模型坐標系的矩陣表示:
假設模型坐標系為下圖所示的右上角坐標系,其基底在世界坐標系的表示分別為e1 (0.71, 0.61, -0.32), e2(-0.39, 0.74, 0.53), e3(0.57, -0.25, 0.77),原點在世界坐標系下的表示為 O (0.52, 1.25, -2.53)
則:
3.結論:模型矩陣等于模型局部坐標系的矩陣表示法
總結上述推論:
因為圖形流水線中模型矩陣的作用是將模型局部坐標變換為世界坐標系下的坐標
所以圖形流水線中的ModelMatrix = MmodelCoord。
即模型矩陣就是模型局部坐標系的矩陣表示法。
視角矩陣:世界坐標系和視角坐標系(攝像機坐標系)直接的橋梁
視角坐標系可以看做是一個模型坐標系。轉換方法與世界坐標系轉模型坐標系方法相同。
1.視角坐標系如何構成
視角也被稱為相機。我們在設定相機時,在必須設定的參數中,有三個參數與視角坐標系構成相關
- LookAt : 相機看向的地方, 用一個向量表示
- Up : 相機的“頭頂”,用一個向量表示
- Posiiton : 相機放置的地方
那么如何確定相機坐標系的基底呢?請看下圖
通過三步叉乘求得相機坐標系的基底:
- Z = cameraPosition - LookAtPostion
- X = up.Cross(Z)
- Y = Z.Cross(X)
知道了相機坐標系基底,知道了相機的位置。根據模型局部坐標系和世界坐標系之間的轉換我們可以很容易的推導出相機坐標系的矩陣表示法:
2.Camera_to_Wrold / World_to_Camera
同理根據模型局部坐標系和世界坐標系的相互轉換規則,我們可以列出下面的式子:
- Pview?* MviewCoord?= Pworld?* MworldCoord
- Pview?= Pworld?* MworldCoord?* M-1viewCoord
= Pworld?* M-1viewCoord - Pworld?= Pview?* MviewCoord
3.結論:視角矩陣就是視角局部坐標系的矩陣表示法的逆矩陣
因為圖形流水線中視角矩陣的作用是將世界坐標系坐標轉換為視角坐標系的坐標。
所以圖形流水線中的ViewMatrix = M-1viewCoord。
即視角矩陣就是視角局部坐標系的矩陣表示法的逆矩陣。
投影矩陣:3D to “2D”
1.CG中3D to "2D"原理:小孔成像
上圖很好的描述了小孔成像的原理。畫布(film)記錄了經過物體反射/折射等,并順利 通過光圈(aperture)的光線的顏色。
小孔成像中與成像結果相關的因素:
-
光圈(aperture)與小孔成像的關系
當光圈變大時,能夠“打到”film的光束更多。但這也意味著,在film上同一個點上,可能有多個光線同時擊中。或者反過來說,從觀察體上某點P發射出的光線,可能落在film的多個點上。
這樣導致的結果就是,光圈越大,成像會越模糊;光圈越小,成像越鋒利。
理想情況應該是光圈小到只允許一跟光線通過。但是在現實生活中這無法實現:首先是無法生產出這樣的光圈,其次是光具有波粒二象性。 -
景深與小孔成像的關系
景深規定了一個最近和最遠距離,只有在這個距離范圍內的物體才會鋒利顯示,在景深外的物體成像會模糊。而小孔成像的景深是無限的,所以只要光圈足夠小,小孔成像的結果總是鋒利的。 -
焦距(focal length)與小孔成像的關系
焦距在小孔成像中可以定義為光圈到film的距離。焦距對小孔成像的影響主要體現在焦距變化引起視角的變化:焦距越小,視角越大;焦距越大,視角越小。 -
畫布大小(film size)與小孔成像的關系
畫布大小也是通過影響視角大小來影響成像效果:畫布越大,視角越大;畫布越小,視角越小。
2.CG中模擬小孔成像與現實小孔成像的區別
- CG中光圈可以設置為只允許單根光線通過;CG中沒有光線用射線代替,不存在波粒二象性問題。且因為小孔成像景深是無限的。因此CG中Camera成像的結果一定是“鋒利”的。
- CG中為了大致模擬景深效果,會設置一個前后裁剪面(near / far clipping plane),在前后裁剪面之間的觀察體才能顯示,在外部的觀察體全部不顯示。
- 現實生活中film都在光圈的后面,因為要提供一個黑盒的環境,讓感光材質只接受通過光圈的光線。而CG中允許將film設置到光圈前,且這樣更方便成像(因為設置在光圈后的成像是上下顛倒的)。
- CG中eye即代表小孔成像中那個光圈,CG中視角由小孔成像中焦距和畫布大小確定。
3.區分image plane distance 和 near clipping plane distance 和 focal length
-
focal length 和 film size 都是小孔成像中的說法。在小孔成員原理中我們知道,兩者都可以改變視角的大小,以水平方向上視角為例,它們的關系為:
-
image plane可以放在相機Z負方向上的任何地方。它是作為CG中接收圖像的平面。image的大小是由視角和它與eye的距離來確定的。
-
前裁剪面,單純設定前可視范圍
-
這三個變量的定義在本質上是完全不相關的。不過在CG中,一般默認將image plane設置到near clipping plane處。
4.投影矩陣推導
以該圖為例進行推導:
上圖中求解a/b的方程列錯了 應該是
-(aN + b) = -N -(aF + b) = F 不過最終得到的a/b結果是正確的。請大家驗證。
窗口變換:渲染到輸出對象上
從規則化設備坐標變換到窗口上,需要考慮窗口的大小,以及窗口坐標原點的位置。以渲染為圖像為例,圖像的原點在左上角。
Ppixel.x = [ PNDC.x * Screen.Width ]
Ppixel.x = [ ( 1.0 - PNDC.y ) * Screen.Height ]
1.Resolution Gate and Film Gate Ratio
- Film Gate Ratio是指film的寬高比
- Resolution Gate Ratio是指窗口(Screen or Window)的寬高比
2.Resolution Gate and Film Gate Ratio don’t match
當Resolution Gate Ratio 與 Film Gate Ratio比例不一樣時,選擇哪個比例作為輸出會產生不一樣結果。因此一般3D建模軟件在渲染時,都會讓用戶選定按哪種比例進行渲染。
- Fill:用Resolution Gate Ratio的比例來渲染整個圖像
如果FGR > RGR: X方向需要乘上一個Scale; XScale = RGR / FGR ;
如果FGR < RGR:Y方向上乘上一個Scale: YScale = FGR / RGR ; - Overscan:用Film Gate Ratio的比例來渲染整個圖像
如果FGR > RGR: X方向需要乘上一個Scale; XScale = FGR / RGR ;
如果FGR < RGR:Y方向上乘上一個Scale: YScale = RGR / FGR ;
總結
以上是生活随笔為你收集整理的【转】图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 净值型理财的优势和缺点有哪些?一文了解清
- 下一篇: 光大银行小黄鸭信用卡怎么申请容易下卡