3Dのための数学基礎

 これから3Dについて話を進める上で重要な知識である数学についてまとめてみました。このページの内容が不要な方は読み飛ばして頂いても結構です。 このサイトは数学のためのサイトではないので管理者の備忘録として超簡単に記述しています。
注:表記について

  • 行列 : 英字大文字で太字 : A
  • ベクトル : 英字小文字で太字 : a
  • 逆行列 : 英字大文字で太字の右上に-1 : A⁻¹
  • 行列式 : 英字大文字で太字を|で挟む : |A|
  • 余因子行列 : 英字大文字で太字の上にチルダ(~) : Ã
  • 転置行列 : 英字大文字で太字の右上にT : AT

行列

 図形の描画で3Dだけでなく2Dでも行列を使う理由は、後で出てくる座標変換などを考える上で考え易いからです。 行列(Matrix)は数や記号や式などを行と列からなる矩形状に配列したものです。行列として並べられた個々のものは「要素」または「成分」と呼ばれます。ここでは「要素」と呼ぶことにします。 行列は連立一次方程式やベクトル(Vector)の解析や一次変換に利用されます。 3Dの描画では図形の回転、移動、3Dから2Dのへの投影などで一次変換の機能を利用します。

行列


要素(Element)aijを縦に m個、横に n個並べた表をm X n行列といいます。 ( 1 ≦ i ≦ m, 1 ≦ j ≦ n )
また、aijを行列A(i、j)成分といいます。
特に、行数と列数が等しいとき、その行列を正方行列とよびます。

 

記法


要素(Element)を横(行:Row)と縦(列:Column)に矩形状に並べて括弧で括ります。 例えば 2 x 3の行列の場合以下のようになります。

a11 a12 a13 a21 a22 a23 /* Blacket A */ /* Blacket B */


ここで各行を行ベクトル、各列を列ベクトルとして扱われることもあります。
上記の例であれば
1番目の行ベクトルは ( a11 a12 a13 )

1番目の列ベクトルは です。 a11 a21 /* Blacket A */ /* Blacket B */


行列の表現方法は色々ありますがここでは英数の太字の大文字Aで表すことにします。

和(と差)

a11 … a1n A = (aij ) =  ┇   ┇   , am1 … amn /* Blacket A */ /* Blacket B */ b11 … b1n B = (bij ) =  ┇   ┇   の時, bm1 … bmn /* Blacket A */ /* Blacket B */ ABの和をCとすると c11 … c1n A + B = C = (cij ) =  ┇   ┇   = cm1 … cmn /* Blacket A */ /* Blacket B */ a11+b11 … a1n+b1n (aij + bij) =   ┇       ┇ am1+bm1 … amn+bmn /* Blacket A */ /* Blacket B */
  1. ) 交換則
    A + B = B + A
     
  2. ) 結合則
    (A + B) + C = A + (B + C)
     

スカラー倍

k x a11 … k x a1n kA = (k x aij ) =   ┇      ┇ k x am1 … k x amn /* Blacket A */ /* Blacket B */

行列ABの積を求める場合、Aの列数とBの行数が同じでなければなりません。
Aを m x n 行列、Bを n x r 行列とするとその積は m x r 行列となります。
(m x n)・(n x r) → (m x r)

a11 … a1n A = (aij ) =  ┇   ┇   , am1 … amn /* Blacket A */ /* Blacket B */ b11 … b1r B = (bjk ) =  ┇   ┇   の時, bn1 … bnr /* Blacket A */ /* Blacket B */
 

ABの積をCとすると

c11 … c1r A B = C = (cik ) =  ┇   ┇   = cm1 … cmr /* Blacket A */ /* Blacket B */ n (Σaij bjk ) j=1 a11b11 +a12b21 +…+a1nbn1  …… a11b1r +a12b2r +…+a1nbnr =       ┇                  ┇ am1b11 +am2b21+…+amn bn1 …… am1b1r +am2b2r +…+amnbnr /* Blacket A */ /* Blacket B */
 

例えば、

1 2 3 4 5 6 /* Blacket A */ /* Blacket B */ 7   8 9 10  = 11 12 /* Blacket A */ /* Blacket B */ 1x7 + 2x9 + 3x11  1x8 + 2x10 + 3x12 4x7 + 5x9 + 6x11  4x8 + 5x10 + 6x12 /* Blacket A */ /* Blacket B */ = 58   64 139 154 /* Blacket A */ /* Blacket B */
 

行列の積は可換であるとは限りません。
それは要素の値が特定な場合を除いて、一般的には交換則が成り立たないからです。
ABBA

 

以下は非可換の例です。

0 2  2 3   6 4 1 0  3 2   2 3 , /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ = /* Blacket A */ /* Blacket B */ 2 3  0 2   3 4 3 2  1 0   2 6 /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ = /* Blacket A */ /* Blacket B */
 

以下は可換の例です。

0 1  2 3   3 2 1 0  3 2   2 3 , /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ = /* Blacket A */ /* Blacket B */ 2 3  0 1   3 2 3 2  1 0   2 3 /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ = /* Blacket A */ /* Blacket B */
 
  1. ) 結合則
    (AB) C = A (BC)
  2. ) 分配則
    (A + B) C = AC + BC
    C (A + B) = CA + CB
     

対角行列

n次正方行列 = (aij)において、対角線上に並ぶ成分a11a22、・・・ annを『 行列Aの対角成分 』といいます。
対角成分以外の成分が全て0になっている行列を対角行列といいます。

 

単位行列

対角行列について、対角成分が全て1である行列を単位行列といい、Eで表します。
とくに、Eがn次正方行列であることを明示したい場合には、En,nまたはEnと表記します。

例えば、 E2,2 = 1 0 0 1 /* Blacket A */ /* Blacket B */ 1 0 0 E3,3 = 0 1 0 0 0 1 /* Blacket A */ /* Blacket B */ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 E4,4 = /* Blacket A */ /* Blacket B */


逆行列、正則行列

正方行列Aについて、
AB = BA = E
を満たす正方行列B逆行列といい、A⁻¹(A inverseと読みます)と表します。
AA⁻¹ = A⁻¹A = E
逆行列が存在する行列を正則行列といいます。
この3D描画の基礎知識の中では、ビュー変換において使用されます。そのため逆行列を計算するために以降のさらなる行列の基礎知識が必要となります。
ここでは3D描画で関連する後述のアフィン変換行列の逆行列の例をあげておきます。

  • x軸反転(2D)
    -1 0 0 ⁻¹  -1 0 0 0 1 0  =   0 1 0 0 0 1    0 0 1 /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */
  • y軸反転(3D)
    1  0 0 0 ⁻¹   1  0 0 0 0 -1 .0 0     0 -1 0 0 = 0  0 1 0    0  0 1 0 0  0 0 1    0  0 0 1 /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */
  • 平行移動(2D)
    1 0 Tx ⁻¹   1 0 -Tx 0 1 Ty  =  0 1 -Ty 0 0  1    0 0  1 /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */
  • 平行移動(3D)
    1 0 0 Tx ⁻¹   1 0 0 -Tx 0 1 0 Ty    0 1 0 -Ty = 0 0 1 Tz    0 0 1 -Tz 0 0 0  1    0 0 0  1 /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */
  • 回転(2D)
    cosθ -sinθ 0 ⁻¹   cosθ sinθ  0 sinθ  cosθ 0  = -sinθ  cosθ 0  0     0   1     0     0  1 /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */
  • x軸回転(3D)
    1  0     0  1 ⁻¹  1   0    0   0 0 cosθ -sinθ 0    0 cosθ sinθ 0 = 0 sinθ  cosθ 0    0 -sinθ cosθ 0 0  0     0  1    0   0    0   1 /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */
     

行列式(Determinant)

  1. ) 行列式の定義
    行列と似た名前なので混同されやすいですが、行列(Matrix)と行列式(Determinant)は違うものです。
    n 次正方行列Xの i 行 j 列成分をxijで表せば、X の行列式とは、 |X| = Σsgn(σ)xσ(1)1 xσ(2)2・・・xσ(n)n = Σsgn(σ)x1σ(1) xσ2(2)・・・xnσ(n) σ∈n σ∈n
    で与えられる斉 n-次の多項式(n-次形式)です。ただし、nは n 次の置換全体で、sgn は置換の符号と呼ばれるものです。
  2. ) 2次行列の行列式
    A = a b c d /* Blacket A */ /* Blacket B */
    という2次の行列Aがあった場合,行列式はつぎのように定義されます。
    A| =     = ad-bc a b c d /* Blacket A */ /* Blacket B */
     
    行列式は行列の成分同士の演算ですから,ベクトルではなく単なる値(スカラー量)です。 下のように書いても,上式と同じ意味です。
    det A = det     = ad-bc a b c d /* Blacket A */ /* Blacket B */
     
    3次以上の行列についてはここでは省略します。
     
  3. ) ベクトル積と行列式
    行列式は後述のベクトル積を簡略に記述するときにも利用されます。
     

転置行列

転置行列(transposed matrix)とは m行 n列の行列Aに対してAの(i, j)要素と(j, i)要素を入れ替えたn行 m列の行列、つまり対角線で成分を折り返した行列のことです。

  • ここでは行列Aに対する転置行列をAT と表すことにします。
    転置行列は次の直行行列で説明するように逆行列を計算する時に利用します。

直行行列

  • 直交行列(orthogonal matrix)とは n × n の行列Aの転置行列ATに対して
    ATA = A AT= E
    を満たすような正方行列のことです。ここでEはn次の単位行列です。
    n次正方行列Aの転置行列ATAの逆行列になっているとき、すなわち
    AT= A⁻¹
    を満たすとき、Aを直交行列といいます。
    直交行列の行列式の値は±1となります。 行列Aが直交行列なら行列式の性質から
     1 = |E| = |AA⁻¹| = |AAT| = |A|²となります。
    直行行列の場合、転置行列と逆行列が同じなので、逆行列が転置行列を計算することにより容易に求まります。

    後述のアフィン変換に出てくる回転行列は直行行列です。  ← 重要
    この逆行列の例を前述の逆行列の中で例示しています。

余因子行列

2次の正方行列の行列式は前述しましたが、さらに高次の正方行列の行列式は複雑になります。
余因子展開は行列を小さな行列に分解して、行列式を計算する方法です。
例えば4次の正方行列であれば3次に分解し、3次からさらに2次に分解して計算します。余因子展開において値が0の要素における計算で余因子の計算が省略でき、計算を簡単にすることができます。

 
  1. ) 余因子(cofactor)
    n次の正方行列
    a11 … a1n A = (aij ) =  ┇   ┇ an1 … ann /* Blacket A */ /* Blacket B */
     
    において、Aの第i行と第j列を取り除いたn - 1次の正方行列をA(i|j)で表します。この時、
    αij = (-1)i+j|A(i|j)|
    Aの成分aijに関する余因子といいます。
     
  2. ) 余因子展開
    n次行列A=[aij]について次式が成り立ちます。
    第ⅰ行に関する余因子展開
    |A| = ai1αi1 + ai2αi2+ ……+ ainαin
     
    第 j 行に関する余因子展開
    |A| = a1jα1j + a2jα2j+ ……+ anjαnj
    行列式のところでは2次行列を行列式へ展開した例しか紹介しませんでしたが、余因子展開を利用して3次行列を行列式に展開してみましょう。
    /* Bar A */ /* Bar B */ a11 a12 a13 |A| = a21 a22 a23 = a31 a32 a33 a22 a23      a12 a13      a12 a13 a11・      - a21・      + a31 a32 a33      a32 a33      a22 a23 /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ = a11・(a22 a33 - a23 a32) - a21・(a12 a33 - a13 a32) + a31・(a12 a23 - a13 a22) = a11 a22 a33 - a11 a23 a32 - a12 a21 a33 + a13 a21 a32 + a12 a23 a31 - a13 a22 a31
    例えば第1列( j = 1 ) 第ⅰ行(ⅰ= 1,2,3)に関する余因子展開を順に見ていくと以下のようになります。
    ※ j (=1)が奇数なので偶数番目の時は係数が負になります。
    /* Bar A */ /* Bar B */ 1 2 3 4 5 6 = 1・    - 4・    + 7・ 7 8 8 5 6     2 3     2 3 8 8     8 8     5 6 /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ = 1・(5x8 - 6x8) - 4・(2x8 - 3x8) + 7・(2x6 - 3x5) = 4
     
  3. ) 余因子行列
    余因子行列とは行列Aに対して要素aijの余因子αijを行列Aの要素aijの位置に入れた行列のことで、以下のような式によって定義されています。
    ここでは行列Aに対する余因子行列をÃと表わすことにします。
    α11 α12 … α1n α21 α22 … α2n à = α31 α32 … α3n  , αn1 αn2 … αnn αij = (-1)i+j |A(i|j)| /* Blacket A */ /* Blacket B */
    余因子行列の定義として、要素aijの余因子αijを行列Aの要素ajiの位置に入れた行列とする定義もあります。これは初めの余因子行列の定義に対して行と列を入れ替えたもので転置行列です。ここでは要素の行と列を入れ替えることを明示するために初めの定義を使用します。
    3次行列の余因子行列は以下のようになります。
    /* Blacket A */ /* Blacket B */ a11 a12 a13 A = a21 a22 a23  の時 a31 a32 a33 /* Blacket A */ /* Blacket B */ Ã = -            - - - a22 a23   a21 a23   a21 a22 a32 a33   a31 a33   a31 a32 a12 a13   a11 a13   a11 a12 a32 a33   a31 a33   a31 a32 a12 a13   a11 a13   a11 a12 a22 a23   a21 a23   a21 a22 /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */
  4. ) 余因子行列と逆行列
    一般に逆行列A⁻¹は行列式と余因子行列を使って以下のように表されます。
    A⁻¹ = ÃT |A| /* Bar Horizontal */
    ここで
    /* Blacket A */ /* Blacket B */ ÃT = -            - - - a22 a23   a12 a13   a12 a13 a32 a33   a32 a33   a22 a23 a21 a23   a11 a13   a11 a13 a31 a33   a31 a33   a21 a23 a21 a22   a11 a12   a11 a12 a31 a32   a31 a32   a21 a22 /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */
    これからAの余因子行列の転置をAの行列式で割ればAの逆行列が計算できます。ただし、Aの行列式の値が0になる時は使えません。
     
    ここで余因子行列に出てくる用語をちょっとまとめてみます。
    • 余因子:i行j列を除いた行列式に(-1) i+j を掛けたもの
    • 余因子行列:余因子を行列の要素とする行列
    • 転置行列:行と列を入れ換えた行列


アフィン変換

幾何学におけるアフィン写像(affine map)はベクトル空間の間で定義される、平行移動を伴う線型写像でのことです。アフィン (affine) はラテン語で「類似・関連」を意味する affinis に由来します。
一般に、アフィン変換は線型変換(回転、拡大縮小、剪断)と平行移動の組み合わせで表現されます。いくつかの線型変換の組合せは一つの線型変換に集約することができるので、アフィン変換は
x' = Ax + b
の形に一般化することができます。ここでAが線形変換行列でx'、xbはベクトルです。
「透視投影変換」は、(遠くのものほど小さくなる変形を伴うので)アフィン変換ではありません。

2次元アフィン変換

2次元の図形であれば、線形変換は元の座標に2x2の行列を掛けることで表現できます。平行移動は2次元のベクトルの加算で表現できます。つまり、
変換前の座標pをx,y
変換後の座標p'をx',y'
平行移動量をTx,Ty
とすると次のように表すことができます。

x'  a b  x   Tx y'  c d  y   Ty =       + /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */


上記に対して次元を1つ上げた3次元の座標(同次座標と呼ぶ)を導入すると、次のような1つの行列の乗算にまとめることができます。これを同次変換と呼びます。
これが2次元アフィン変換の行列式です。

x'   a b Tx  x y' = c d Ty  y 1   0 0  1  1 /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */


  1. ) 拡大・縮小 スケール変換
    x'   Sx 0 0  x y' = 0  Sy 0  y 1   0  0 1  1 /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ x y 1 Sx 1 Sy /* X axis */ /* Y axis */
  2. ) 平行移動
    X軸方向にTx、Y軸方向にTy移動した時のアフィン変換は次のようになります。
    x'   1 0 Tx  x y' = 0 1 Ty  y 1   0 0  1  1 /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ x y 1 Tx 1 Ty /* X axis */ /* Y axis */ /* Tx */ /* Ty */
     
  3. ) 回転移動
    原点を中心に反時計回りにθ°回転した時のアフィン変換は次のようになります。
    x'   cosθ -sinθ 0  x y' = sinθ  cosθ 0  y 1    0    0   1  1 /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ x y θ /* X axis */ /* Y axis */ /* Y axis */
     
  4. ) せん断
    四角形の図形を平行四辺形に変形する変換をせん断(スキュー:Skew)といい原点を中心に反時計回りにθ°せん断した時のアフィン変換は次のようになります。
    x'    1    0  0  x y' = tanθ 1  0  y 1    0   0  1  1 /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ x y θ /* X axis */ /* Y axis */ /* Y axis */
     
  5. ) アフィン変換の複合
    アフィン変換を複合する場合は各変換の積になります。行列のところで説明したように行列の積は一般的に非可換です。 従って変換する順番によって結果が変わります。 変換前の点p(x,y)の時、拡大Sした後の点をp'その後平行移動Tした後の点をp"とした場合
    p"=Tp'=TSp
    平行移動Tした後の点をp'その後拡大Sした後の点をp"とした場合
    p"=Sp'=STp
    となるので、変換の適用は行列式の右側からになります。
    図は、1 x 1の正方形を縦横2倍にしてx,y軸方向に+1平行移動した場合の例で、青が1回目、赤が2回目の変換の結果です。
    平行移動(Tx,Ty)して拡大(Sx,Sy)した場合
    x'   Sx 0 0  1 0 Tx  x    Sx 0  SxTx  x   2 0 2 x y' =  0 Sy 0  0 1 Ty  y = 0  Sy SyTy  y = 0 2 2 y 1    0  0 1  0 0  1  1    0  0   1    1   0 0 1 1 /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */
     
    拡大(Sx,Sy)して平行移動(Tx,Ty)した場合
    x'   1 0 Tx  Sx 0  0  x   Sx 0  Tx  x   2 0 1 x y' = 0 1 Ty  0  Sy 0  y = 0  Sy Ty  y = 0 2 1 y 1   0 0  1  0   0  1  1    0  0  1  1   0 0 1 1 /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */
     
    x y 1 1 /* X axis */ /* Y axis */ x y 1 1 /* X axis */ /* Y axis */

3次元アフィン変換

3次元の図形処理も、2次元のときと同じようにアフィン変換で行う事ができます。 2次元アフィン変換では3次の行列を使いましたが、3次元アフィン変換では4次の行列を使うだけです。
変換前の座標pをx,y,z
変換後の座標p'をx',y',z'
平行移動量をTx,Ty,Tz
とすると次のように表すことができます。

x'   a b c Tx  x y'   d e f Ty  y z'   g h i  Tz  z 1    0 0 0 1   1 = /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */
 
  1. ) 拡大・縮小 スケール変換
    X軸方向の拡大率をSx、Y軸方向の拡大率をSy、Z軸方向の拡大率をSzとした時の拡大縮小のアフィン変換は次のようになります。
    x'   Sx 0  0  0  x y'   0  Sy 0  0  y z'   0  0  Sz 0  z 1.   0  0  0   1  1 = /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */
     
  2. ) 平行移動
    X軸方向にTx、Y軸方向にTy、Z軸方向にTz移動した時のアフィン変換は次のようになります。
    x'   1 0 0 Tx  x y'   0 1 0 Ty  y z'   0 0 1 Tz  z 1    0 0 0 1   1 = /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */
     
  3. ) 回転移動
    3次元の回転の場合、それぞれの軸を中心にした回転に対する3種類のアフィン変換があります。ここでは右手座標系として説明します。各軸の座標の値が変化しないことに注意して下さい。
    複数の回転の変換の適用も行列の積になるので、回転させる順番によって結果が変わります。
    1. ) X軸まわりの回転移動
      X軸を中心として反時計回りに角度θ回転させるときのアフィン変換は次のようになります。
      x'   1  0    0   0  x y'   0 cosθ -sinθ 0  y z'   0 sinθ  cosθ 0  z 1.   0  0    0   1  1 = /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */
       
    2. ) Y軸まわりの回転移動
      Y軸を中心として反時計回りに角度θ回転させるときのアフィン変換は次のようになります。
      x'   cosθ 0 -sinθ. 0  x y'    0   1   0   0  y z'   sinθ 0  cosθ 0  z 1.    0   0   0   1  1 = /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */
       
    3. ) Z軸まわりの回転移動
      Z軸を中心として反時計回りに角度θ回転させるときのアフィン変換は次のようになります。
      x'   cosθ -sinθ  0 0  x y'   sinθ  cosθ 0 0  y z'    0    0   1 0  z 1.    0    0   0 1  1 = /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */ /* Blacket A */ /* Blacket B */

法線ベクトル

法線ベクトルは線または面に垂直なベクトルです。
3D描画においては、対象となる図形の面の、光源に対する傾きを計算して面の明るさや光の反射を計算したり、視点に対する傾きにより面が見えるか(描画するか)を計算するのに使用します。ここでは右手座標系として説明します。

内積(スカラー積)

ベクトルab大きさをAとBとし、そのなす角を反時計回りにθとするとき
AB cosθ

ここで A =  ax2 + ay2 + az2 /* SqrRoot */      B =  bx2 + by2 + bz2 /* SqrRoot */

  です。
を二つのベクトルab内積(dot product)又はスカラー積といいます。
ab 、(a b)、(ab)
などで表します。
以降特に説明がなければabと記述します。
ここで3次元ベクトルab
 a = ( ax, ay, az), b = ( bx, by, bz)
とするとabの内積は次のようになります。
 ab = axbx + ayby + azbz = AB cosθ

外積(ベクトル積)

ベクトルabの大きさをAとBとし、そのなす角を反時計回りにθ(0°< θ < 180°)とするとき、その大きさが、ベクトルabが作る平行四辺形の面積
ABsinθ
に等しく、かつその方向がこの平行四辺形に垂直なベクトルを、二つのベクトルab外積(cross product)またはベクトル積といいます。
ここで3次元ベクトルab
 a = ( ax, ay, az), b = ( bx, by, bz)
とすると行列式を用いて以下のようになります。

a x b = ay by  az bz  ax bx az bz ,  ax bx , ay by = (aybz - azby, azbx - axbz, axby - aybx) /* Blacket A */ /* Blacket B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */ /* Bar A */ /* Bar B */

ベクトルの大きさは

|a x b| = (aybz - azby)2 + (azbx - axbz)2 + (axby - aybx)2 /* SqrRoot */ = (ax2 + ay2 + az2)2(bx2 + by2 + bz2)2 - (axbx + ayby + azbz)2 /* SqrRoot */ = A2 B2 - A2B2cos2θ /* SqrRoot */ = AB 1 - cos2θ    ←内積の公式より /* SqrRoot */ = AB sinθ
 

法線ベクトル(Normal Vector)

2次元ではある線に垂直なベクトル、3次元ではある面に垂直なベクトルのことを法線ベクトルといいます。ベクトルの大きさが1の法線ベクトルを特に単位法線ベクトル(Normal Unit Vector)といいます。上記ベクトルの外積はベクトルabが含まれる平面の法線ベクトルになりますがその逆は成り立ちません。法線ベクトルというのは単にある平面に対して垂直であるということですが、外積は大きさがベクトルabが作る平行四辺形の面積と同じであるからです。
ベクトルabの単位法線ベクトルnは上記外積の公式より以下のようになります。

n =     = a x b |a x b| a x b AB sinθ

ここでは頂点をp1(x1,y1,z1),p2(x2,y2,z2),p3(x3,y3,z3)とする三角形で法線ベクトルを説明します。

O x y z p1(x1,y1,z1) p2(x2,y2,z2) p3(x3,y3,z3) a b n θ /* X axis */ /* Y axis */ /* Z axis */ /* n-Vector */ /* θ */ /* θ */ /* Angle */ /* p1 Arrow */ /* p3 Arrow */

頂点p1,p2,p3が反時計周りの順番にあるとき(右手座標系の場合)p2→p3の向きのベクトルa(p3 - p2)とp2→p1の向きのベクトルb(p1 - p2)とします。
ベクトルabは上図より
ベクトルa = (x3 - x2, y3 - y2, z3 - z2)
ベクトルb = (x1 - x2, y1 - y2, z1 - z2)

上記外積でのベクトルの成分の値は以下になります。
 ax = x3 - x2, ay = y3 - y2, az = z3 - z2
 bx = x1 - x2, by = y1 - y2, bz = z1 - z2

ベクトルabの外積axbの式より法線ベクトルnの各成分は以下となります。
 n( nx, ny, nz) = axb
 nx = (y3 - y2)(z1 - z2)-(z3 - z2)(y1 - y2)
 ny = (z3 - z2)(x1 - x2)-(x3 - x2)(z1 - z2)
 nz = (x3 - x2)(y1 - y2)-(y3 - y2)(x1 - x2)
ベクトルの大きさは

|a x b| = nx2 + ny2 + nz2 /* SqrRoot */

となり上記で説明した式より単位法線ベクトルが求まります。

 

最終更新のRSS
Last-modified: 2015-06-21 (日) 23:49:06 (1247d)