3D 投影矩陣學習1

2021-10-25 18:50:10 字數 1686 閱讀 2645

先看一下名詞;

在矩陣數學中,也有乙個名詞叫投影矩陣,其定義為:

若矩陣a既是對稱矩陣,又是冪等矩陣,則稱a為投影矩陣。

這裡說的是3d世界中的投影矩陣;其作用是幫助把3d物體顯示在2維計算機平面。

什麼是投影

計算機顯示器是乙個二維表面,所以如果你想顯示三維影象,你需要一種方法把3d幾何體轉換成一種可作為二維影象渲染的形式。這就是投影做的。

最簡單情形,把3d物件投影到2d表面的方法是簡單的把每個座標點的z座標丟棄。這過於簡單,並且在大多數情況下不是有用。

在opengl或者directx中,在3d攝像機空間中的點需要對映到視錐體近裁剪面上(也就是投影面)才能在螢幕上看到。

投影公式將變換你的幾何體到乙個新的空間體中,稱為規範視域體(canonical view volume),規範視域體的精確座標可能在不同的圖形api之間互不相同,作為討論,把它認為是從(-1, -1, 0)延伸至(1, 1, 1)的盒子,這也是direct3d中使用的。

一旦所有頂點被對映到規範視域體,只有它們的x和y座標被用於對映到螢幕上。這並不代表z座標是無用的,它通常被深度緩衝用於可見度測試。這就是為什麼變換到乙個新的空間體中,而不是投影到乙個平面上。

左手座標系,攝像機俯視z軸正方向,y軸朝上並且x軸朝右。這是direct3d中使用的座標系。下面使用此座標系。對於右手座標系系統來說,在計算方面沒有明顯差異,在規範視域體方面有一點區別。

投影方法,最常見的2種:正交和透視。

正交投影(orthographic projection)

正交投影,之所以這麼稱呼是因為所有的投影線都與最終的繪圖表面垂直,是一種相對簡單的投影技術。

視域體,也就是包含所有你想顯示的幾何體的可視空間——是乙個將被變換到規範視域體的軸對齊盒子;

direct3d提供了d3dxmatrixorthooffcenterlh()()方法構造乙個正交投影矩陣;方法名中的"lh"代表了你正在使用左手座標系。

正交投影矩陣有乙個簡化形式。考慮幾點: 首先,在可見空間中,攝像機定位在原點並且沿著z軸方向**。第二,你通常希望你的視野在左右方向上延伸的同樣遠,並且在z軸的上下方向上也延伸的同樣遠。如果是這樣的情況,那麼z軸正好直接穿過你視域體的的中心,所以得到了r = -l並且t = -b。換句話說,你可以把r, l, t和b一起忘掉,簡單的把視域體定義為1個寬度w和1個高度h,以及裁剪面f和n。這樣將得到簡化的版本:

direct3d中d3dxmatrixortholh()方法實現簡單版本。

透視投影(perspective projection)

透視投影是稍複雜的一種投影方法,並且用的越來越平凡,因為它創造了距離感,因此會生成更逼真的影象。

從幾何上說,這種方法與正交投影不同的地方在於透視投影的視域體是乙個平截頭體——也就是,乙個截斷的金字塔,而不是乙個軸對稱盒子。

direct3d的d3dxmatrixperspectiveoffcenterlh()方法實現了透視投影公式。

direct3d的d3dxmatrixperspectivelh()方法生成簡化版本的矩陣。

看如下圖,正交和透視投影的示意;

乙個是直線(右邊),乙個是斜線;透視投影更真實些;

d3d 投影矩陣

這一節部落格 我將講述從乙個頂點從相機空間到到視平面的座標變化過程,理解這個過程座標值大小的範圍對於實現shadowmap,projectivetexture,pick技術來說至關重要。當然我還是省略掉大量詳細的推導過程,只是給出結果。如下面圖所示,紅色圈住的部分,就想下面的圖一樣 實際上d3d11...

3d點投影到2d螢幕,矩陣計算

最近在優化vibe輸出的3d關節點抖動問題。需要將3d點投影到2d螢幕上。3d點通過相機投影到2d螢幕上,通過一系列矩陣相乘可以求得。但是具體操作實現說明太少,本文用來記錄投影流程的實現。附python實現 3d 轉 2d 的流水線如下 世界座標系 相機座標系 投影矩陣 畫素對映 生成 世界座標系和...

Flash中的3D投影

ps 第一次翻譯的,錯的請指出。這裡我簡單的對3d投影做了解釋,首先我們看看3d完美運用的 url 最基礎的3d投影公式是 scale fl fl z 這裡我理解scale為投影比例 fl是焦點距離 也就是眼睛到螢幕的距離 z是物體在螢幕裡的深度 看看下面的剖面圖 img files beyondp...