1. 程式人生 > >Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 第三章:變換

Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 第三章:變換

學習目標

  1. 理解如何用矩陣表示線性變換和仿射變換;
  2. 學習在座標系中縮放,旋轉和移動幾何體;
  3. 學習利用矩陣的乘法合併幾個變換矩陣;
  4. 學習如何在座標系之間轉換,並且表示為轉換矩陣;斜體樣式
  5. 學習如何利用DirectX Math庫提供的方法構造轉換矩陣。


1 線性轉換


1.1 線性轉換的定義

現在有方程 τ ( v )

= τ ( x , y , z ) = τ
( x 1 , y 1 , z 1
) τ(v) = τ(x, y, z) = τ(x^1, y^1, z^1) ,當且僅當它滿足下列屬性的時候:
這裡寫圖片描述
我們稱它為一個線性變換。其中u和v是3D向量,k是標量。

例如定義 τ ( v ) = τ ( x , y , z ) = τ ( x 2 , y 2 , z 2 ) τ(v) = τ(x, y, z) = τ(x^2, y^2, z^2) ;τ(1, 2, 3) = (1, 4, 9);這個方程不是線性的,因為如果k = 2和u = (1, 2, 3):τ(ku) = τ(2, 4, 6) = (4, 16, 36),但是kτ(u) = 2(1, 4, 9) = (2, 8, 18)
所以不符合性質2,如果它是線性的,它應該符合:
這裡寫圖片描述


1.2 矩陣表示

令u = (x, y, z)我們可以把它寫成如下形式:
u = ( x , y , z ) = x i + y j + z k = x ( 1 , 0 , 0 ) + y ( 0 , 1 , 0 ) + z ( 0 , 0 , 1 ) u = (x, y, z) = xi + yj + zk = x(1, 0, 0) + y(0, 1, 0) + z(0, 0, 1)
其中向量i = (1, 0, 0), j = (0, 1, 0), k = (0, 0, 1),是座標系軸方向的單位向量,它們分別被稱為 R 3 R^3 的標準基本向量,現在令τ為一個線性變換,它具備下面性質:
這裡寫圖片描述
那麼它可以被寫成向量和矩陣相乘的形式:
這裡寫圖片描述
其中這裡寫圖片描述,我們稱矩陣A是線性變換τ的矩陣表現。


1.3 縮放

我們使用下面的公式來定義縮放:
S ( x , y , z ) = ( s x x , s y y , s z z ) S(x, y, z) = (s_xx, s_yy, s_zz)
它是物體在x軸方向縮放 s x s_x 倍,在y軸和z軸同理;我們現在要證明S 是一個線性轉換:
這裡寫圖片描述
為了得到矩陣表現,我們把S應用到每個標準基本向量中,然後把結果放到矩陣的每一行中:
這裡寫圖片描述
所以S的矩陣表現為:
這裡寫圖片描述
我們稱這個矩陣為縮放矩陣,其逆矩陣為:
這裡寫圖片描述


1.4 旋轉

這一節我們描述將一個向量V關於軸n旋轉θ角度;其中角度是當我們看向n軸時的順時針方向,並且||n|| = 1:
這裡寫圖片描述
首先將v分解為2部分:平行於n( p r o j n ( v ) proj_n(v) )和垂直於n( p e r p n ( v ) perp_n(v) );因為n是一個單位向量,所以 p r o j n ( v ) = ( n v ) n proj_n(v) = (n \cdot v)n ;值得注意的是 p r o j n ( v ) proj_n(v) 是平行於n的,它在旋轉的過程中不變,所以我們只需要關注垂直那部分如果旋轉,即旋轉向量的結果就等於: R n ( v ) = p r o j n ( v ) + R n ( p e r p n ( v ) ) R_n(v) = proj_n(v) + R_n(perp_n(v))

為了計算 R n ( p e r p n ( v ) ) R_n(perp_n(v)) ,我們在旋轉的平面上構建一個2D座標系,首先使用 p e r p n ( v ) perp_n(v) 為第一個引用向量,為了得到第二個引用向量,我們使用叉積得到一個同時垂直於v和n的向量 n × v n \times v ,根據之前第一章練習14證明的公式(α是n和v之間的夾角):
n × v = n v s i n a = v s i n a = p e r p n ( v ) ||n \times v|| = ||n||||v||sina = ||v||sina = |||perp_n(v)|
所以所有引用向量的長度都是一樣的,並且都是同一個園的半徑,現在我們可以建立起他們之間的聯絡,得到公式如下:
這裡寫圖片描述

進一步,可以得到旋轉公式:
這裡寫圖片描述

然後根據1.2中的公式,將上述線性變換轉成矩陣(其中c為cosθ,s為sinθ):
這裡寫圖片描述

旋轉矩陣有一個有趣的性質,它每一行的向量都是單位長度,並且互相垂直,所以它的行向量們是標準正交的;一個矩陣的行向量們標準正交的話,該矩陣稱為標準正交矩陣。標準正交矩陣有一個很吸引人的性質:它的逆矩陣等於它的轉置矩陣,所以:
這裡寫圖片描述
通常來說,標準正交矩陣是非常值得使用的,因為它的逆矩陣可以很簡單和高效的計算出來。

在特殊情況下,如果我們要圍繞x,y,z軸旋轉,我們可以得到下列矩陣:
這裡寫圖片描述



2 仿射變換


2.1 齊次座標系

在下一節中,我們將看到仿射變換其實是線性變換結合位移;位移不適用於向量,因為向量只表示方向和長度,其次座標系中提供了一個計數方法可以點和向量的變化一致:
1、使用(x, y, z, 0)表示向量(w = 0可以保證向量在變化中不進行位移);
2、使用(x, y, z, 0)表示點。


2.2 矩陣表示的定義

一個仿射變換是一個線性變化加一個位移變化:
a ( u ) = τ ( u ) + b a(u) = τ(u) + b
或者用矩陣表示:
這裡寫圖片描述
如果我們使用w = 1來擴充套件到齊次座標系,那麼可以使用更簡潔的寫法:
這裡寫圖片描述
這個4 x 4矩陣就是仿射變換的矩陣表示,如果是針對向量,不想做位移操作,只需要把第四行w設定為0即可。


2.3 位移

位移矩陣:
這裡寫圖片描述
位移矩陣的逆矩陣:
這裡寫圖片描述


2.4 仿射矩陣的縮放和旋轉

這裡寫圖片描述


2.5 仿射矩陣變換的幾何解釋

令τ是一個旋轉變換,b是一個平移變換,那麼這個變換就可以描述為一個仿射變換:
這裡寫圖片描述

用其次座標系(對於頂點w=1,對向量w=0)的矩陣表示為:
這裡寫圖片描述

我們可以看到τ只是旋轉了每一個標準分向量i,j和k;α(x, y, z) = xτ(i) + yτ(j) + zτ(k) + b,向量b只是平移了每一個頂點:
這裡寫圖片描述
這裡寫圖片描述

相同的思路也可以解釋縮放變換:
這裡寫圖片描述



3 變換的結合

假設S是一個縮放矩陣,R是一個旋轉矩陣,T是一個平移矩陣;如果我們要對一個具有8個頂點的立方體做如何變換,最顯而易見的方法是一步一步變換:
這裡寫圖片描述

因為矩陣的乘法具有結合律,所以:
這裡寫圖片描述
我們可以設C = SRT為一個同時封裝了3個變換的矩陣。



4 座標系變換

在3D計算機圖形學中,我們需要使用到多個座標系和座標系之間的變換,對於頂點和向量的座標系變幻是不同的。


4.1 向量

下圖中,有兩個座標系A和B,與一個向量P。
這裡寫圖片描述
很明顯 p = xu + yv,其中u和v是座標系A中,x和y方向上的單位向量;那麼 P B P_B 就可以解釋為 P B = x u B + y v B P_B = xu_B + yv_B ;所以,如果我們知道 u B = ( u x , u y ) u_B = (u_x, u_y)

相關推薦

Introduction to 3D Game Programming with DirectX 12 學習筆記 --- 變換

學習目標 理解如何用矩陣表示線性變換和仿射變換; 學習在座標系中縮放,旋轉和移動幾何體; 學習利用矩陣的乘法合併幾個變換矩陣; 學習如何在座標系之間轉換,並且表示為轉換矩陣;斜體樣式 學習如何利用DirectX Math庫提供的方法構造轉換矩陣。

Introduction to 3D Game Programming with DirectX 12 學習筆記 --- 在Direct3D中繪製(二)

程式碼工程地址: https://github.com/jiabaodan/Direct12BookReadingNotes 學習目標 理解本章中針對命令佇列的更新(不再需要每幀都flush命令佇列),提高效能; 理解其他兩種型別的根訊號引數型別:根描述

Introduction to 3D Game Programming with DirectX 12 學習筆記 --- 在Direct3D中繪製

程式碼工程地址: https://github.com/jiabaodan/Direct12BookReadingNotes 學習目標 熟悉Direct3D介面的定義,儲存和繪製幾何資料 ; 學習編寫基本的頂點和畫素著色器; 學習使用渲染流水線狀態

Introduction to 3D Game Programming with DirectX 12 學習筆記 --- 渲染流水線

學習目標 瞭解幾個用以表達真實場景的標誌和2D影象的深度空間; 學習在Direct3D中如何表示3D物體; 學習如何模擬虛擬攝像機; 理解渲染流水線:如何用幾何描述的3D場景渲染出2D影象; 1 3D幻覺 如何在2D平面(顯示器)上產生

Introduction to 3D Game Programming with DirectX 12 學習筆記 --- Direct 3D初始化

學習目標 對Direct 3D程式設計在3D硬體中扮演的角色有基本瞭解; 理解COM在Direct 3D中扮演的角色; 學習基本的圖形學概念,比如儲存2D影象、頁面切換,深度緩衝、多重紋理對映和CPU與GPU如何互動; 學習如何使用效能計數函式讀取高精度時間;

Introduction to 3D Game Programming with DirectX 12 學習筆記 --- 混合

程式碼工程地址: 學習目標 理解混合的工作原理和如何在D3D中使用它; 學習D3D支援的不同的混合模式; 學習Alpha元件是如何控制透明基元的; 學習如何通過HLSL的clip函式防止畫素被繪製到後置緩衝中。 1 混合方程 令CsrcC_{src

Introduction to 3D Game Programming with DirectX 12 學習筆記 --- 貼圖

multi edit wrap ber oda asc 每一個 兩張 chm 原文:Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 第九章:貼圖

Introduction to 3D Game Programming with DirectX 12 學習筆記 --- 十九法線貼圖

inverse 它的 dex matrix 情況 nor 內存 unit prism 原文:Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 第十九章:法線貼圖

Introduction to 3D Game Programming with DirectX 12 學習筆記 --- 十六實例化和截頭錐體裁切

srv 參數 linear clam 階段 res lease log multiple 原文:Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 第十六章:實例化和截頭錐體裁切

Introduction to 3D Game Programming with DirectX 12 學習筆記 --- 十七拾取

向上 學習目標 limit rgba mpi hidden param ever 遍歷 原文:Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 第十七章:拾取

Introduction to 3D Game Programming with DirectX 12 學習筆記 --- 十八立方體貼圖

byte position use nts ike 幾何 epo memory 調用 原文:Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 第十八章:立方體貼圖

Introduction to 3D Game Programming with DirectX 12 學習筆記 --- 十二幾何著色器(The Geometry Shader)

enable 中心 functions vector 是我 符號 ref rect 可能 原文:Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 第十二章:幾何著色器(The Geometry Sha

Introduction to 3D Game Programming with DirectX 12 學習筆記 --- 第二矩陣代數

學習目標: 理解矩陣和與它相關的運算; 理解矩陣的乘法如何被看成是線性組合; 理解單位矩陣、轉置矩陣、矩陣的行列式和逆矩陣; 熟悉DirectX Math庫中矩陣相關的類和函式; 1 矩陣的定義 一個m x n的矩陣M是一個有實陣列成的

Introduction to 3D Game Programming with DirectX 12 學習筆記 --- 第一向量代數

學習目標: 學習如何使用幾何學和數字描述 Vector; 學習 Vector 的運算方法及其在幾何學上的應用; 熟悉在 DirectXMath library 中的 Vector 相關的類和函式。 1 向量 一個向量代表的是一個擁有大小和方向

Introduction to 3D Game Programming with DirectX 12 學習筆記 --- 第二矩陣代數

bin 存在 present 文檔 spec 它的 height math.h defined 原文:Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 第二章:矩陣代數

Introduction to 3D Game Programming with DirectX 12 學習筆記 --- 第二十二四元數(QUATERNIONS)

directx height ebe beginning ++ tip osi 通過 假設 原文:Introduction to 3D Game Programming with DirectX 12 學習筆記之 --- 第二十二章:四元數(QUATERNIONS)

Chaptor 9 Blending (Introduction to 3D Game Programing with DirextX 11)自讀

9.1 THE BLENDING EQUATION image1 Csrc是這幀PS計算結果輸出,Cdest是當前back buffer計算結果(比如已經計算好的透明體背後的solid的color),Fsrc (source blend factor) and Fdst

韋東山嵌入式Linux學習筆記——128節 字元裝置驅動程式定時器防抖動

注:本文部分內容摘自《魚樹學員筆記》。 當按鍵按得比較快的時候,這裡出現了兩次中斷值,也即產生了抖動。 這裡產生了“抖動”,按鍵是機械開關,按下鬆開時裡面的金屬彈片可能抖動了好幾次。這種抖動產生了多次“脈衝”導致多次中斷。 方法: 使用定時器來防抖動。

3D Game Programming withDX11 學習筆記(一) 數學知識總結

表示 圖形 http 根據 轉置 元素 material -s com   在圖形學中,數學是不可或缺的一部分,所以本書最開始的部分就是數學知識的復習。在圖形學中,最常用的是矢量和矩陣,所以我根據前面三個章節的數學知識,總結一下數學知識。 一、矢量   數學中的矢量,擁有

Introduction to Random Forest Algorithm with Python

Using Neural Networks:Define the model :# Build a neural network :NN_model = Sequential()NN_model.add(Dense(128, input_dim = 68, activation='relu'))NN_mode