3Dプログラミング入門講座・その2:行列、マトリクス



同次座標がw,x,y,z,...の順番で定義されたものの説明です。順番が違うだけで、機能に変わりはありませんが・・・


・基本性質0
0-1.i×jの行列Mとは、第i行第j列の成分をMijで表すと

○|M00○○M01○○○...○M0(n-1)|

○|M10○○M11○○○...○M1(n-1)|

M=|...○○○...○○○○...○...|

○|M(n-1)0○M(n-1)1○...○M(n-1)(n-1)|


i=jの行列を正方行列と呼び、i=jの成分を主対角成分と呼び、主対角成分以外0の正方行列を対角行列と呼ぶ。

0-2.i×jの行列Mをj×iの行列M.trans()にしたのがMの転置行列という

○○○○○|M00○○M10○○○...○M(n-1)0|

○○○○○|M01○○M11○○○...○M(n-1)1|

M.trans()=|...○○○○...○○○○...○...|

○○○○○|M0(n-1)○M1(n-1)○...○M(n-1)(n-1)|




・基本性質1
・行列にスカラー(実数)aを掛ける

1-1.

○○|aM00○○○aM01○○...○aM0(n-1)|

○○|aM10○○○aM11○○...○aM1(n-1)|

aM=|...○○○○○...○○○○...○...|

○○|aM(n-1)0○aM(n-1)1○...○aM(n-1)(n-1)|


また、後述の同次行列のときは、同次座標はa倍をせずに

1-2.

○○|M00○○○M01○○...○M0(n-1)|

○○|M10○○○aM11○○...○aM1(n-1)|

aM=|...○○○○...○○○○...○...|

○○|M(n-1)0○aM(n-1)1○...○aM(n-1)(n-1)|


とします。



・基本性質2
・行列の和と差

2-1.

○○○|M00±N00○○○○M01±N01○○○○...○M0(n-1)±N0(n-1)|

○○○|M10±N10○○○○M11±N11○○○○...○M1(n-1)±N1(n-1)|

M±N=|...○○○○○○○○...○○○○○○○○...○...|

○○○|M(n-1)0±N(n-1)0○M(n-1)1±N(n-1)1○...○M(n-1)(n-1)±N(n-1)(n-1)|




・基本性質3
・行列の積
MのiとNのjが等しいときMNを掛け合わせることができ、その成分の計算は

3-1.(MN)ij=Σ↓(k=0)↑(m-1) MikNkj

3-2.単位行列IとはMI=IM=Mが成立する正方行列であり、それは

○|1○0○...○0|

○|0○1○...○0|

I=|...○...○...○...|

○|0○0○...○1|


である。



・基本性質4
任意のスカラーa,bと任意の行列M,N,Oにおいて

4-1.M+N=N+M
4-2.(M+N)+O=M+(N+O)
4-3.a(bM)=(ab)M
4-4.a(M+N)=aM+aN
4-5.(a+b)M=aM+bM
4-6.(aM)N=a(MN)
4-7.(MN)O=M(NO)
4-8.(MN).trans()=N.trans()M.trans()



・基本性質5
・連立方程式

例えば
x-y+z=-5
2x+y-3z=19
3x+2y-z=16
の形で与えられていれば
|1 -1 1||x| |-5|
|2 1 -3||y|=|19|
|3 2 -1||z| |16|
とおけて、「行列 連立方程式解法」ででもググって解けば
|x| |2|
|y|=|3|
|z| |-4|
と解ける。



・基本性質6
・逆行列
MM^-1=M^-1M=Iを満たすM^-1が存在するとき、行列Mを正則行列と呼ぶ。
行列M^-1を行列Mの逆行列と呼ぶ。また、逆行列を持たない行列は非正則行列という。

6-1.0だけの行や列を持つ行列は正則ではない
6-2.行列Mが正則であればM.trans()も正則である
6-3.M,Nが正則であれば、積MNも正則であり、(MN)^-1=N^-1M^-1も成立する

逆行列の成分の求め方は「逆行列 求め方」でググってください。



・基本性質7
・行列式
正方行列の行列式は、成分から得られるスカラー量であり、逆行列があるかないかの判定等に使われる。

行列式の求め方は「行列式 求め方」でググってください。



・基本性質8
・固有値、固有ベクトル、対角化
これらを使って対角化をして、行列計算の簡略化等に使われます。

固有値、固有ベクトル、対角化の求め方は「固有値 固有ベクトル 対角化 求め方」でググってください。



・基本性質9
・直交行列
9-1.正則な正方行列MがM^-1=M.trans()を満足するとき、Mを直交行列と呼ぶ
9-2.ベクトル群V0,V1,...,V(n-1)が正規直交ならば、これらを順番に行や列に使った行列は直交行列である
9-3.直交行列Mは長さと角度を保存する



・基本性質10
・行列のトレース
10-1.トレースは同次座標成分以外の主対角成分の和である



・基本性質11
・スケーリング変換
それは以下のようになる。
11-1.

○|a○○0○...○0|

○|0○○b○...○0|

P'=|...○...○...○...||P|

○|0○○0○...○n|




・基本性質12
・任意軸周りの回転変換

単位ベクトルAの軸周りにベクトルPをθ回転するとき
ベクトルのページ、その1の8-1,8-2とAが単位ベクトルより

P.proj(A)=(A・P)A
P.prep(A)=P-(A・P)A

ここでP.prep(A)をθ回転したいのだから、A,Pの直交が外積ということも考えて

(P-(A・P)A)cosθ+(A×P)sinθ

これにP.proj(A)を加え

P'=Pcosθ+(A×P)sinθ+A(A・P)(1-cosθ)

以上より、まとめて、任意軸周りの回転変換は

12-1.
s=sinθ,c=cosθ,c1=1-cとするとき

○○○○○|c+A0^2c1○○A0A1c1-A2s○A0A2c1+A1s|

P.rot(A,θ)=|A1A0c1+A2s○c+A1^2c1○○A1A2c1-A0s||P|

○○○○○|A2A0c1-A1s○A2A1c1+A0s○c+A2^2c1|


また、これは回転ベクトルRV[θ,R0,R1,R2]で|R|のノルムが1のときの変換と同じである。
この逆変換はロドリゲスの公式より、3×3行列mとすると

12-2.
tr = m.trace()
if(tr < -1.0) {
 m = m/(-tr)
 tr = m.trace()
}
θ = acos((tr - 1) / 2)
R = [m21○-○m12,
○○m02○-○m20,
○○m10○-○m01]

である。



・基本性質13
・同次座標

3次元ベクトルに対し3×3行列で扱うと平行移動成分が保存しにくい(?できない?)。
したがって、その簡潔な表現のため余剰次元wを付け加えたのが同次座標である。

13-1.行列M、ベクトルP、平行移動ベクトルT(もちろん、これらは同次ではない)とすると同次座標変換Nは次で与えられる

P'=MP+Tという形式で変換したいから

○|1○○0○○0○○○0|

○|T0○M00○M01○M02|

N=|T1○M10○M11○M12|

○|T2○M20○M21○M22|


Mijは回転変換成分
Tkは平行移動成分
N0行はw成分行
N1行は回転行列(ローカル座標系)のx軸成分行
N2行は回転行列(ローカル座標系)のy軸成分行
N3行は回転行列(ローカル座標系)のz軸成分行

となる。

13-2.また、任意の同次ベクトルV、同次行列Mは、V0、M00、つまり、w(13-1.では1)で全体を割ってやれば、標準化できる。


・基本性質14
・回転ベクトル

後述のクォータニオンとも深い関係があるが
同次座標(4×4)は回転軸ベクトル(3)と回転角度の4つで保存できる
それを基本性質12を基に求めたものが回転ベクトルである

12-2項でも触れたが
回転行列の逆変換はロドリゲスの公式より、3×3行列mとすると

12-2.
tr = m.trace()
if(tr < -1.0) {
 m = m/(-tr)
 tr = m.trace()
}
θ = acos((tr - 1) / 2)
R = [m21○-○m12,
○○m02○-○m20,
○○m10○-○m01]

である。

Rがゼロベクトルになると回転ベクトルが求められないので
その時は回転行列からクォータニオンに変換して
クォータニオンの回転軸と回転角度を求めるといい

回転ベクトルを回転行列にするのは以下である

12-1.
s=sinθ,c=cosθ,c1=1-cとするとき

○○○○○|c+A0^2c1○○A0A1c1-A2s○A0A2c1+A1s|

P.rot(A,θ)=|A1A0c1+A2s○c+A1^2c1○○A1A2c1-A0s||P|

○○○○○|A2A0c1-A1s○A2A1c1+A0s○c+A2^2c1|








 ■■■ 3Dプログラミング入門講座 ■■■ 
NAS6LIB
ポリゴンテスト解説・x3dom使い方
その1:ベクトル
その2:行列
その3:クォータニオン
その4:基本総復習・実践
その5:応用その1・メッシュアニメーション、動的テクスチャ
その6:応用その2・GLSL、カスタムシェーダー、キーボード、ファイル
その7:応用その3・ゲームプログラミング、タグの動的追加
その8:応用その4・GLSL、シェーダー、その2
その9:物理演算その1・電卓で相対性理論を解く方法
その10:物理演算その2・相対性理論的ニュートン力学
その11:物理演算その3・ケプラー方程式で惑星軌道シミュレーターを作る

その12:物理演算その4・ルンゲクッタ法で作った 相対性理論的ニュートン力学物理エンジンで惑星軌道シミュレーターを作る

その13:経路探索(A*:A-STAR)&巡回セールスマン問題 : 巨大サイズ : くろにゃんこ

その14:プログラミングにおける配列テーブルテクニック
その15:javascriptのクラス活用法
その16:透視射影公式テスト

その17:ケプラー方程式カプセルライブラリ使用法
その18:CSVファイル処理
その19:物理演算その5・重力多体問題
その20:同次座標について(3D座標系の基本の基本)
その21:おさらいコモンクラスの宣言
その22:物理エンジンライブラリ解説(ケプラー方程式・ルンゲクッタ・相対論的万有引力)


 ■■■ THREE.JSプログラミング講座 ■■■ 
THREE.JSテスト解説・THREE.JS使い方
THREE.JS examplesをいじってみた(フレネル反射透過シェーダー)

THREE.JS (半透明シェーダー)

THREE.JS 3D演算で必要な計算(具体例)★とても重要★
THREE.JS THREE-VRM をいじってみた



<<prev ベクトル : クォータニオン next>>





戻る