3Dのための数学基礎 †
これから3Dについて話を進める上で重要な知識である数学についてまとめてみました。このページの内容が不要な方は読み飛ばして頂いても結構です。
このサイトは数学のためのサイトではないので管理者の備忘録として超簡単に記述しています。
注:表記について
行列 : 英字大文字で太字 : A
ベクトル : 英字小文字で太字 : a
逆行列 : 英字大文字で太字の右上に-1 : A ⁻¹
行列式 : 英字大文字で太字を|で挟む : |A |
余因子行列 : 英字大文字で太字の上にチルダ(~) : Ã
転置行列 : 英字大文字で太字の右上にT : A T
行列 †
図形の描画で3Dだけでなく2Dでも行列を使う理由は、後で出てくる座標変換などを考える上で考え易いからです。
行列(Matrix)は数や記号や式などを行と列からなる矩形状に配列したものです。行列として並べられた個々のものは「要素」または「成分」と呼ばれます。ここでは「要素」と呼ぶことにします。
行列は連立一次方程式やベクトル(Vector)の解析や一次変換に利用されます。
3Dの描画では図形の回転、移動、3Dから2Dのへの投影などで一次変換の機能を利用します。
行列 †
要素(Element)a ij を縦に m個、横に n個並べた表をm X n行列 といいます。 ( 1 ≦ i ≦ m, 1 ≦ j ≦ n )
また、a ij を行列A の(i、j)成分 といいます。
特に、行数と列数が等しいとき、その行列を正方行列 とよびます。
記法 †
要素(Element)を横(行:Row)と縦(列:Column)に矩形状に並べて括弧で括ります。
例えば 2 x 3の行列の場合以下のようになります。
a11 a12 a13
a21 a22 a23
/* Blacket A */
/* Blacket B */
ここで各行を行ベクトル、各列を列ベクトルとして扱われることもあります。
上記の例であれば
1番目の行ベクトルは ( a 11 a 12 a 13 )
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 */
A と
B の和を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 */
) 交換則
A + B = B + A
) 結合則
(A + B ) + C = A + (B + C )
スカラー倍 †
k x a 11 … k x a 1n
kA = (k x a ij
) = ┇ ┇
k x a m1 … k x a mn
/* Blacket A */
/* Blacket B */
行列A とB の積を求める場合、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 */
A とB の積をC とすると
c11 … c1r
A B
= C = (cik
) = ┇ ┇ =
cm1 … cmr
/* Blacket A */
/* Blacket B */
n
(Σaij bjk
)
j=1
a11 b11
+a12 b21
+…+a1n bn1
…… a11 b1r
+a12 b2r
+…+a1n bnr
= ┇ ┇
am1 b11
+am2 b21 +…+amn
bn1
…… am1 b1r
+am2 b2r
+…+amn bnr
/* 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 */
行列の積は可換であるとは限りません。
それは要素の値が特定な場合を除いて、一般的には交換則が成り立たないからです。
AB ≠ BA
以下は非可換の例です。
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 */
) 結合則
(AB ) C = A (BC )
) 分配則
(A + B ) C = AC + BC
C (A + B ) = CA + CB
対角行列 †
n次正方行列A = (a ij )において、対角線上に並ぶ成分a 11 、a 22 、・・・ a nn を『 行列A の対角成分 』といいます。
対角成分以外の成分が全て0 になっている行列を対角行列 といいます。
単位行列 †
対角行列について、対角成分が全て1 である行列を単位行列 といい、E で表します。
とくに、E がn次正方行列であることを明示したい場合には、E n,n またはE n と表記します。
例えば、
E 2,2 =
1 0
0 1
/* Blacket A */
/* Blacket B */
1 0 0
E 3,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
E 4,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) †
) 行列式の定義
行列と似た名前なので混同されやすいですが、行列(Matrix)と行列式(Determinant)は違うものです。
n 次正方行列X の i 行 j 列成分をx ij で表せば、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次行列の行列式
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次以上の行列についてはここでは省略します。
) ベクトル積と行列式
行列式は後述のベクトル積 を簡略に記述するときにも利用されます。
転置行列 †
転置行列(transposed matrix)とは m行 n列の行列A に対してA の(i, j)要素と(j, i)要素を入れ替えたn行 m列の行列、つまり対角線で成分を折り返した行列のことです。
ここでは行列A に対する転置行列をA T
と表すことにします。
転置行列は次の直行行列で説明するように逆行列を計算する時に利用します。
直行行列 †
直交行列(orthogonal matrix)とは n × n の行列A の転置行列A T に対して
A T A = A A T = E
を満たすような正方行列のことです。ここでE はn次の単位行列です。
n次正方行列A の転置行列A T がA の逆行列になっているとき、すなわち
A T = A ⁻¹
を満たすとき、A を直交行列といいます。
直交行列の行列式の値は±1となります。
行列A が直交行列なら行列式の性質から
1 = |E | = |AA ⁻¹| = |AA T | = |A |²となります。
直行行列の場合、転置行列と逆行列が同じなので、逆行列が転置行列を計算することにより容易に求まります。
後述のアフィン変換に出てくる回転行列は直行行列です。 ← 重要
この逆行列の例を前述の逆行列 の中で例示しています。
余因子行列 †
2次の正方行列の行列式は前述しましたが、さらに高次の正方行列の行列式は複雑になります。
余因子展開は行列を小さな行列に分解して、行列式を計算する方法です。
例えば4次の正方行列であれば3次に分解し、3次からさらに2次に分解して計算します。余因子展開において値が0の要素における計算で余因子の計算が省略でき、計算を簡単にすることができます。
) 余因子(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 の成分a ij に関する余因子といいます。
) 余因子展開
n次行列A =[a ij ]について次式が成り立ちます。
第ⅰ行に関する余因子展開
|A | = a i1 α i1 + a i2 α i2 + ……+ a in α in
第 j 行に関する余因子展開
|A | = a 1j α 1j + a 2j α 2j + ……+ a nj α 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
) 余因子行列
余因子行列とは行列A に対して要素a ij の余因子α ij を行列A の要素a ij の位置に入れた行列のことで、以下のような式によって定義されています。
ここでは行列A に対する余因子行列をÃ と表わすことにします。
α11
α12 … α1n
α21
α22 … α2n
à = α31
α32 … α3n ,
…
αn1
αn2 … αnn
αij =
(-1) i+j
| A (i|j) |
/* Blacket A */
/* Blacket B */
余因子行列の定義として、要素a ij の余因子α ij を行列A の要素a ji の位置に入れた行列とする定義もあります。これは初めの余因子行列の定義に対して行と列を入れ替えたもので転置行列です。ここでは要素の行と列を入れ替えることを明示するために初めの定義を使用します。
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 */
) 余因子行列と逆行列
一般に逆行列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 '、x とb はベクトルです。
「透視投影変換」は、(遠くのものほど小さくなる変形を伴うので)アフィン変換ではありません。
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 */
) 拡大・縮小 スケール変換
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 */
) 平行移動
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 */
) 回転移動
原点を中心に反時計回りにθ°回転した時のアフィン変換は次のようになります。
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 */
) せん断
四角形の図形を平行四辺形に変形する変換をせん断(スキュー: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 */
) アフィン変換の複合
アフィン変換を複合する場合は各変換の積になります。行列のところで説明したように行列の積は一般的に非可換です。
従って変換する順番によって結果が変わります。
変換前の点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 */
) 拡大・縮小 スケール変換
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 */
) 平行移動
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種類のアフィン変換があります。ここでは右手座標系として説明します。各軸の座標の値が変化しないことに注意して下さい。
複数の回転の変換の適用も行列の積になるので、回転させる順番によって結果が変わります。
) 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 */
) 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 */
) 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描画においては、対象となる図形の面の、光源に対する傾きを計算して面の明るさや光の反射を計算したり、視点に対する傾きにより面が見えるか(描画するか)を計算するのに使用します。ここでは右手座標系として説明します。
内積(スカラー積) †
ベクトルa とb 大きさをAとBとし、そのなす角を反時計回りにθとするとき
AB cosθ
ここで A = ax2 + a y2 + a z2
/* SqrRoot */
B = bx2 + b y2 + b z2
/* SqrRoot */
です。
を二つのベクトルa とb の内積 (dot product)又はスカラー積 といいます。
a ・b 、(a b )、(a ・b )
などで表します。
以降特に説明がなければa ・b と記述します。
ここで3次元ベクトルa 、b を
a = ( ax , ay , az ), b = ( bx , by , bz )
とするとa とb の内積は次のようになります。
a ・b = ax bx + ay by + az bz = AB cosθ
外積(ベクトル積) †
ベクトルa とb の大きさをAとBとし、そのなす角を反時計回りにθ(0°< θ < 180°)とするとき、その大きさが、ベクトルa とb が作る平行四辺形の面積
ABsinθ
に等しく、かつその方向がこの平行四辺形に垂直なベクトルを、二つのベクトルa とb の外積 (cross product)またはベクトル積 といいます。
ここで3次元ベクトルa 、b を
a = ( ax , ay , az ), b = ( bx , by , bz )
とすると行列式 を用いて以下のようになります。
a x b =
ay by az bz ax bx
az bz , ax bx , ay by
= (ay bz - az by , az bx - ax bz , ax by - ay bx )
/* Blacket A */
/* Blacket B */
/* Bar A */
/* Bar B */
/* Bar A */
/* Bar B */
/* Bar A */
/* Bar B */
ベクトルの大きさは
|a x b | = (ay bz - az by )2 + (az bx - ax bz )2 + (ax by - ay bx )2
/* SqrRoot */
= (ax2 + a y2 + a z2 ) 2 (b x2 + b y2 + b z2 ) 2 - (a x bx + ay by + az bz )2
/* SqrRoot */
= A2 B 2 - A 2 B 2 cos2 θ
/* SqrRoot */
= AB 1 - cos2 θ ←内積の公式より
/* SqrRoot */
= AB sinθ
法線ベクトル(Normal Vector) †
2次元ではある線に垂直なベクトル、3次元ではある面に垂直なベクトルのことを法線ベクトルといいます。ベクトルの大きさが1の法線ベクトルを特に単位法線ベクトル(Normal Unit Vector)といいます。上記ベクトルの外積はベクトルa とb が含まれる平面の法線ベクトルになりますがその逆は成り立ちません。法線ベクトルというのは単にある平面に対して垂直であるということですが、外積は大きさがベクトルa とb が作る平行四辺形の面積と同じであるからです。
ベクトルa とb の単位法線ベクトル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)とします。
ベクトルa とb は上図より
ベクトル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
ベクトルa とb の外積a xb の式より法線ベクトルn の各成分は以下となります。
n ( nx , ny , nz ) = a xb
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 + n y2 + n z2
/* SqrRoot */
となり上記 で説明した式より単位法線ベクトルが求まります。