構造投影矩陣/裁剪矩陣

來源:互聯網
上載者:User

 矩陣變化一般包含三部分,即wvp。此篇文章致力於講解P矩陣即投影裁剪矩陣構造過程中的一些原理。

在講解開始前,先瞭解一點。投影矩陣的作用是講視錐體裡的物體儲存下來,最終與視口相對應。過程大致為三步驟。第一,將視錐體進行投影處理,使之成為所謂的平行管道觀察體,可以理解為將視錐體轉換為一個長方體;第二,將得到的視錐體變為一個立方體,這個立方體三條邊最大不超過正負1。第三部就是將這個立方體中的內容與視口對應。我們所最終得到的矩陣其實僅僅能完成前兩步,而且必須是齊次化之後的值。

下面是攝像機的大致,可參考這幅圖進行抽象推理。

有了前面的大致流程之後,我們可以一步步得到我們想要的矩陣。首先構造一個投影矩陣。先來看下大致的投影原理:

此圖展示了大致的投影原理。途中z=d處為檢視平面。p為實際點(x,y,z,1),p‘為投影點。不難得出p’的座標為(dx/z,dy/z,d)。為了能夠用4*4矩陣進行轉換,我們可以按照矩陣乘法原理以及齊次原理推匯出投影在某一檢視平面上的投影矩陣,為下面矩陣

(1 0 0 0

    0 1 0 0

    0 0 1 1/d

    0 0 0 0)

當點乘以此矩陣後,得到一個思維齊次向量,除以第四維後即是三維空間的向量。

由此我們可以得到一個真正的其次投影矩陣。

例如:p‘乘以此矩陣後,就得到(x,y,z,z/d),然後全部除以z/d就得到了投影點的座標。

現在我們的目的是為了得到平行管道觀察體,不難發現,通過投影后,我們可以將x,y座標進行矩形化,但是,z投影后變為了統一座標,即最終投影結果為一平面,非是一個我們希望得到的長方體。這裡我們必須改變z軸的變化,不能讓它在站換後在一個平面上,這樣做將拋棄z軸的資訊,這個資訊在後續過程中有重要作用。故而我們應想辦法在x,y保持不變的情況下,改變z的變化。我們知道,我們最終的目的是得到一個立方體,而且我們知道立方體的邊長皆為2,最大最小值分別為1,-1。我們不妨在此時就將z值到達我們想要的值。我們知道單靠縮放z的值不可能達到這個目標,故而需要平移+縮放。不妨假設矩陣為以下格式:

(1 0 0 0

    0 1 0 0

    0 0 a 1

    0 0 b 0)

如此一來,可以看到az+b為乘法的值,這個值要滿足以下式子才能到達要求,即-1=<(az+b)/z<=1(opengl規定的,若是dx則是0~1),z的最大值為f,最小值為n,通過極值,最終求出a,b的值。

a=(f+n)/(f-n),b=(2nf)/(n-f)。

至此我們完成了到長方體的轉換。

補充:可能會感到奇怪,為什麼沒有設定檢視平面,而是直接是一。這裡面有兩個原因能解釋。第一,檢視平面在哪裡並不重要,因為那些物體最終呈現在檢視平面上是由視錐體決定的,而設定為1則計算起來很方便。第二,有資料上說,DX的檢視平面就是為1。

   

現在能進行第二個步驟,即獲得一個立方體。在DX裡仍舊是長方體。

由於z的值在投影矩陣裡已做過處理,這裡不在考慮,主要考慮X,y的縮放比例。我們知道,XY的縮放比例必須與視口比例一致,不然會出現展開的情況。所以這裡只需要知道視角或者縮放值就可以解決問題。一般情況下由使用者提供視角大小。下面就來看如何通過視角得到縮放比例。


由圖我們知道,目的是將x轉換到1,通過三角函數,x×toom=x×(1/tan(角度/2))=x×z/x=z,我們知道,z的值為檢視平面的值,所以z=1,所以toom為縮放值。toom=1/tan(角度/2)。按照比例可以通過x或者y的縮放值求得另外一個縮放值。

最後,我們降投影矩陣與縮放矩陣相乘就得到我們想要的矩陣來。

(1 0 0 0                                     (zoomx 0 0 0

    0 1 0 0                                     0 zoomy 0 0

    0 0 (f+n)/(f-n) 1           *            0 0 1 0

    0 0 2nf/(n-f) 0)                          0 0 0 1)

=(zooomx 0 0 0

    0 zoomy 0 0

    0 0 (f+n)/(f-n) 1

    0 0 2nf/(n-f) 0)   

這個是opengl裡的矩陣形式。dx僅僅是z軸的變化上的區別。前面提到過。

得出這個矩陣之後,然後除以第四維值,就得到了立方體。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.