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

來源:互聯網
上載者:User

標籤:

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

 

        註:我給的電子版是700多頁。而實體書是800多頁,所以我在提到相關概念的時候。會使用章節號而非頁碼。

相同的情況適合於“龍書”第二版。

 

        我們這一期正式開始學習DX 11編程了!

前三章組成了本書的第一部分。叫做“Mathematical Prerequisites”。學好這一部分是繼續前進的前提條件。這一部分的導言前面引用了一句名言,這讓我頗為意外。這讓我想起了另外一本書,叫做《Problem Solving with C++》第7版;這本關於C++編程入門的書差點兒每一節前面都有(非常多時候還特別長)一段引用語,非常多都是來自文學作品的,讓人認為非常有趣。

        只是可惜的是。這樣的引用語此書好像就僅僅出現了這一次……

        這一次將講述第1章:VectorAlgebra(向量代數)。

這一章(以及後面的兩章)的內容非常easy,尤其是當你看過“龍書”第二版的時候;然而,還是有不少值得注意的地方的。

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

 

重點回想

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

   

        這一章是講向量代數的。相信讀過高中的人都可以非常easy理解(可能除了後面的代碼部分以外)。這一章也引進了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庫的向量函數以及類。)

 

        這一章的內容。除開後面的代碼部分。大部分是和“龍書”第二版的第一章知識重合的。

並且內容都非常easy。所以我就挑幾個不同的地方說一下。

 

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正交化方法是針對隨意有限多個(線性無關的。只是此書並沒有講述這個線性代數中的概念,並且也不是一時半會兒可以講清楚的,可是我想大家應該都學過這方面的知識了,應該非常easy理解)向量進行的,而這一小節是針對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, XMFLOAT3和XMFLOAT4資料成員;

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:

        這些題目都非常easy,學過線性代數的同學都可以非常輕易地做出來。所以我就略過了。

 

習題19:

        這一題展示了一個使用了XMVECTOR 的控制台程式,並讓我們推測當中用到的XMVECTOR 函數的作用。

大部分都非常easy。我就挑幾個說說吧!

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附送了部分習題的解答,我就放在這裡了,歡迎大家下載!

部分習題答案

 

另外我把前三章的彩圖放在這裡了,大家能夠看看:

前三章彩圖

 

 

著作權聲明:本文博主原創文章。部落格,未經同意不得轉載。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.