行列演算
行列演算
- 正方行列とは行数と列数が等しい行列を言う(n×n型の行列)。4×4の正方行列の次数は4となる。unityが標準クラスとして持っているのはこれ
- 行列の足し算、引き算では行列が同じ型(互いに4×4の行列等)である必要がある。その和を求めるには対応する要素同士を足し合わせる
- unityのMatrix4x4には足し算、引き算の機能は無い
こちらも合わせて参考にする事:Matrix4x4クラスのメモ
Matrix4x4関連のヘルパー関数
unityのMatrix4x4ではマトリックス同士の足し算、引き算、スカラー倍の計算がサポートされていない
以下のサンプルコードはそれを補助するものである
using UnityEngine;
using System.Collections;
public static class MatrixCalc
{
public static Matrix4x4 Matrix4x4Scalar (Matrix4x4 matrixA, float x) { Matrix4x4 answer; answer = Matrix4x4.zero; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { answer [i, j] = matrixA [i, j]*x; } } return answer; }
public static Matrix4x4 Matrix4x4Plus (Matrix4x4 matrixA, Matrix4x4 matrixB) { Matrix4x4 answer; answer = Matrix4x4.zero; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { answer [i, j] = matrixA [i, j] + matrixB [i, j]; } } return answer; } public static Matrix4x4 Matrix4x4Minus (Matrix4x4 matrixA, Matrix4x4 matrixB) { Matrix4x4 answer; answer = Matrix4x4.zero; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { answer [i, j] = matrixA [i, j] - matrixB [i, j]; } } return answer; }
}
/// <summary> /// Random matrix. /// 乱数をマトリックスにセットする /// int及びfloatが可能。min最小値・max最大値・identityデータを3Dで利用しやすくする /// </summary>
public static class RandomMatrix
{
public static Matrix4x4 Set(int min,int max,bool identity=false) { Matrix4x4 randomMat; randomMat = Matrix4x4.zero; for (int i = 0; i < 16; i++) { randomMat[i] = Random.Range(min,max); } if(identity){randomMat = SetIdentity(randomMat);} return randomMat; } public static Matrix4x4 Set(float min,float max,bool identity=false) { Matrix4x4 randomMat; randomMat = Matrix4x4.zero; for (int i = 0; i < 16; i++) { randomMat[i] = Random.Range(min,max); } if(identity){randomMat = SetIdentity(randomMat);} return randomMat; } public static Matrix4x4 SetIdentity (Matrix4x4 randomMat) { randomMat.m30 =0; randomMat.m31 =0; randomMat.m32 =0; randomMat.m33 =1; randomMat.m03 =0; randomMat.m13 =0; randomMat.m23 =0; // randomMat.m00 =1; // randomMat.m11 =1; // randomMat.m22 =1; return randomMat; }
}
<ヘルパー関数を使った行列の方程式の解>
行列A
4 | 5 |
1 | -2 |
行列B
0 | -1 |
-3 | 2 |
が与えられた時、2X=3A-Bを満たす行列Xを求める
Matrix4x4 matA,matB,matX;
void Start () {
matA.m00=4; matA.m01=5; matA.m10=1; matA.m11=-2;
matB.m00=0; matB.m01=-1; matB.m10=-3; matB.m11=2;
print(matA); print(matB);
matX = MatrixCalc.Matrix4x4Scalar( MatrixCalc.Matrix4x4Minus(MatrixCalc.Matrix4x4Scalar(matA,3),matB),1.0f/2.0f); print(matX); }
行列X
6 | 8 |
3 | -4 |
になる
- 最終更新:2013-12-03 22:57:13