關於計算機圖形學的3d數學

三維座標系(3D Coordinate System)

三維座標是把二維的平面座標推廣到三維空間中,在三維座標中,點(x,y,z)的齊次座標爲(nx,ny,nz,n),其中n爲任意不爲0的數,規範化的齊次座標爲(x,y,z,1),與之相對應,三維變換的變換矩陣爲4×4矩陣。

在三維空間中,我們通常使用右手座標系(Right-Handed Coordinate System),因爲它符合數學上的習慣,而在計算機圖形學中,我們會使用左手座標系(Left-Handed Coordinate System),因爲它比較符合日常習慣。其實,我們可以任意的旋轉這些座標系,而圖形仍然保持不變。常見的座標系如下:

屏幕座標系:相對於顯示器的原點的2D座標系

本地座標系:相對於對象的原點的3D座標系

世界座標系:相對於3D世界的原點三維座標系

對齊(視點)座標系:世界座標系的變換,觀察者的位置在世界座標系的原點。

 

點(Point)

點是在某一個座標系中使用座標值指定的位置。因此,點到座標原點之間的距離與座標系的選擇有關。點P在座標系A中的座標爲(0,0,0),而在座標系B中的座標則爲(x,y,z)。

 

向量(Vector)

向量是指兩點的差值,具有大小和方向,即給定兩點,就能唯一確定一個向量,向量的大小和方向與座標系的選擇無關。向量V=(Vx,Vy,Vz)=P1P2=(x2-x1,y2-y1,z2-z1)其中,Vx,Vy和Vz分別爲向量V在x,y和z軸上的投影,稱爲向量V的x分量(x component),y分量(y component)和z分量(z component)。該向量的大小爲:

    向量V與x,y和z軸形成的方向角(Direction Angle):α,β和γ,其中cosα,cosβ和cosγ稱爲方向餘弦(Direction Cosine)。

  向量加法:V1+V2=(V1x+V2x,V1y+V2y,V1z+V2z)

  向量標量乘:aA=(aVx,aVy,aVz)

  向量標量積:V1·V2= V1x+V2x,V1y+V2y,V1z+V2z

向量積(叉積):V1×V2=(V1yV2z-V1zV1y,V1zV2x-V1xV2z,V1xV2y-V1yV2z)

            =|Ux Uy Uz|

|V1x V1y V1z|

                        |V2x V2y V2z|

注:其中Ux,Uy,Uz分別表示沿x軸,y軸和z軸的單位向量。在以後的編程中,我們經常會用到向量積。

 

矩陣(Matrix)

矩陣是由若干個數值構成的矩形陣列,這些數值通常爲實數,稱爲矩陣的元素。如果一個矩陣的行和列數相同,我們則稱該矩陣爲方陣(Square Matrix),而只有一行或者一列的矩陣用常用向量表示,例如:[x,y,z]稱爲行向量(Row Vector),

|x|

|y| 則稱爲列向量(Colume Vector)。

|z|

 

矩陣加法:|A11 A12 A13| |B11 B12 B13| | A11+ B11 A12+ B12 A13+ B13|

          |A21 A22 A23| + |B21 B22 B23| = | A21+ B21 A22+ B22 A23+ B23|

          |A31 A32 A33| |B31 B32 B33| | A31+ B31 A32+ B32 A33+ B33|

 

矩陣標量乘: |A11 A12 A13| |nA11 nA12 nA13|

            n|A21 A22 A23| = |nA21 nA22 nA23|

              |A31 A32 A33| |nA31 nA32 nA33|

 

矩陣的乘:

 

矩陣變換(Matrix Transform)

三維平移的矩陣表示爲:

[x`,y`,z`,1]=[x,y,z,1] | 1 0 0 0 |

| 0 1 0 0 |

| 0 0 1 0 |

| tx ty tz 1 |

 

三維縮放的矩陣表示爲:

[x`,y`,z`,1]=[x,y,z,1] | sz 0 0 0 |

| 0 sy 0 0 |

| 0 0 sx 0 |

| 0 0 0 1 |

   

繞x軸旋轉的矩陣表示爲:

        [x`,y`,z`,1]=[x,y,z,1] | 1   0   0   0 |

| 0 cosα sinα 0 |

| 0 -sinα cosα 0 |

| 0   0   0   1 |

   

繞y軸旋轉的矩陣表示爲:

        [x`,y`,z`,1]=[x,y,z,1] | cosα 0 -sinα 0 |

| 0   1   0   0 |

| sinα   0 cosα 0 |

| 0   0   0   1 |

 

繞z軸旋轉的矩陣表示爲:

        [x`,y`,z`,1]=[x,y,z,1] | cosα sinα 0 0 |

| -sinα cosα 0 0 |

|   0     0   1 0 |

|   0     0   0 1 |

 

反射(Reflection)

    反射變換也稱爲對稱(Symmetric)變換或鏡像(Mirror Image)變換,三維反射變換可以相對於反射軸(Reflection Axis)進行,也可以相對於反射平面進行。相對於反射軸的三維反射變換是通過將圖形繞反射軸旋轉180°來實現的。

    相對於xy平面的反射變換矩陣爲:

        | 1 0 0 0 |

        | 0 1 0 0 |

        | 0 0 1 0 |

        | 0 0 0 1 |

 

    相對於yz平面的反射變換矩陣爲:

        |-1 0 0 0 |

        | 0 1 0 0 |

        | 0 0 1 0 |

        | 0 0 0 1 |

 

    相對於zx平面的反射變換矩陣爲:

        | 1 0 0 0 |

        | 0 -1 0 0 |

        | 0 0 1 0 |

        | 0 0 0 1 |

 

錯切(Shear)

    錯切變換會改變圖形的形狀。

    相對於x軸的錯切變換矩陣爲:

        | 1 0   0   0 |

        | shY 1   0   0 |

        | shz 0   1   0 |

        | 0 0   0   1 |

 

    相對於y軸的錯切變換矩陣爲:

        | 1 shX 0   0 |

        | 0   1   0   0 |

        | 0 shz 1   0 |

        | 0   0   0   1 |

 

    相對於z軸的錯切變換矩陣爲:

| 1 0 shX 0 |

        | 0 1 shY 0 |

        | 0 0   1   0 |

        | 0 0   0   1 |

 

從簡單的平移、縮放和旋轉等可以延伸到複合平移、複合縮放、複合旋轉、固定點縮放等概念,這些就要靠讀者自己查閱資料了,在這裏我就不多講了。

 

三維轉換(3D Transform)

最常見的轉換有以下三種類型:

1、世界座標系轉換:通過這種轉換方式,可以改變3D物體的位置、大小、角度等等。就是改變3D世界中的物體位置相關的特性;

2、透視轉換:透視轉換決定了三維場景如何透視到二維平面上。包括觀察三維世界攝象機鏡頭的觀察範圍等屬性;

3、觀察座標系轉換:這種轉換方式決定了三維世界中觀察者的位置,觀察方向等屬性。

 

投影變換(Projection Transformation)

    投影變換就是將維數爲n的點變換成維數小於n的點。我們會用到的就是將三維空間中的點變換成二維平面上的點。要對三維物體進行投影變換,首先要在三維空間中選擇一個點,稱爲投影中心(Center of Projection);再定義一個不經過投影中心的平面,稱爲投影平面(Projection Plane);從投影中心向物體的沒一點引射線,這些射線稱爲投影線(Projection Ray),投影線與投影平面的交點集合就稱爲三維物體在二維投影平面上的投影。

    投影可以分爲兩大類,即透視投影(Perspective Projection)和平行投影(Parallel Projection);如果投影中心到投影平面的距離是有限的,那麼投影線是從投影中心發出的無數條射線,這種投影稱爲透視投影;如果投影中心到投影平面的距離越來越遠,那麼投影線就越來越趨於平行,當投影中心到投影平面的距離爲無窮遠的時候,投影線爲一組平行線,這種投影稱爲平行投影。

 

透視投影(Perspective Projection)

    設投影中心爲PC(XC,YC,ZC),投影平面爲Z=ZP平面(ZP≠ZC),即投影平面平行與xy平面(垂直於z軸)並且不經過投影中心,三維空間中的點P(x,y,z)在投影平面上的透視投影爲點PP(XP,YP,ZP)。

則透視投影矩陣爲:

|ZP-ZC   0   XC   -XCZP |

| 0   ZP-ZC YC   -YCZP |

| 0     0   ZP   -ZCZP |

| 0     0   1     -ZC |

 

    如果投影中心PC在座標原點,投影平面仍然是Z=ZP平面,即XC=YC=ZC=0,那麼透視投影矩陣變成:

        | 1   0   0   0 |

| 0   1   0   0 |

| 0   0   1   0 |

| 0   0   1/zP   0 |

 

    如果投影中心PC在z軸上,投影平面是xy平面,即XC=YC=0,那麼透視投影矩陣變成:

| 1   0   0   0 |

| 0   1   0   0 |

| 0   0   0   0 |

| 0   0 -1/zP   1 |

 

    對於三維空間中任意一組平行線來說,如果它們平行於投影平面,那麼它們的透視投影仍然保持平行;如果他們不平行於投影平面,那麼它們的透視投影不再保持平行,並且會匯聚到一個點,該點稱爲滅點(Vanishing Point);平行於座標軸的一組平行線形成的滅點稱爲主滅點(Principal Vanishing Point)或軸滅點(Axis Vanishing Point)。透視投影的主滅點的數目等於與投影平面相交的座標軸的數目,而三維空間中的任意投影平面最少與一個座標軸相交,最多與x,y,z三個座標軸都相交,所以主滅點的數目最少爲1個,最多爲3個。根據主滅點的數目,我們可以將透視投影分爲三類,即一點透視、二點透視和三點透視。

    如果投影平面只與一個座標軸相交,與另外兩個座標軸平行,那麼透視投影只形成一個主滅點,稱爲一點透視。

 

    如果投影平面與兩個座標軸相交,與剩下的一個座標軸平行,那麼透視投影形成兩個主滅點,稱爲二點透視。二點透視比一點透視具有更強的真實感,被廣泛地應用於建築、工程、廣告等領域。

 

平行投影(Parallel Projection)

    根據投影方向的不同,我們可以把平行投影分爲兩類:如果投影方向與投影平面垂直,既投影方向與投影平面法向量的方向相同,那麼這種投影稱爲正平行投影(Orthographic Parallel Projection),簡稱爲正投影;如果投影方向與投影平面斜交,那麼這種投影稱爲斜平行投影(Ohlique Parallel Projection),簡稱爲斜投影。

1、 正投影

正投影經常用於產生物體的三視圖。因爲三視圖能準確地反映物體的長度和角度。三視圖是指投影方向分別取作x軸、y軸和z軸方向,投影平面分別垂直於x軸、y軸和z軸事的正投影,產生的視圖分別成爲前視圖(Front View)、側視圖(Side View)和頂視圖(Top View)。產生三視圖的投影矩陣分別爲:

Mfront= | 0 0 0 0 |

        | 0 1 0 0 |

        | 0 0 1 0 |

        | 0 0 0 1 |

 

Mside= | 1 0 0 0 |

        | 0 0 0 0 |

        | 0 0 1 0 |

        | 0 0 0 1 |

 

Mtop= | 1 0 0 0 |

        | 0 1 0 0 |

        | 0 0 0 0 |

        | 0 0 0 1 |

當投影方向不取座標軸方向,投影平面不垂直於座標軸時,產生的正投影稱爲軸測正投影(Axonometric Orthographic Projection)。軸測正投影又分爲正等測(Isimetric Projection)、正二測和正三測三種。當投影平面與三個座標軸的交點到座標原點的距離都相等時爲正等測,也稱爲等軸測;當投影平面與兩個座標軸的交點到座標原點的距離相等時爲正二測;當投影平面與三個座標軸的交點到座標原點的距離都不相等時爲正三測。

在這三種軸測正投影中,正等測應用最爲廣泛。由於正等測的投影平面與三個座標軸的焦點到座標原點的距離都相等,因此投影方向(即投影平面的法向量)與三個座標軸的夾角也相等。

 

2、 斜投影

投影方向與投影平面斜交的平行投影稱爲斜投影。假設投影平面爲Z=ZP平面,投影方向爲(XD,YD,ZD)(ZD≠0),三維空間中的點P(x,y,z)在投影平面上的斜投影爲點PP(xP,yP,zP)。則斜投影矩陣爲:

          | ZD   0   -XD   XDZP |

          | 0   ZD -YD   YDZP |

          | 0   0   0   ZDZP |

          | 0   0   0   ZD |

如果投影平面爲z=0平面,即ZP=0,那麼斜投影矩陣變成:

          | 1   0 -XD/ZD   0 |

          | 0   1 -YD/ZD   0 |

          | 0   0   0     0 |

          | 0   0   0     1 |

 

總結(Conclusion)

    上面所提到的知識,都是我們平時編程時經常會用到的,可能還有些知識沒提到,只好靠自己翻翻線形代數書了。如果對上面知識有什麼不懂的和錯誤的,可以跟我討論。如果你有基礎知識,把這些理論用於實踐應該是很輕鬆的事,如果你沒有基礎知識,也沒什麼大不了的,可以先看看關於OpenGL的書入門。這樣上手會快一些。另外,上面的內存可能存在一些格式問題,請大家諒解。
 =======================================

我說這位老兄啊,你的4×4距陣對是對啊,就是格式沒對齊啊,

看完眼睛都碎了啊~~

 

 

 

 


 3D初等數學
1.點乘:
兩向量相乘後可得一值,單位向量點乘相當於COS角.
用途:求光照(N.L),平面方程(P.N+D=0),背面消除
(V.N<0,也就是>90度,即背面),投影等等.
 
2.叉乘:
即兩向量叉乘得出另一向量.
用途:一般用來求法線,座標的第3軸等
 
3.平面方程:
ax+by+cz+d=0,也就是P.N+D=0;
用途:=0,表示點p在平面上,>0在平面內,<0在平面外.
 
4.投影:
點點乘單位向量即得點在此向量上的投影值(標量)
用途:投影,座標在不同座標系下轉換(如下)等等
               
5.矩陣:
即行列式,在遊戲中一般用來記錄新座標系下的各軸向以及負位置(
偏移值).一個點乘上一個矩陣,相當於點乘各軸並加上偏移值.
 
6.空間轉換:
一個點在各不同空間中的轉換其實就是點轉換到各不同座標系下,
我們先把新座標系移到原點,然後只需將點點乘新座標系各軸向,即求得在其座標軸上的各分量投影值.
然後再將新座標系移回,即再減去新座標系的位置.就可得出此點在新座標系下的座標.
用途:obj space to world space to view space to project space等等.
 
7.視矩陣:
 只需求出U, V, N各軸向以及相機位置即可,其中V可暫定爲朝上,N即視線方向,
而U則由V叉乘N得來.這樣視矩陣中各軸向爲U,V,N.而偏移爲負的相機位置.
當一個點要由世界座標變換到視座標系下,只需將點乘上該視矩陣.反之,要將一個
點由視座標系變換到世界座標系,只需將點乘上該視矩陣的逆,即 M*M的逆=1, 其它
空間的變換對於正逆矩陣的操作也同理.
 
8.物體朝向旋轉:
只需朝向目標的向量作爲z軸,再分別求出其它各軸得到一偏移值爲0新座標系,然後
對其轉置(transpose),最後物體位置點乘上此新座標系即可.
用途:如billboard,lookat等.
 
 
9. 射線與平面交點距離:
    例: 照相機觀察方向到與平面相交點距離,
 設X爲所求,D爲照相機到平面垂直距離(D = camera.xyz dot plane's normal + d)
    N爲平面法線, V爲觀察方向(即camera.z),那麼
    V * X = 從照相機位置出發的觀察方向的向量,長度爲此方向上與平面相交點的距離.
    (V  * X) dot N = 觀察方向上到平面相交點的向量在法線上的投影(即D)
    於是,(V*X) dot N = -D,
    交換一下:
    X = -D/(V dot N)
                  | 
                  |  
                  |  /  V
                  |    /
                  |___/ N
                  |  D
                  |
                plane
     用途:碰撞檢測等

10. 反射線:
  如:
    反射光線: R = 2(N.L)N-L
    反射視線: R = 2(N.V)N-V
   
    原理:
       L    N    R
        /   |   /^
         /  |  / |
          / | /  |
           /|/   |
---------/-------------
         O /   |M
              /  |
               / |
                /|
                  T
   OR = OT+TR = -L + TR = -L + (TM+MR) = -L + 2(MR) = -L + 2(N.L*N) = 2(N.L)N-L

用途:
反射光照: (V.R)的平方,(一般取經驗模型: V.R = N.H, 其中H=(L.V)/2)),
環境紋理映射 (一般環境紋理映射方式可用反射/法線/質心朝向)
等等
 ======================================================
有不懂的自己查資料,我不能面面具到啊!! 

發佈了9 篇原創文章 · 獲贊 2 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章