DirectX 11遊戲編程學習筆記之2: 第1章Vector Algebra(向量代數)

        本文由哈利_蜘蛛俠原創,轉載請註明出處!有問題歡迎聯繫[email protected]

 

        注:我給的電子版是700多頁,而實體書是800多頁,所以我在提到相關概念的時候,會使用章節號而非頁碼。同樣的情況適合於“龍書”第二版。

 

        我們這一期正式開始學習DX 11編程了!前三章組成了本書的第一部分,叫做“Mathematical Prerequisites”。學好這一部分是繼續前進的前提條件。這一部分的導言前面引用了一句名言,這讓我頗爲意外。這讓我想起了另外一本書,叫做《Problem Solving with C++》第7版;這本關於C++編程入門的書幾乎每一節前面都有(很多時候還特別長)一段引用語,很多都是來自文學作品的,讓人覺得很有趣。

        不過可惜的是,這種引用語此書好像就只出現了這一次……

        這一次將講述第1章:VectorAlgebra(向量代數)。這一章(以及後面的兩章)的內容很簡單,尤其是當你看過“龍書”第二版的時候;然而,還是有不少值得注意的地方的。

        由於作者本人可能比較懶,再加上很多內容並沒有發生實質性的改變(比如說這幾期要講的數學部分),所以讀過“龍書”第二版的人會覺得很多語句似曾相識。實際上並不是似曾相識,很多根本就是原話好吧!好啦,閒話不多說了,下面開始正題!

 

重點回顧

===============================================================================

   

        這一章是講向量代數的,相信讀過高中的人都能夠很容易理解(可能除了後面的代碼部分以外)。這一章也引進了XNA Math 庫,這是與“龍書”第二版不同的。當然我們仍然可以像在“龍書”第二版中那樣使用D3DX數學庫,不過這個XNA Math 庫更加有效率;況且,通過這樣引入新東西,Frank D. Luna給了我們一個當頭棒喝,讓我們從一開始就知道這本書和“龍書”第二版是很不一樣的。

        爲了方便,先把本章的學習目標列在這裏:

1、 To learn how vectors are represented geometricallyand numerically.(學會如何用幾何方法和數值方法表示向量。)

2、 To discover the operations defined onvectors and their geometric applications.(學習定義在向量上的運算,以及它們的幾何應用。)

3、 To become familiar with the XNA Mathlibrary’s vector functions and classes.(熟悉XNA Math庫的向量函數以及類。)

 

        這一章的內容,除開後面的代碼部分,大部分是和“龍書”第二版的第一章知識重合的。而且內容都很簡單,所以我就挑幾個不同的地方說一下。

 

1.3.1 Orthogonalization (正交化)

        這一小節中提到了Gram-Schmidt正交化方法,這在任何一本線性代數(或者高等代數)教材中都可以找得到。

 

1.4.1 Pseudo 2D Cross Product(僞2D叉積)

        其實這裏並沒有明確地提出這個概念(後面也沒有涉及),只是說一個2D向量u的僞叉積v與該向量平行。其實還應該加上一個條件,就是從u到v的叫是正角(不過如何定義一個角的正負,這還跟座標系的左右手性相關)。總體來說,這一小節是無足輕重的。

 

1.4.2 Orthogonalization with theCross Product(用叉積來正交化)

        這一小節也是“龍書”第二版所沒有的。這裏的內容比較簡單,是和1.3.1節並行的。不過與那一小節不同,那裏的Gram-Schmidt正交化方法是針對任意有限多個(線性無關的;不過此書並沒有講述這個線性代數中的概念,而且也不是一時半會兒能夠講清楚的,但是我想大家應該都學過這方面的知識了,應該很容易理解)向量進行的,而這一小節是針對3個線性無關的3D向量而提出的另外一種正交化方法。

 

1.6節XNA MathVectors(XNA Math向量)

        這是全新的一節了。這一節告訴我們,DX 11的D3DX庫不再有一個提供各種向量運算的數學庫了;相反,DX 11提供給我們的是XNA Math庫。在Windows 平臺上,XNA Math 庫使用SSE2(Streaming SIMD Extension 2)指令集。反正SIMD 可以用一個指令來完成對4個32位的浮點數或整數的操作。所以,用這個庫來做向量運算時是非常快的。不過值得注意的是,我們要將2D和3D向量先擴充成4D向量以便運用這種高效計算的技術。下面具體講述這一節的各個小節的重點內容:

 

1.6.1 Vector Types

        這一小節中,作者總結了下面五點:

1、 對局部變量和全局變量,使用XMVECTOR類型;

2、 對類的數據成員,使用XMFLOAT2, XMFLOAT3XMFLOAT4數據成員;

3、 在進行計算之前,使用載入函數(loading functions)來將XMFLOAT*類型轉換成XMVECTOR類型;

4、 XMVECTOR的實例進行計算;

5、 使用存儲函數(storage functions)來將XMVECTOR轉換成XMFLOAT*類型。

 

1.6.2 Loading and Storage Methods

        這一小節中,作者介紹了上面提到的載入和存儲函數。這裏面出現了FXMVECTOR類型的參數;不用擔心,下面就會進行解釋的。

 

1.6.3 Parameter Passing

        這一小節介紹了CXMVECTOR 和FXMVECTOR 這兩種參數類型,並告訴了我們在定義函數時,參數類型的注意事項:

函數的前三個XMVECTOR類型必須是FXMVECTOR,而後面的都是CXMVECTOR

 

1.6.4 Constant Vectors

        這一小節告訴我們,需要初始化的XMVECTOR常量應該定義爲XMVECTORF32類型(用於存儲浮點向量)或XMVECTORU32類型(用於存儲整數向量)。

 

1.6.5 Overloaded Operators

        這一小節介紹了很多XMVECTOR重載的運算符。這一節沒什麼好說的,不過你可以通過定義XM_NO_OPERATOR_OVERLOADS來取消這些重載。之所以會想到要取消這些重載,是因爲在複雜的計算中,取消重載可以提高性能。不過在此書中我們會一直使用這些重載運算符的(也就是說我們不會進行很複雜的計算)。

 

1.6.6 Miscellaneous

        不知道怎麼翻譯這個詞。這一小節告訴了我們一些跟圓周率有關的常數、在弧度制和角度制之間進行轉換的函數以及兩個取最大最小值的宏。

 

1.6.7 Setter Functions

        這一小節介紹了XNA Math庫提供的一些設置一個XMVECTOR變量的值的函數,並給出了一個簡單的控制檯程序來演示之。

 

1.6.8 Vector Functions

        這一小節介紹了一些做各種向量運算的函數,並給出了一個控制它程序來進行測試。這裏值得注意的有一點:所有的這些函數,如果返回值不是BOOL或者VOID的話,那麼必然是XMVECTOR,包括返回一個浮點值的點乘函數。

 

1.6.9 Floating-Point Error

        這一節講了比較著名的問題:用浮點數進行計算(甚至單純地表示)時,會出現誤差,所以等判斷相等時,需要定義一個容許誤差。然後作者寫了一個使用了XMVECTOR 的控制檯程序來驗證自己所說的。


        此外,“龍書”第二版1.5節就提到了座標變換,但是這本書第一章並沒有提到這樣的話題,而是放在第3章中講述。

===============================================================================

 

勘誤:

===============================================================================

1、  在1.6.2 小節中,作者給出了幾個函數,其中有的參數是FXMVECTOR類型的,但是這種語法在下一小節纔講到。初學者可能會感到困惑。作者應該在這裏提一下。   

   

===============================================================================

 

 

習題解答:

===============================================================================

   習題1-18:

        這些題目都很簡單,學過線性代數的同學都能夠很輕易地做出來,所以我就略過了。

 

習題19:

        這一題展示了一個使用了XMVECTOR 的控制檯程序,並讓我們猜測其中用到的XMVECTOR 函數的作用。大部分都很簡單,我就挑幾個說說吧!

XMVectorAbs(v)  ——返回一個向量,該向量的每個分量是v的對應分量的絕對值;

XMVectorCos(v)   ——返回一個向量,該向量的每個分量是v的對應分量的餘弦值;

XMVectorLog(v)   ——返回一個向量,該向量的每個分量是v的對應分量的以2爲底的對數值;

XMVectorExp(v)   ——返回一個向量(2^v[0],2^v[1], 2^v[2], 2^v[3]),其中2^x表示2的x次冪;

XMVectorPow(u, v)   ——返回一個向量(u[0]^v[0], u[1]^v[1],u[2]^v[2], u[3]^v[3]),其中x^y表示x的y次冪;

XMVectorSqrt(v)   ——返回一個向量,該向量的每個分量是v的對應分量的算術平方根;

XMVectorSwizzle(v,a, b, c, d)   ——返回一個向量(v[a],v[b], v[c], v[d]),至於a,b,c,d越出0,1,2,3這個範圍的話會發生什麼事情,請讀者自行研究;

XMVectorMultiply(u,v)   ——返回一個向量,該向量的每個分量是u的對應分量與v的對應分量的乘積;

XMVectorSaturate(v)     ——返回由v的各個分量進行saturate操作後得到的值組成的向量;saturate(x)返回0(若x<0),x(若0<=x<=1)或者1(x>1)。

===============================================================================

 

        好啦,這期就到這裏啦!下一期我們繼續學習第2章的內容。

 

        對了,原書的DVD附送了部分習題的解答,我就放在這裏了,歡迎大家下載!

部分習題答案下載地址

 

另外我把前三章的彩圖放在這裏了,大家可以看看:

前三章彩圖下載地址

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章