箱庭ハーブblog

7年目プログラマの趣味の小部屋

行列と3Dモデル

行列、変換行列、MATRIX、Matrix、matrix、アフィン変換

2013年6月11日 追記
若干書き直したよ!





3Dゲームをプログラムしようと思ったら、行列の使い方は避けては通れません。

行列の操作の概念自体は数Cにありますから高校レベルですので、恐れず覚えましょう。
(記事は線形代数の教科書を引っ張り出してますが…w)

【1、1時間でわかる3Dゲームと行列】
3次元上の座標を表したり、
移動操作を表したり、
原点に対する回転操作を表したり、
原点に対する拡大縮小(スケーリング)操作を表したりは、4*4行列のみで表せます
つまり操作と座標の両方を、同じ土俵で扱うことが出来る

まずは行列自体の見方と単位行列について

    1 2...
    列
    目
    ↓
1行目→1000
2   0100
    0010
    0001
これは移動、回転、スケーリング操作が一切ないことを表せます
数学用語で単位行列と言い、普通の数の計算の「1」に相当します

【平行移動】
100X
010Y
001Z
0001 (縦ベクトルに左からかける場合)

1000
0100
0010
XYZ1 (横ベクトルに右からかける場合)
これらは、移動操作を表せます
この行列は、移動行列とか平行行列とか平行移動行列とか呼ばれたりします

【スケーリング】
X000
0Y00
00Z0
0001
これは、(X,Y,Z)だけスケーリングする操作を表せます
この行列は、スケール行列とか呼ばれたりします

【回転】
cos -sin 0 0
sin cos 0 0
0  0  1 0
0  0  0 1 (縦ベクトルに左からかける場合。正のx軸から正のy軸へ向かうz軸回転)

cos sin 0 0
-sin cos 0 0
0  0  1 0
0  0  0 1 (横ベクトルに右からかける場合。同上)
これは、XY平面(Z軸による)回転を表せます
同様に
1行目3行目、1列目3列目に三角関数がいるものはy軸回転
2行目3行目、2列目3列目に三角関数がいるものはx軸回転
を表します。
これらの行列は、回転行列と呼ばれたりします


【例】
ある3DモデルをX方向だけ200%拡大して、
X軸から+45度回転させた後、
ゲーム上(普通ワールド座標とか呼ばれる)の(X,Y,Z)=(80,90,0)に配置したい場合、
3Dモデルの各頂点の座標(x,y,z)=(a,b,c) に対して、以下のようにします

 平行行列 × X軸回転行列 ×  X軸200%スケーリング行列 × (a, b ,c , 1)
(abc1ベクトルを縦並びのベクトルとして計算する場合)

(a,b,c,1) × X軸200%スケーリング行列 ×  X軸回転行列 × 平行行列
(abc1ベクトルを横並びのベクトルとして計算する場合)

平行行列、回転行列、スケーリング行列、あるいはそれらの掛け算の結果は
変換行列と総称されます
実際には3Dモデルのローカル座標を元に旋回・ピッチ上げ下げ・移動をすると思うので
ローカル座標の軸を取得してから移動量や姿勢を求めて、変換行列を生成するのが直感的

変換行列からは3Dのローカル座標がどちらを向いているかを取得できるので(下記参照)
http://msdn.microsoft.com/ja-jp/cc998621.aspx
参考にしてください

・・・
ローカル軸をクォータにオンを使わずに回転させる方法が思い出せない…
オレオレエンジンはクォータニオン経由してしてるので、どうしましょう…




以下雑学
------------------------------------------------------------------------------------------------
コラム 行列って摩訶不思議で面白い!

行列は様々なことに活用できます
数Cで習う時、行列は以下の4つを習うと思います
1、行列の基本。行列の1(単位行列)、行列の1/a(逆行列)、足し算、掛け算、AB ≠ BAであること
2、2*2行列と2次元ベクトルで、なぜか中学校で習った2元1次連立方程式が解けること
3、変な数式で、なぜか逆行列が簡単に求められること
4、任意の点を、原点を始点に回転した位置を求められる回転行列なるものがあること

これらはそのまま概念を拡張して3*3行列、4*4行列にすると、上手く活用できます

【1つ目】
行列をうまく使うと、「n元1次n連立方程式」を解けるようになります
またn*n行列A × ベクトルaの代わりに(A a)行列を使い、「行基本変形」で解く方法があります
さらに、n*m行列に拡張され「n元1次m連立方程式」の関係式を出せるようになります
なお、(A a)のように作った行列をA、aに対する拡大行列と言います

【2つ目】
逆行列の際に登場する「ad-bc」を拡張して、行列式が登場します

【3つ目】
正則行列と基本行列の概念が加わり、正則行列は基本行列の掛け算で表現できることがわかります
正則行列は、逆行列を持つ行列のことです
基本行列は、単位行列の成分のどこか一つだけ好きな数字に変えた行列です

【4つ目】
2次元ベクトルや3次元ベクトルに対して行列をかけることが
ベクトルの回転、スケーリングを表せることがわかります
これらは当然逆行列を持つので、正則です

【5つ目】
正則行列の拡大係数行列により、行列でベクトルの平行移動が表せることがわかります

【6つ目】
【3つ目】【4つ目】【5つ目】などを踏まえると、3次元上の全ての配置は
平行移動行列(位置)、スケーリング行列(大きさ)、回転行列(姿勢)で表すことができます

【7つ目】
任意の姿勢を求めるには、オイラー角による方法と、クォータにオンによる方法があります
ただしオイラー角と回転行列の相互算出は微妙な問題を含みます
------------------------------------------------------------------------------------------------

個人メモ
縦ベクトル方式は、平行移動も縦に並ぶ。回転方向は-sin行からsin行へ向かう
横ベクトル方式は、平行移動も横に並ぶ。回転方向は-sin列からsin列へ向かう
msdnでは、一貫して横ベクトル方式で説明している。左が先、右が後
3Dモデル × ワールド変換行列
3Dモデル × スケーリング × 回転 × 平行移動
コメント
ブログやっていらしたんですね。ちょこちょこ見に来ることにします。
おひさーw
PAGETOPへ

コメント送信

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード

パスワードを入れておかないと、コメントの再編集ができません!

フリーエリア

takemori
Twitter : @takemori_kondo

1. Unityと戯れてます
2. Cake3は劣化じゃないRails

iOS
coming soon...

Windows
Html Editor - Nazuna
Managed DirectX サンプル集

beginning since
2006.08.17
renewaled on
2011.06.03

最新コメント

[2018/11/20 スーパーコピーブランド専門店]
[2013/06/14 ミューネ]
[2012/08/30 ノートPC]