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向量的線性變換)

3.1.2矩陣表示法(重點)

略()

3.1.3縮放

縮放(比例變換)是指改變物體的大小,我們一般把縮放定義

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

s1,s2,s3分別代表S的三個分量

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

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

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

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個標架,分別為1、2、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
);

小結

1、縮放、平移和旋轉這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
}

2、在使用齊次坐標表示變換時,我們用1 x 4齊次坐標來描述點和向量。當把第四個分量w設置為0時,則表示向量,w = 1時,則表示點。這樣可以使平移操作只應用於點,而不會影響向量

3、如果一個矩陣中所用的行向量都是單位長度而且兩兩正交,則該矩陣稱為正交矩陣,正交矩陣的逆矩陣和轉置矩陣相等,正交矩陣對應的逆矩陣很容易計算。所有的旋轉矩陣都是正交矩陣

4、由於矩陣的乘法運算滿足結合律,所以我們一般把若干種變換矩陣合並為一個矩陣,這樣可以提高運算效率

5、設Q,u,v,w分別表示標架1中的原點,x軸,y軸,z軸相對於標架2的坐標,如果一個向量p在標架1中的對應坐標為(x,y,z),則該向量相對於標架2的坐標為

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

6、由於矩陣的乘法運算滿足結合律,所以對於多個標架之間的轉換,我們可以把多個標架變換矩陣合並成一個矩陣,可以提高運算效率

7、如果矩陣A可以將坐標從標架1映射到標架2中,那么A的逆矩陣可以把坐標從標架2映射到標架1中


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM