計算機圖形學中MVP變換的理論推導

計算機圖形學中MVP變換的理論推導

課程地址:Computing the Pixel Coordinates of a 3D Point

知識鋪墊:矩陣的真實內涵

矩陣的每一列/行(左乘和右乘的區別)代表了新坐標系的基向量在原基向量構成的坐標系中的坐標,這些新基向量(單位軸)構成新坐標系(用矩陣表示)

如果此時用這個矩陣乘一個向量,則向量中每個元素的含義是新坐標系中每個軸的對應分量,三個軸分量線性組合得到一個新坐標,這個坐標就是用這個新坐標系描述的
例如:矩陣A乘以向量d得到一個新向量f,矩陣A中的每一列代表用原坐標系(標準正交基)中的新向量作為新坐標系的基向量,向量d表示新坐標系中三個軸的對應分量,這些分量線性組合得到新向量f,整個過程可以描述為矩陣A將向量d變換到向量f



總之,矩陣的每一列或行元素代表在原坐標系 ( 1 , 0 , 0 ) 、 ( 0 , 1 , 0 ) 、 ( 0 , 0 , 1 ) (1,0,0)、(0,1,0)、(0,0,1) (1,0,0)(0,1,0)(0,0,1)中找三個正交向量作為新基向量(坐標系的軸),之后矩陣乘別的向量就是用這個新基向量線性組合得到新向量

世界坐標系

世界坐標系描述了一切,包括相機的位置、物體的頂點等等,為了能夠讓我們看見世界坐標系中的物體,我們就需要將世界坐標系中的頂點轉到相機視角下,這樣才能讓我們看到某個視角下的物體
我們假設世界坐標系為identity matrix,即
( 1 , 0 , 0 0 , 1 , 0 0 , 0 , 1 ) \begin{pmatrix} 1,0,0\\ 0,1,0\\ 0,0,1 \end{pmatrix} ?1,0,00,1,00,0,1? ?
我們可以定義一個模型,比如這里的立方體,我可以假想一個坐標系(原點(0,0,0)+三個互相垂直的軸),我可以在這個假想的坐標系中直接寫出立方體的每個頂點的坐標
p 1 = [ ? 0.5 , ? 0.5 , 0.5 ] p 2 = [ ? 0.5 , 0.5 , 0.5 ] p 3 = [ ? 0.5 , 0.5 , ? 0.5 ] … … p_1=[-0.5, -0.5, 0.5]\\ p_2=[-0.5, 0.5, 0.5]\\ p_3=[-0.5, 0.5, -0.5]\\ ~\\ …… p1?=[?0.5,?0.5,0.5]p2?=[?0.5,0.5,0.5]p3?=[?0.5,0.5,?0.5]?……
其實這些坐標都是我們在想象的一個空間坐標系(并非真的用代碼實現了一個坐標系)內描述的這些頂點,該坐標系原點為 [ 0 , 0 , 0 ] [0,0,0] [0,0,0],三個軸互相垂直

重點!!!務必理解,我們并非明確地變換坐標系;而是平移、縮放和旋轉對象(頂點)完成所謂坐標系的轉換。一個 4x4 矩陣表示這些變換,并且該矩陣可以被視為一個坐標系也就是說我們對這些頂點乘以一個變換矩陣就相當于換了一個坐標系

世界坐標系到相機坐標系的變換(相機外參矩陣)


相機外參矩陣的結構


每個相機的初始位置其實是與我們想象的“世界坐標系”重合的,我們需要將這些定義在世界坐標系的頂點乘以一個矩陣(本質是變換,看作一個新坐標系)轉換到用其他坐標系表示,這個矩陣就是world_to_camera矩陣(相機外參矩陣),這個矩陣的構成:

齊次坐標:在三維空間中,為了能用矩陣同時表示旋轉和平移,引入四維齊次坐標,將三維點 ( x , y , z ) (x,y,z) (x,y,z)表示為 ( x , y , z , 1 ) (x,y,z,1) (x,y,z,1)
矩陣結構:4×4 矩陣可分為兩部分:
左上 3×3 子矩陣 𝑅:表示旋轉,用于對齊世界坐標系的軸到相機坐標系的軸(即相機的方向基向量)
右上 3×1 向量 𝑡:表示平移,用于將世界原點“搬到”相機原點的位置(注意是逆變換,所以常帶負號)


將旋轉和平移整合到一個矩陣中就是這里所說的相機外參矩陣M

相機外參矩陣中的平移向量

相機外參矩陣中的旋轉矩陣

知識鋪墊:
旋轉一共三個自由度,繞 x , y , z x,y,z x,y,z旋轉,如果分別繞x、y、z軸旋轉可以得到三個方向上的旋轉矩陣 R x 、 R y 、 R z R_x、R_y、R_z Rx?Ry?Rz?,而相機外參矩陣中的旋轉矩陣是這三者的乘積
R = R x ? R y ? R z R=R_x*R_y*R_z R=Rx??Ry??Rz?
下圖來自:TEK5030 - Computer Vision

推導 R x 、 R y 、 R z R_x、R_y、R_z Rx?Ry?Rz?,頂點 P w P_w Pw?原先用坐標系 X w Y w Z w X_wY_wZ_w Xw?Yw?Zw?表示,現在用新坐標系 X c Y c Z c X_cY_cZ_c Xc?Yc?Zc?表示,也就是說頂點 P w P_w Pw?原先用坐標系 X w Y w Z w X_wY_wZ_w Xw?Yw?Zw?的三個基向量線性組合而成,現在想要用新坐標系 X c Y c Z c X_cY_cZ_c Xc?Yc?Zc?基向量線性組合表示頂點 P w P_w Pw?重新命名為 P c P_c Pc?
下圖來自:計算機視覺之— 相機內參與外參

相機外參矩陣中的旋轉矩陣是三個單純繞軸旋轉矩陣的乘積
R = R x ? R y ? R z R=R_x*R_y*R_z R=Rx??Ry??Rz?
先對世界坐標系描述的頂點做旋轉R,之后再進行平移 t 得到了用新坐標系(相機坐標系)描述的頂點

向量與點的區別
(1)向量(如基向量)只關心起點到終點的方向與長度,通常被視為從原點出發的箭頭;它們本身不附帶“起點位置”的信息。

(2)點 才有“坐標位置”,平移才會改變它。

旋轉(R):將世界坐標系的向量或點圍繞原點旋轉到相機坐標系方向。
平移(t):將旋轉后的點平移到相機中心位置。
向量 只經過旋轉,不經歷步驟 平移;
而 點 則經歷旋轉+平移,最終同時擁有新的方向和位置

世界坐標系與相機坐標系互轉的應用場景

(1)從相機坐標系轉到世界坐標系(相機外參矩陣的逆c2w)應用場景
在多視圖立體重建或 SLAM(同步定位與建圖)等應用中,每臺相機先以其自身坐標系表示重建出的三維點,為了融合這些不同相機獲得的數據,需要將它們變換到同一世界坐標系。
將來自多臺相機或多時刻的點統一到全球參照系,用于點云拼接、稠密建圖和地圖創建

三維模型點未知,僅知道模型在相機坐標系下點的坐標(模型的一部分點),這時候我們想要得到三維模型的所有點,就需要把每幀相機坐標系下的點都統一轉換到世界坐標系下

P w = P c ? M c 2 w P_w=P_c*M_{c2w} Pw?=Pc??Mc2w?
P w . x = P c . x ? M 00 + P c . y ? M 10 + P c . z ? M 20 + M 30 P w . y = P c . x ? M 01 + P c . y ? M 11 + P c . z ? M 21 + M 31 P w . z = P c . x ? M 02 + P c . y ? M 12 + P c . z ? M 22 + M 32 P_w.x=P_c.x*M_{00}+P_c.y*M_{10}+P_c.z*M_{20}+M_{30}\\ ~\\ P_w.y=P_c.x*M_{01}+P_c.y*M_{11}+P_c.z*M_{21}+M_{31}\\ ~\\ P_w.z=P_c.x*M_{02}+P_c.y*M_{12}+P_c.z*M_{22}+M_{32} Pw?.x=Pc?.x?M00?+Pc?.y?M10?+Pc?.z?M20?+M30??Pw?.y=Pc?.x?M01?+Pc?.y?M11?+Pc?.z?M21?+M31??Pw?.z=Pc?.x?M02?+Pc?.y?M12?+Pc?.z?M22?+M32?

(2)從世界坐標系轉到相機坐標系(相機外參矩陣w2c)應用場景

渲染、投影或相機標定(Camera Calibration)過程中,需要將已知的三維模型點映射到相機坐標系下,以便進一步投影到圖像平面

M w 2 c = M c 2 w ? 1 P c = P w ? M w 2 c M_{w2c}=M_{c2w}^{-1}\\ ~\\ P_c=P_w*M_{w2c} Mw2c?=Mc2w?1??Pc?=Pw??Mw2c?
P c . x = P w . x ? M 00 + P w . y ? M 10 + P w . z ? M 20 + M 30 P c . y = P w . x ? M 01 + P w . y ? M 11 + P w . z ? M 21 + M 31 P c . z = P w . x ? M 02 + P w . y ? M 12 + P w . z ? M 22 + M 32 P_c.x=P_w.x*M_{00}+P_w.y*M_{10}+P_w.z*M_{20}+M_{30}\\ ~\\ P_c.y=P_w.x*M_{01}+P_w.y*M_{11}+P_w.z*M_{21}+M_{31}\\ ~\\ P_c.z=P_w.x*M_{02}+P_w.y*M_{12}+P_w.z*M_{22}+M_{32} Pc?.x=Pw?.x?M00?+Pw?.y?M10?+Pw?.z?M20?+M30??Pc?.y=Pw?.x?M01?+Pw?.y?M11?+Pw?.z?M21?+M31??Pc?.z=Pw?.x?M02?+Pw?.y?M12?+Pw?.z?M22?+M32?

相機空間到裁剪空間(投影變換矩陣)


投影變換矩陣 = 透視投影 + 正交投影 投影變換矩陣=透視投影+正交投影 投影變換矩陣=透視投影+正交投影

在 OpenGL/DirectX 等渲染管線中,投影變換矩陣(GL_PROJECTION)把相機空間(View Space)頂點變換到裁剪空間(Clip Space)

( x c , y c , z c , w c ) ? > ( x c w c , y c w c , z c w c ) (x_c,y_c,z_c,w_c)->(\frac{x_c}{w_c},\frac{y_c}{w_c},\frac{z_c}{w_c}) (xc?,yc?,zc?,wc?)?>(wc?xc??,wc?yc??,wc?zc??)

1.應用視椎體裁剪(Frustum Clipping)參數(近裁剪面、遠裁剪面、左右上下邊界)
2.內置寬高比(Aspect Ratio)與視場角(FOV)
3.保留深度信息以便后續深度測試

投影變換矩陣 M perp M_{\text{perp}} Mperp?的推導過程:

相機視錐體如下圖所示

透視投影矩陣推導


利用變換前后的不變關系求解未知部分



由以上兩個等式關系求解方程組

由此得到透視投影(視錐體壓縮)矩陣 M perp->ortho M_{\text{perp->ortho}} Mperp->ortho?

正交投影矩陣推導

接下來推導正交投影矩陣(將長方體壓縮邊長為2的正方體)
即將長方體盒子 [ l , r ] × [ b , t ] × [ n , f ] [l,r]×[b,t]×[n,f] [l,r]×[b,t]×[n,f]壓縮到標準立方體 [ ? 1 , 1 ] 3 [-1,1]^3 [?1,1]3

第一步:把視錐盒子平移,讓視錐盒子(長方體)中心對齊到相機坐標系原點
注意:視錐盒子(長方體)做了平移


第二步:把長方體盒子壓縮到標準立方體
如果不把長方體盒子中心移動到相機坐標系原點而直接壓縮就不會得到標準立方體
注意z軸反向了


由此我們得到正交投影矩陣 M ortho M_{\text{ortho}} Mortho?


視錐體壓縮為長方體,為什么要將長方體中心移動到相機坐標系原點?長方體變為標準立方體,為什么要將z軸反向?
這樣做能保證線性變換中心對齊、方向一致,最終以簡潔統一的方式進行裁剪與插值。



視場角的作用
用于構建透視投影矩陣
在透視投影中,Fovy 和 Fovx 是計算投影矩陣的重要參數,具體過程如下:
1.假設已知近裁剪平面距離為 n,垂直視場角為 Fovy,則近裁剪平面的垂直高度 h = 2 n t a n ( F o v y 2 ) h=2n tan(\frac{Fovy}{2}) h=2ntan(2Fovy?)

2.結合畫面的寬高比 a s p e c t = w h aspect=\frac{w}{h} aspect=hw?(w為水平寬度),可以計算出近裁面的水平寬度 w = a s p e c t × h w=aspect×h w=aspect×h

3.這些尺寸參數(w、h、n)進一步用于推導透視投影矩陣的具體元素,確保三維場景按正確的透視關系(近大遠小)映射到二維屏幕。

同理,若給定水平視場角Fovx和近裁面距離n,可計算出水平寬度 w = 2 n t a n ( F o v x 2 ) w=2ntan(\frac{Fovx}{2}) w=2ntan(2Fovx?),再結合寬高比得到垂直高度 h = w a s p e c t h=\frac{w}{aspect} h=aspectw?




請添加圖片描述

相機坐標系中齊次坐標經過投影變換矩陣轉換到齊次裁剪空間

齊次裁剪空間到NDC空間

裁剪操作(齊次裁剪空間即單位立方體中執行)



透視除法

透視除法是計算機圖形學中實現真實感透視效果的核心機制,通過將頂點坐標除以其深度信息(存儲在 w 分量中),實現了近大遠小的視覺效果,并將坐標統一到標準化設備空間,為后續的視口變換和光柵化提供了基礎。這一步驟是透視投影矩陣與最終屏幕顯示之間的橋梁,直接決定了三維場景在二維屏幕上的呈現效果。




NDC空間到屏幕空間(視口變換)

在計算機圖形學中,視口變換(Viewport Transformation) 是圖形管線的最后階段,負責將標準化設備坐標(NDC)轉換為屏幕上的像素坐標。這一步驟決定了三維場景如何最終顯示在二維顯示器上
下圖來自:計算機圖形管線 13.視口變換



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80406.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80406.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80406.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

先說愛的人為什么先離開

2025年5月19日,15~23℃,賊好的一天,無事發生 待辦: 2024年稅務申報 《高等數學2》取消考試資格學生名單 《物理[2]》取消考試資格名單 5月24日、25日監考報名 《高等數學2》備課 《物理[2]》備課 職稱申報材料 教學技能大賽PPT 遇…

面試中的線程題

原文鏈接:線程題大全 Java 并發庫同步輔助類 CountDownLatch 工作機制:初始化一個計數器,此計數器的值表示需要等待的事件數量。 提供了兩個主要方法: await():當一個線程調用此方法時,它將阻塞&#…

Linux夢開始的地方

1.概率 經過C語言,數據結構,C的學習我們現在要開始學習Linux的學習了。我們學習Linux是從四部分來進行的: 1.Linux初識,Linux環境,Linux指令,Linux開發環境。 2.Linux系統。 3.Linux網絡 4.MySQL Lin…

“二維前綴和”算法原理及模板

在學習本篇內容前建議先學習一下“一維前綴和” 一維前綴和 算法https://blog.csdn.net/czt230610/article/details/148012923?fromshareblogdetail&sharetypeblogdetail&sharerId148012923&sharereferPC&sharesourceczt230610&sharefromfrom_link接下來…

軟件設計師CISC與RISC考點分析——求三連

一、考點分值占比與趨勢分析(CISC與RISC) 綜合知識分值統計表 年份考題數量分值分值占比考察重點2018111.33%指令特征對比2019111.33%控制器實現方式2020222.67%寄存器數量/流水線技術2021111.33%尋址方式對比2022222.67%指令復雜度/譯碼方式2023111.3…

順 序 表:數 據 存 儲 的 “ 有 序 陣 地 ”

順 序 表:數 據 存 儲 的 “ 有 序 陣 地 ” 線 性 表順 序 表 - - - 順 序 存 儲 結 構順 序 表 的 操 作 實 現代 碼 全 貌 與 功 能 介 紹順 序 表 的 功 能 說 明代 碼 效 果 展 示代 碼 詳 解SeqList.hSeqList.ctest.c 總 結 💻作 者 簡 介&#xf…

網絡安全深度解析:21種常見網站漏洞及防御指南

一、高危漏洞TOP 10 1. SQL注入(SQLi) 原理:通過構造惡意SQL語句突破系統過濾機制 典型場景: - 聯合查詢注入: union select 1,version(),3--+ - 布爾盲注:and (select substr(user(),1,1)=r) - 時間盲注:;if(now()=sysdate(),sleep(5),0)/ 防御方案: - 嚴格參數化查…

代碼上傳gitte倉庫

把代碼push上去就行

創建型:單例模式

目錄 1、核心思想 2、實現方式 2.1 餓漢式 2.2 懶漢式 2.3 枚舉(Enum) 3、關鍵注意事項 3.1 線程安全 3.2 反射攻擊 3.3 序列化與反序列化 3.4 克隆保護 4、適用場景 1、核心思想 目的:確保一個類僅有一個實例 功能:…

副業小程序YUERGS,從開發到變現

文章目錄 我為什么寫這個小程序網站轉小程序有什么坑有什么推廣渠道個人開發者如何變現簡單介紹YUERGS小程序給獨立開發者一點小建議 我為什么寫這個小程序 關注我的粉絲應該知道,我在碩士階段就已經掌握了小程序開發技能,并寫了一個名為“約球online”…

React路由(React學習筆記_09)

React路由 1,路由基礎 現代的前端應用大多都是SPA(單頁應用程序),也就是只有一個HTML頁面的應用程序。因為它的用戶體驗更好、對服務器的壓力更小,所以更受歡迎。為了有效的使用單個頁面來管理原來多個頁面的功能,前端路由應運而生。 1, 安裝…

2009-2025計算機408統考真題及解析

整理2009-2025 年計算機408統考真題及解析PDF 目錄樹: └── 2025考研計算機408統考真題及答案(回憶版).pdf ├── 2009-2024計算機408真題解析 │ ├── 2009年計算機408統考真題解析.pdf │ ├── 2010年計算機408統考真題解析.pdf …

Mysql、Oracle、Sql Server、達夢之間sql的差異

1&#xff1a;分頁查詢 Sql Server&#xff1a; <bind name"startRow" value"(page - 1) * limit 1"/> <bind name"endRow" value"page * limit"/> SELECT *FROM (SELECT ROW_NUMBER() OVER (<if test"sortZd!…

SQL Server 常用函數

一、字符串處理函數 1. CONCAT&#xff1a;拼接字符串 語法&#xff1a;CONCAT(string1, string2, ..., stringN) 實例&#xff1a; SELECT CONCAT(Hello, , World) AS Result; 輸出&#xff1a; Result ------------- Hello World 2. SUBSTRING&#xff1a;截取子字符串 …

【通用大模型】Serper API 詳解:搜索引擎數據獲取的核心工具

Serper API 詳解&#xff1a;搜索引擎數據獲取的核心工具 一、Serper API 的定義與核心功能二、技術架構與核心優勢2.1 技術實現原理2.2 對比傳統方案的突破性優勢 三、典型應用場景與代碼示例3.1 SEO 監控系統3.2 競品廣告分析 四、使用成本與配額策略五、開發者注意事項六、替…

ABP vNext 多租戶系統實現登錄頁自定義 Logo 的最佳實踐

&#x1f680; ABP vNext 多租戶系統實現登錄頁自定義 Logo 的最佳實踐 &#x1f9ed; 版本信息與運行環境 ABP Framework&#xff1a;v8.1.5.NET SDK&#xff1a;8.0數據庫&#xff1a;PostgreSQL&#xff08;支持 SQLServer、MySQL 等&#xff09;BLOB 存儲&#xff1a;本地…

FastDFS分布式文件系統架構學習(一)

FastDFS分布式文件系統架構學習 1. FastDFS簡介 FastDFS是一個開源的輕量級分布式文件系統&#xff0c;由淘寶資深架構師余慶設計并開發。它專為互聯網應用量身定制&#xff0c;特別適合以中小文件&#xff08;如圖片、文檔、音視頻等&#xff09;為載體的在線服務。FastDFS不…

基于單片機的防盜報警器設計與實現

標題:基于51單片機的防盜報警器設計 內容:1.摘要 本文圍繞基于51單片機的防盜報警器設計展開。背景在于現代社會安全需求不斷提高&#xff0c;傳統防盜方式存在諸多不足。目的是設計一款成本低、可靠性高且易于使用的防盜報警器。方法上&#xff0c;以51單片機為核心控制單元&…

IDE/IoT/搭建物聯網(LiteOS)集成開發環境,基于 LiteOS Studio + GCC + JLink

文章目錄 概述LiteOS Studio不推薦&#xff1f;安裝和使用手冊呢?HCIP實驗的源碼呢&#xff1f; 軟件和依賴安裝軟件下載軟件安裝插件安裝依賴工具-方案2依賴工具-方案1 工程配置打開或新建工程板卡配置組件配置編譯器配置-gcc工具鏈編譯器配置-Makefile腳本其他配置編譯完成 …

【高斯擬合最終篇】Levenberg-Marquardt(LM)算法

Levenberg-Marquardt(LM)算法是一種結合高斯-牛頓法和梯度下降法的優化方法,特別適合非線性最小二乘問題,如高斯函數擬合。它通過引入阻尼因子(damping factor)平衡高斯-牛頓法的快速收斂和梯度下降法的穩定性。以下是基于之前的 gaussian_fit.py,加入 LM 算法實現高斯擬…