DirectX12 3D 遊戲開發與實戰第三章內容

#變換 ##學習目標函數

  1. 理解如何使用矩陣表示線性變換和仿射變換
  2. 學習對幾何體進行縮放、旋轉和平移的座標變換
  3. 根據矩陣之間的乘法運算性質,將多個變換矩陣合併爲一個單獨的淨變換矩陣
  4. 找尋不一樣座標系之間的座標轉換方法,並利用矩陣來表示此座標變換
  5. 熟悉DirectXMath庫中專門爲構建變換矩陣所提供的相關函數

##3.1線性變換性能

##3.1.1定義 若是有一個函數t可使學習

t(u + v) = t(u) + t(v)
t(ku) = tk(u)

成立,則函數t稱爲線性函數,也稱爲線性變換。其中u和v爲3D向量,k爲標量。(非3D向量也能夠做爲線性變換的輸入和輸出,不過在3D圖形學中咱們通常討論3D向量的線性變換)code

##3.1.2矩陣表示法(重點) 略()orm

##3.1.3縮放 縮放(比例變換)是指改變物體的大小,咱們通常把縮放定義對象

S(x,y,z) = (s1x,s2y,s3z)數學

s1,s2,s3分別表明S的三個份量io

此變換將相對於當前座標系中的原點,令向量在x,y,z軸上分別以係數s1,s2,s3進行縮放,S是一種線性變換,這裏不作證實form

  • 關於縮放變換 S的矩陣表示

S(i) = (s11,s20,s3*0);class

S(j) = (s10,s21,s3*0);

S(k) = (s10,s20,s3*1);

因此縮放矩陣S的矩陣表示爲

{
	s1,0,0,
	0,s2,0,
	0,0,s3
}

例子:若是要將一個正方形在x軸上縮小0.5,在y軸上方法2.0倍,在z軸上保持不變,能夠採用縮放矩陣S

{
	0.5,0,0,
	0,2,0,
	0,0,0
}

將該矩陣S分別與正方形的最小點座標、正方形的最大點座標相乘便可

##3.1.4旋轉 本節將用數學的方式來描述向量v繞軸n以角theta進行旋轉,咱們首先會將向量v分解爲兩部分,一部分平行於n,另外一部分正交於n,在旋轉的過程當中,平行於n的部分是保持不變的,因此咱們只須要考慮正交於n的部分。

推導過程:略

旋轉變換也是一種線性變換,因此也能夠轉換爲矩陣表示。旋轉變換的矩陣表示爲:

{
	c+(1-c)x^2	(1-c)xy + sz	(1-c)xz-sy
	(1-c)xy-sz	c+(1-c)y^2		(1-c)yz+sx
	(1-c)xz+sy	(1-c)yz-sx		c+(1-c)z^2
}

其中x,y,z表示旋轉軸n的(x,y,z),s和c分別表示sin(theta)和cos(theta)

例子:略

##3.2仿射變換

##3.2.1齊次座標 在下一節中咱們能夠看到,仿射變換是由一個線性變換和一個平移變換組合而成的,對於向量而言,平移操做使沒有意義的,由於向量只描述大小的方向,和位置無關。因此,平移操做只能應用於點(即位置向量)。在採用齊次座標所提供的表示機制中,咱們能夠方便地對點和向量進行統一的處理,在齊次座標中,座標將被擴充爲四元組,第四個座標的值將根據被描述對象是點仍是向量而定,具體來講

  1. (x,y,z,0)表示向量
  2. (x,y,z,1)表示點

##3.2.2仿射變換的定義及其矩陣表示 線性變換並不能表示出咱們須要的全部變換,所以咱們須要把它擴充爲一種稱爲仿射變換的映射範圍更廣的函數類,仿射變換爲一個線性變換+一個平移向量即

a(u) = t(u) + b

也能夠用矩陣表示法表示:

{
	A1	A2	A3	0
	A4	A5	A6	0
	A7	A8	A9	0
	Bx	By	Bz	1
}

其中An爲線性變換的矩陣表示,Bx,By,Bz爲平移向量b

##3.2.3平移 恆等變換是一種直接返回其輸入參數的線性變換,即t(u) = u;不難看出,線性變換t的矩陣表示爲單位矩陣。現將平移變換定義爲仿射變換,其中的線性變換便是一種恆等變換,因此平移變換的仿射公式爲

t(u) = uI + b = u + b

其中I爲單位矩陣。

平移變換的矩陣表達爲:

{
	1	0	0	0
	0	1	0	0
	0	0	1	0
	Bx	By	Bz	1
}

其中Bx,By,Bz分別爲平移向量b的各份量

##3.2.4縮放和旋轉的仿射矩陣 將縮放矩陣和旋轉矩陣擴充爲4x4矩陣,即將每個行向量的w值設爲0,同時加上平移向量b(0,0,0,1)便可

##仿射變換矩陣的幾何意義 略

##變換的複合(變換的組合) 問題:假設有一個縮放矩陣S,旋轉矩陣R,平移矩陣T,如今有一個由8個頂點構成的立方體,現想將這3中變換相繼應用到正方體的每個頂點上,則能夠

((Vi S) R) T		//其中Vi爲正方體的每個頂點

因爲矩陣乘法知足結合律,因此能夠令矩陣C = SRT;即提早將這3中變換封裝成一個淨變換矩陣,這樣便於咱們操做,同時也能夠提升性能

##3.4座標變換(座標系變換)

  • 在後續的學習中,咱們要面對不一樣的標架來轉換點或向量的座標,咱們把不一樣標架間的轉換稱之爲座標變換

  • 在座標變換的過程當中,幾何體自己並無發生變換,座標變換改變的只是物體的參考系。相比之下,咱們能夠認爲縮放,旋轉,平移這些操做才使幾何體發生了實質性的改變

  • 在計算機圖形學中,咱們會用到許多不一樣的座標系,所以須要瞭解他們之間相互轉換的方法,因爲位置是點的屬性,與向量無關,因此點和向量的座標轉換時不一樣的,下面咱們會分開來介紹。

##3.4.1向量的座標變換 思考:其中有一貫量p分別位於標架1和標架2中,設向量p在標架1中的座標爲P1 = (x,y,z);那如何求得向量p在標架2中的對應座標?

解答過程:略(主要應用平移的方法)

答案:P2 = xu + yv + zw

u,v,w分別表示指向標架1中x軸,y軸和z軸正方向上的單位向量(在標架2中進行表示)

##3.4.2點的座標變換 點與向量的座標變換有點不同,由於位置是點的一個重要屬性,於是不能把向量和點混爲一談,也不能簡單的把向量平移的方法應用到點上

解答過程:略

轉換公式:P2 = xu + yv + zw + Q

u,v,w分別表示指向標架1中x軸,y軸和z軸正方向上的單位向量(在標架2中進行表示),Q表示標架1中的原點在標架2中的座標

##3.4.3座標變換的矩陣表示 在上兩節中,咱們已經介紹了向量和點的座標變換

(x',y',z') = xu + yv + zw			//對於向量而言
(x',y',z') = xu + yv + zw + Q		//對於點而言

若是使用齊次座標,能夠將上面的兩個公式合併成一個公式,即:

(x',y',z',w) = xu + yv + zw + Q

在上面的座標變換公式中,若是w = 0;則表示向量,w = 1則表示點,這樣即可以只記憶一條公式了。上述公式的矩陣表示爲:

{
	u1	u2	u3	0
	v1	v2	v3	0
	w1	w2	w3	0
	Q1	Q2	Q3	1
}

此矩陣稱爲座標變換矩陣或標架變換矩陣

##3.4.4座標變換矩陣及其結合律 問題:假設有3個標架,分別爲一、二、3,且已知三個標架的標架變換矩陣分別爲A、B、C,在標架1中有一個向量的座標爲P,若是想要求出此向量在標架3中對應的座標,則能夠

(PB)C = p';

可是這樣的計算效率不高,由於矩陣的乘法知足結合律,因此咱們能夠令H = BC;而後可使用PH = P';即可以完成變換

##3.4.5座標變換矩陣及其逆矩陣 略

##3.5變換矩陣與座標變換矩陣 在前面的小結中,咱們強調了「使幾何體自己發生改變」的變換(縮放,旋轉和平移)和座標變換的區分,不過,在本節中,咱們將證實:從數學角度上來看,二者是等價的。

證實過程:略

##3.6DirectXMath庫提供的變換函數 本節咱們將對DirectXMath庫中和變換相關的函數進行總結,以便以之後進行參考。

//構建一個縮放矩陣
XMMATRIX XM_CALLCONV XMMatrixScaling(
	float ScaleX,		//縮放係數
	float ScaleY,		//縮放係數
	flaot ScaleZ		//縮放係數
)
//用一個3D向量中的份量來構建一個縮放矩陣
XMMATRIX XM_CALLCONV XMMatrixScalingFromVector(
	FXMVECTOR Scale;	//縮放係數(Sx,Sy,Sz)
);
//構建一個繞x軸旋轉的旋轉矩陣
XMMATRIX XM_CALLCONV XMMatrixRotationX(
	float Angle			//以順時間方向旋轉Angle弧度
);
//構建一個繞y軸旋轉的旋轉矩陣
XMMATRIX XM_CALLCONV XMMatrixRotationY(
	float Angle			//以順時間方向旋轉Angle弧度
);
//構建一個繞z軸旋轉的旋轉矩陣
XMMATRIX XM_CALLCONV XMMatrixRotationZ(
	float Angle			//以順時間方向旋轉Angle弧度
);
//構建一個繞任意軸旋轉的矩陣
XMMATRIX XM_CALLCONV XMMatrixRotationAxis(
	FXMVECTOR Axis,		//旋轉軸n
	float Angle			//沿n軸正方向看,以順時針方向按弧度Angle進行旋轉
);
//構建一個平移矩陣
XMMATRIX XM_CALLCONV XMMatrixTranslation(
	float OffsetX,		//平移係數 
	float OffsetY,		//平移係數
	float OffsetZ		//平移係數
);
//用一個3D向量中的份量來構建平移矩陣
XMMATRIX XM_CALLCONV XMMatrixTranslationFromVector(
	FXMVECTOR Offset	//平移係數(Sx,Sy,Sz)
);
//計算向量和矩陣的乘積VM,此函數默認w = 1;即針對點計算
XMVECTOR XM_CALLCONV XMVector3TransformCoord(
	FXMVECTOR V,		//輸入向量V
	CXMMATRIX M			//輸入矩陣M
);
//計算向量和矩陣的乘積VM,此函數默認w = 0;即針對向量計算
XMVECTOR XM_CALLCONV XMVector3TransformNormal(
	FXMVECTOR V,		//輸入向量V
	CXMMATRIX M			//輸入矩陣M
);

##小結 一、縮放、平移和旋轉這3種基礎操做的變換矩陣分別爲:

S = 
{
	Sx	0	0	0
	0	Sy	0	0
	0	0	Sz	0
	0	0	0	1
};

T = 
{
	1	0	0	0
	0	1	0	0
	0	0	1	0
	b1	b2	b3	1
};

R = 
{
	c+(1-c)x^2	(1-c)xy + sz	(1-c)xz-sy
	(1-c)xy-sz	c+(1-c)y^2		(1-c)yz+sx
	(1-c)xz+sy	(1-c)yz-sx		c+(1-c)z^2
}

二、在使用齊次座標表示變換時,咱們用1 x 4齊次座標來描述點和向量。當把第四個份量w設置爲0時,則表示向量,w = 1時,則表示點。這樣可使平移操做只應用於點,而不會影響向量

三、若是一個矩陣中所用的行向量都是單位長度並且兩兩正交,則該矩陣稱爲正交矩陣,正交矩陣的逆矩陣和轉置矩陣相等,正交矩陣對應的逆矩陣很容易計算。全部的旋轉矩陣都是正交矩陣

四、因爲矩陣的乘法運算知足結合律,因此咱們通常把若干種變換矩陣合併爲一個矩陣,這樣能夠提升運算效率

五、設Q,u,v,w分別表示標架1中的原點,x軸,y軸,z軸相對於標架2的座標,若是一個向量p在標架1中的對應座標爲(x,y,z),則該向量相對於標架2的座標爲

p' = xu + yv + zw;				//針對向量
p' = xu + yv + zw + Q;			//針對點(位置向量)

六、因爲矩陣的乘法運算知足結合律,因此對於多個標架之間的轉換,咱們能夠把多個標架變換矩陣合併成一個矩陣,能夠提升運算效率

七、若是矩陣A能夠將座標從標架1映射到標架2中,那麼A的逆矩陣能夠把座標從標架2映射到標架1中

相關文章
相關標籤/搜索