2009-01-28 73 views
15

所以,自從我寫了this question以來,已經過去了幾個月,從那以後我玩弄了「原始」C++ D3D,Ogre和Irrlicht圖形引擎以及最近的Microsoft XNA。我已經制作了一些2D遊戲(主要是像俄羅斯方塊,隕石等老東西的複製品),並在上述技術中爲3D世界做了一些(非常)小的步驟。我很少或沒有麻煩創建實際的遊戲邏輯,抽象掉對象的相互作用,讓我插入不同形式的控制(計算機,播放器,通過網絡等),做線程或任何其他的東西我習慣於從一天到一天的工作 - 這對我來說非常自然。對於HLSL和粒子效應(非常非常基本)我很少討論。 (這是真的需要和四元(?)在OGRE3D,?)學習遊戲編程(第2部分)(數學)

3D數學涉及向量和矩陣...真的打動了我,我可以按照實例(例如學習XNA 3.0的書我買了從O'Reilly,這是一本很棒的書btw),我明白爲什麼如何在這個例子中發生了一些事情,但是當我嘗試自己做一些事情時,我覺得我缺乏對這種類型數學的理解能夠真的得到它並讓它自己工作。

因此,我正在尋找有關學習3D數學(主要是)和一些Shader/Particle Effects書籍的資源。我更喜歡教育學的資源,並把它放在像矢量數學的醫生論文之上,這將是方式在我頭上。理想的資源將在D3D中展現出來。

回答

24

好的,快速當然在矩陣/向量的計算:

矩陣是在矩形網格有序相同的數字的集合:

[ 0, 1, 2 ] 
[ 2, 3, 5 ] 
[ 2, 1, 3 ] 
[ 0, 0, 1 ] 

上述矩陣具有4行和3列和因爲這是一個4×3矩陣。 矢量是具有1行(行向量)或1列(列向量)的矩陣。 正態數字稱爲標量與矩陣對比。

使用大寫字母表示矩陣,小寫字母表示標量也很常見。

我們可以用矩陣進行基本計算,但有一些條件。

加成

矩陣可以是當它們具有相同的尺寸來添加。所以2x2矩陣可以添加到2x2矩陣,但不能添加到3x5矩陣。

[ 1, 2 ] + [ 2, 5 ] = [ 3, 7 ] 
[ 2, 4 ] [ 0, 3 ] [ 2, 7 ] 

您可以看到通過添加在每個小區中的每個數被添加到數對其它基質的相同位置。

矩陣乘法

矩陣可以成倍增加,但這是一個比較複雜。爲了將矩陣A與矩陣B相乘,如果矩陣A與矩陣B中的每列相乘,則需要將每行中的數字相乘。這意味着如果將axb矩陣與acxd矩陣相乘,則b和c必須相等,並且結果矩陣是AXD:

[1,2,3] x [4,6] = [1x4+2x2+3x2, 1x6+2x1+3x3 ] = [4+4+6, 6+2+9 ] = [14, 20] 
[1,4,5] [2,1] [1x4+4x2+5x2, 1x6+4x1+5x3 ] [4+8+10, 6+4+15 ] [22, 25] 
      [2,3] 

正如你所看到的,與矩陣,A X B的B X A.不同

矩陣標量乘法

你可以乘以矩陣與標。在這種情況下,每個小區被乘以該號碼:

3 x [1,2] = [ 3, 6] 
    [4,7] [12,21] 

反轉矩陣 矩陣分割是不可能的,但是可以創建一個矩陣的反轉使得A X A-INV是一個矩陣與所有零除外主對角線的:

[ 1, 0, 0 ] 
[ 0, 1, 0 ] 
[ 0, 0, 1 ] 

反轉矩陣只能方陣來進行,這是一個複雜的工作一點不neccesary有一個結果。

開始矩陣A:

[ 1, 2, 3 ] 
A = [ 1, 3, 4 ] 
    [ 2, 5, 1 ] 

我們添加3個額外的列,並填寫他們與單位矩陣:

[ 1, 2, 3, 1, 0, 0 ] 
[ 1, 3, 4, 0, 1, 0 ] 
[ 2, 5, 1, 0, 0, 1 ] 

現在我們開始第一個列。我們需要從每一行中減去第一行,這樣第一列除第一行外只包含零。 爲了做到這一點,我們一旦從第二從第三減去第一行和兩次:

[ 1, 2, 3, 1, 0, 0 ] 
[ 0, 1, 1,-1, 1, 0 ] 
[ 0, 1,-5,-2, 0, 1 ] 

現在我們(從第三從第一行兩次,一次)重複此與第二列

[ 1, 0, 1, 3,-2, 0 ] 
[ 0, 1, 1,-1, 1, 0 ] 
[ 0, 0,-6,-1,-1, 1 ] 

對於第三欄,我們有一個小問題。樞紐數是-6而不是1。但是,我們可以通過整個行與-1/6相乘解決這個問題:

[ 1, 0, 1, 3, -2, 0 ] 
[ 0, 1, 1, -1, 1, 0 ] 
[ 0, 0, 1, 1/6, 1/6, -1/6 ] 

現在我們可以從第一和第二減去第三行:

[ 1, 0, 0, 17/6,-13/6, 1/6 ] 
[ 0, 1, 0, -7/6, 5/6, 1/6 ] 
[ 0, 0, 1, 1/6, 1/6, -1/6 ] 

好了,現在我們有A的逆:

[ 17/6,-13/6, 1/6 ] 
[ -7/6, 5/6, 1/6 ] 
[ 1/6, 1/6, -1/6 ] 

我們可以寫爲:

 [ 17,-13, 1 ] 
1/6 * [ -7, 5, 1 ] 
     [ 1, 1, -1 ] 



    [ 1, 2, 3 ] [ 17,-13, 1 ]    [ 6, 0, 0 ] [ 1, 0, 0 ] 
A = [ 1, 3, 4 ] x [ -7, 5, 1 ] x 1/6 = 1/6 x [ 0, 6, 0 ] = [ 0, 1, 0 ] 
    [ 2, 5, 1 ] [ 1, 1, -1 ]    [ 0, 0, 6 ] [ 0, 0, 1 ] 

希望這會有所幫助。

+2

「現在我們從第一列開始,我們需要從每一行中減去第一行,這樣第一列除第一行外只包含零,爲此我們從第二行減去第一行, 「從頭三次兩次:」頭痛! – jokoon 2010-09-27 21:38:23

1

對於載體而言,關於線性代數的介紹性文本或課程應該能夠讓您快速調整速度。

+0

你有任何文本推薦? – thr 2009-01-28 12:13:43

9

弗雷德裏克 - 簡短的回答是,是的,你必須學習矩陣和向量,因爲它們是3D工作的數學基礎。

雖然線性代數絕對不是博士水平的數學,它將需要一些工作。要開始使用,請在亞馬遜網站上查看this book:看起來它正是您要查找的內容。我還沒有讀過這本書(我在研究生中使用的那本書有點過時),但它的評價特別好。

另一件事:有各種3D建模引擎在市場上爲您做這項工作。其中最着名的可以說是Valve的Source Engine。你可以使用這款引擎(專爲HalfLife2 & CounterStrike製作)創建一些相當精密的遊戲,同時工作以上的等級的3D建模。實際上,Steam網絡上最受歡迎的遊戲之一Garry's mod最初只有一個人正在玩使用Steam Engine可以做的很酷的事情。這裏有一個link網站,提供使用源引擎構建自己的世界的教程,以防您感興趣。

+0

剛拿到這本書。這很好,我絕不是數學專家。我試圖瞭解很長一段時間的媒介,但失敗了。這本書幾乎立即讓我瞭解它們。 – Skurmedel 2009-07-17 22:57:21

2

Mathematics for Computer Graphics Applications」是一個入門級的教材,並採取了教室適當的方法來所有的基本數學的,你需要與3D編程相識(矩陣和主要載體)

和關於四元一張紙條:他們是非常有用某些應用程序。 SLERP(球形線性插入)可以非常方便地生成平滑/吸引人的相機移動(等等)。 SLERP對於矩陣來說是一種痛苦(昂貴的),但是對四元數來說便宜且容易。學會使用和愛他們 - 即使你沒有完全理解他們。

4

你絕對需要學習線性代數。麻省理工學院在YouTube上免費發佈全班。你可以從here開始。這並不難,相信我!玩得開心;)

+1

YT鏈接已損壞(私人視頻)是否有替代鏈接? – aikeru 2013-12-09 16:22:20