3D 投影矩阵学习1
先看一下名詞;
在矩陣數(shù)學(xué)中,也有一個(gè)名詞叫投影矩陣,其定義為:
? ? 若矩陣A既是對(duì)稱矩陣,又是冪等矩陣,則稱A為投影矩陣。
這里說的是3D世界中的投影矩陣;其作用是幫助把3D物體顯示在2維計(jì)算機(jī)平面。
什么是投影
? ? 計(jì)算機(jī)顯示器是一個(gè)二維表面,所以如果你想顯示三維圖像,你需要一種方法把3D幾何體轉(zhuǎn)換成一種可作為二維圖像渲染的形式。這就是投影做的。
? ? 最簡(jiǎn)單情形,把3D對(duì)象投影到2D表面的方法是簡(jiǎn)單的把每個(gè)坐標(biāo)點(diǎn)的z坐標(biāo)丟棄。這過于簡(jiǎn)單,并且在大多數(shù)情況下不是有用。
? ? 在OpenGL或者DirectX中,在3D攝像機(jī)空間中的點(diǎn)需要映射到視錐體近裁剪面上(也就是投影面)才能在屏幕上看到。
? ? 投影公式將變換你的幾何體到一個(gè)新的空間體中,稱為規(guī)范視域體(canonical view volume),規(guī)范視域體的精確坐標(biāo)可能在不同的圖形API之間互不相同,作為討論,把它認(rèn)為是從(-1, -1, 0)延伸至(1, 1, 1)的盒子,這也是Direct3D中使用的。
? ? 一旦所有頂點(diǎn)被映射到規(guī)范視域體,只有它們的x和y坐標(biāo)被用于映射到屏幕上。這并不代表z坐標(biāo)是無用的,它通常被深度緩沖用于可見度測(cè)試。這就是為什么變換到一個(gè)新的空間體中,而不是投影到一個(gè)平面上。
? ? 左手坐標(biāo)系,攝像機(jī)俯視z軸正方向,y軸朝上并且x軸朝右。這是Direct3D中使用的坐標(biāo)系。下面使用此坐標(biāo)系。對(duì)于右手坐標(biāo)系系統(tǒng)來說,在計(jì)算方面沒有明顯差異,在規(guī)范視域體方面有一點(diǎn)區(qū)別。
? ? 投影方法,最常見的2種:正交和透視。
正交投影(Orthographic Projection)
? ? 正交投影,之所以這么稱呼是因?yàn)樗械耐队熬€都與最終的繪圖表面垂直,是一種相對(duì)簡(jiǎn)單的投影技術(shù)。
? ? 視域體,也就是包含所有你想顯示的幾何體的可視空間——是一個(gè)將被變換到規(guī)范視域體的軸對(duì)齊盒子;
? ? Direct3D提供了D3DXMatrixOrthoOffCenterLH()()方法構(gòu)造一個(gè)正交投影矩陣;方法名中的"LH"代表了你正在使用左手坐標(biāo)系。
? ? 正交投影矩陣有一個(gè)簡(jiǎn)化形式。考慮幾點(diǎn): 首先,在可見空間中,攝像機(jī)定位在原點(diǎn)并且沿著z軸方向觀看。第二,你通常希望你的視野在左右方向上延伸的同樣遠(yuǎn),并且在z軸的上下方向上也延伸的同樣遠(yuǎn)。如果是這樣的情況,那么z軸正好直接穿過你視域體的的中心,所以得到了r = -l并且t = -b。換句話說,你可以把r, l, t和b一起忘掉,簡(jiǎn)單的把視域體定義為1個(gè)寬度w和1個(gè)高度h,以及裁剪面f和n。這樣將得到簡(jiǎn)化的版本:
? ? ?
? ? Direct3D中D3DXMatrixOrthoLH()方法實(shí)現(xiàn)簡(jiǎn)單版本。
透視投影(Perspective Projection)
? ? 透視投影是稍復(fù)雜的一種投影方法,并且用的越來越平凡,因?yàn)樗鼊?chuàng)造了距離感,因此會(huì)生成更逼真的圖像。
? ? 從幾何上說,這種方法與正交投影不同的地方在于透視投影的視域體是一個(gè)平截頭體——也就是,一個(gè)截?cái)嗟慕鹱炙?#xff0c;而不是一個(gè)軸對(duì)稱盒子。
? ? Direct3D的D3DXMatrixPerspectiveOffCenterLH()方法實(shí)現(xiàn)了透視投影公式。
? ? Direct3D的D3DXMatrixPerspectiveLH()方法生成簡(jiǎn)化版本的矩陣。
?
看如下圖,正交和透視投影的示意;
一個(gè)是直線(右邊),一個(gè)是斜線;透視投影更真實(shí)些;
?
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的3D 投影矩阵学习1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win32汇编ListBox最简Demo
- 下一篇: 使用 Spring Boot CLI 运