Codin’ In The Free World

2007-03-15

[][] 座標変換 #2 Matrix3Dクラスで行列操作

Papervision3Dの行列操作クラスを使ってみる

コンストラクタ
var matrix:Matrix3D = new Matrix3D([
  a, b, c, d,
  e, f, g, h,
  i, j, k, l
]);

同次座標を使うので4x4の行列になるが

最後の行は 0, 0, 0, 1 で固定。

したがって、コンストラクタでは

最初の3行4列のそれぞれの値を指定すればいい。


よく使う行列の取得

Identity Matrix
var identity:Matrix3D = Matrix3D.IDENTITY;
1000
0100
0010
0001
X軸の回転行列

X軸で30度回転するMatrixを取得する

var xMat:Matrix3d = Matrix3D.rotationX( 30 * Math.PI / 180 );
1000
0cosθ-sinθ0
0sinθcosθ0
0001

Y軸の回転行列

Y軸で30度回転するMatrixを取得する

var yMat:Matrix3d = Matrix3D.rotationY( 30 * Math.PI / 180 );
cosθ0-sinθ0
0100
sinθ0cosθ0
0001

Z軸の回転行列

Z軸で30度回転するMatrixを取得する

var zMat:Matrix3d = Matrix3D.rotationZ( 30 * Math.PI / 180 );
cosθ-sinθ00
sinθcosθ00
0010
0001
移動行列

X軸方向に3, Y軸方向に4, Z軸方向に5移動する行列を取得する

var transMatrix:Matrix3d = Matrix3d.translationMatrix( 3, 4, 5 );
100dx
010dy
001dz
0001
拡大縮小行列

X軸方向に2倍、Y軸方向に3倍、Z軸方向に4倍する行列を取得する

var scaleMatrix:Matrix3d = Matrix3d.scaleMatrix( 2, 3, 4 );
x000
0y00
00z0
0001

アクセサ

行列中の各値へのアクセス
matrix.n11 // 1行1列目の値
matrix.n12 // 1行2列目の値
matrix.n13 // 1行3列目の値
matrix.n14 // 1行4列目の値
matrix.n21 // 2行1列目の値
...
matrix.n34 // 3行4列目の値
行列式(determinant)の取得
var det:Number = matrix.det;

行列の演算

行列の加算
var addResult:Matrix3D = Matrix3D.add( matrix1, matrix2 );
行列をかける
var multiplied:Matrix3D = Matrix3D.multiply( matrix1, matrix2 );
行列の回転成分だけをかける
var multiplied:Matrix3D = Matrix3D.multiply3x3( matrix1, matrix2 );
行列を複製して新しい行列を取得する
var newMatrix:Matrix3D = Matrix3D.clone( originMatrix ); 
matrix1にmatrix2のデータをコピーする
matrix1.copy( matrix2 );
matrix1にmatrix2の回転成分だけコピーする
matrix1.copy3x3( matrix2 );

その他の操作

行列の対角成分の和(トレース)を取得
var matrixTrace:Number = Matrix3D.getTrace( matrix );
逆行列を取得
var inverseMatrix:Matrix3D = Matrix3D.inverse( matrix );

ゲーム開発のための数学・物理学入門  Beginning Math and Physics for Game Programmers
Wendy Stahler
ソフトバンククリエイティブ (2005/05/11)
売り上げランキング: 2170

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/lyokato/20070315/1173930715