XNA Transformation (RHS)

Matrix A = new Matrix(1.0f, 0.0f, 0.0f, 0.0f, // row1
0.0f, 2.0f, 0.0f, 0.0f, // row2

0.0f, 0.0f, 4.0f, 0.0f, // row3
1.0f, 2.0f, 3.0f, 1.0f); // row4
System.Diagnostics.Trace.WriteLine(A);
// { {M11:1 M12:0 M13:0 M14:0}
// {M21:0 M22:2 M23:0 M24:0}
// {M31:0 M32:0 M33:4 M34:0}
//
{M41:1 M42:2 M43:3 M44:1} }


Matrix B = new Matrix(1.0f, 0.0f, 0.0f, 0.0f, // row1
0.0f, 2.0f, 0.0f, 0.0f, // row2
0.0f, 0.0f, 4.0f, 0.0f, // row3
2.0f, 2.0f, 2.0f, 1.0f); // row4
System.Diagnostics.Trace.WriteLine(B);
// { {M11:1 M12:0 M13:0 M14:0}
// {M21:0 M22:1 M23:0 M24:0}
// {M31:0 M32:0 M33:1 M34:0}
// {M41:2 M42:2 M43:2 M44:1} }


Matrix C = A * B;
System.Diagnostics.Trace.WriteLine(C);
// { {M11:1 M12:0 M13:0 M14:0}
// {M21:0 M22:2 M23:0 M24:0}
// {M31:0 M32:0 M33:4 M34:0}
// {M41:3 M42:4 M43:5 M44:1} }


Matrix D = B * A;
System.Diagnostics.Trace.WriteLine(D);
// { {M11:1 M12:0 M13:0 M14:0}
// {M21:0 M22:2 M23:0 M24:0}
// {M31:0 M32:0 M33:4 M34:0}
// {M41:3 M42:6 M43:11 M44:1} }


Matrix E = Matrix.Invert(A);
System.Diagnostics.Trace.WriteLine(E);
// { {M11:1 M12:0 M13:0 M14:0}
// {M21:0 M22:0.5 M23:0 M24:0}
// {M31:0 M32:0 M33:0.25 M34:0}
// {M41:-1 M42:-1 M43:-0.75 M44:1} }


Matrix I = E * A; // I (Identity Matrix) = A-1 * A
System.Diagnostics.Trace.WriteLine(I);
// { {M11:1 M12:0 M13:0 M14:0}
// {M21:0 M22:1 M23:0 M24:0}
// {M31:0 M32:0 M33:1 M34:0}
// {M41:0 M42:0 M43:0 M44:1} }


// p’ = p * M (XNA uses Row-Major Order)
Vector3 p = new Vector3(1.0f, 0.0f, 0.0f);
System.Diagnostics.Trace.WriteLine(p);
// {X:1 Y:0 Z:0}


Vector3 q = Vector3.Transform(p, A); // q = p * A
System.Diagnostics.Trace.WriteLine(q);
// {X:2 Y:2 Z:3}


Vector3 r = Vector3.Transform(p, B); // r = p * B
System.Diagnostics.Trace.WriteLine(r);
// {X:3 Y:2 Z:2}


Vector3 s = Vector3.Transform(p, C); // q = p * A * B (A 먼저, B 나중)
System.Diagnostics.Trace.WriteLine(s);
// {X:4 Y:4 Z:5}


Vector3 t = Vector3.Transform(p, D); // r = p * B * A (B 먼저, A 나중)
System.Diagnostics.Trace.WriteLine(t);
// {X:4 Y:6 Z:11}

Matrix Tx,Ty,Tz;
Tx = Matrix.CreateTranslation(2, 0, 0); // RHS x+ right
Ty = Matrix.CreateTranslation(0, 2, 0); // RHS y+ up
Tz = Matrix.CreateTranslation(0, 0, 2); // RHS z+ in front of screen

System.Diagnostics.Trace.WriteLine(Tx);
// { {M11:1 M12:0 M13:0 M14:0}
// {M21:0 M22:1 M23:0 M24:0}
// {M31:0 M32:0 M33:1 M34:0}
//
{M41:2 M42:0 M43:0 M44:1} }

Matrix Rx,Ry,Rz, Ra; // XNA uses RADIAN angle
Rx = Matrix.CreateRotationX(MathHelper.ToRadians(30.0)); // RHS x+ (Y->Z rotation)
Ry = Matrix.CreateRotationY(MathHelper.ToRadians(60.0)); // RHS y+ (Z->X rotation)
Rz = Matrix.CreateRotationZ(MathHelper.ToRadians(45.0)); // RHS z+ (X->Y rotation)
Ra = Matrix.CreateFromAxisAngle(new Vector3(1.0f, 1.0f, 1.0f), MathHelper.ToRadians(45.0)); // RHS (arbitrary axis)

System.Diagnostics.Trace.WriteLine(Rx);
//{ {M11:1 M12:0 M13:0 M14:0}
// {M21:0 M22:0.8660254 M23:0.5 M24:0}
// {M31:0 M32:-0.5 M33:0.8660254 M34:0}
// {M41:0 M42:0 M43:0 M44:1} }

System.Diagnostics.Trace.WriteLine(Ry);
//{ {M11:0.5 M12:0 M13:-0.8660254 M14:0}
// {M21:0 M22:1 M23:0 M24:0}
// {M31:0.8660254 M32:0 M33:0.5 M34:0}
// {M41:0 M42:0 M43:0 M44:1} }


System.Diagnostics.Trace.WriteLine(Rz);
//{ {M11:0.7071068 M12:0.7071068 M13:0 M14:0}
// {M21:-0.7071068 M22:0.7071068 M23:0 M24:0}
// {M31:0 M32:0 M33:1 M34:0}
// {M41:0 M42:0 M43:0 M44:1} }


System.Diagnostics.Trace.WriteLine(Ra);
// { {M11:1 M12:1 M13:-0.4142135 M14:0}
// {M21:-0.4142135 M22:1 M23:1 M24:0}
// {M31:1 M32:-0.4142135 M33:1 M34:0}
// {M41:0 M42:0 M43:0 M44:1} }


Matrix Sx,Sy,Sz;
Sx = Matrix.CreateScale(2, 1, 1); // RHS
Sy = Matrix.CreateScale(1, 2, 1); // RHS
Sz = Matrix.CreateScale(1, 1, 2); // RHS

System.Diagnostics.Trace.WriteLine(Sy);
// { {M11:1 M12:0 M13:0 M14:0}
// {M21:0 M22:2 M23:0 M24:0}
// {M31:0 M32:0 M33:1 M34:0}
// {M41:0 M42:0 M43:0 M44:1} }

// p’ = p * M1 * M2 * M3 (XNA uses Row-Major Order)
Matrix TR, RT, TRS, SRT
TR = Tx * Rz; // Translate X, and then Rotate Z
RT = Rz * Tx; // Rotate Z, and then Translate X
TRS = Tx * Rz * Sy; // Translate X, and then Rotate Z, and then Scale Y
SRT =
Sy * Rz * Tx; // Scale Y, and then Rotate Z, and then Translate X

System.Diagnostics.Trace.WriteLine(TR);
// { {M11:0.7071068 M12:0.7071068 M13:0 M14:0}
// {M21:-0.7071068 M22:0.7071068 M23:0 M24:0}
// {M31:0 M32:0 M33:1 M34:0}
// {M41:1.414214 M42:1.414214 M43:0 M44:1} }

System.Diagnostics.Trace.WriteLine(RT);
// { {M11:0.7071068 M12:0.7071068 M13:0 M14:0}
// {M21:-0.7071068 M22:0.7071068 M23:0 M24:0}
// {M31:0 M32:0 M33:1 M34:0}
// {M41:2 M42:0 M43:0 M44:1} }

System.Diagnostics.Trace.WriteLine(TRS);
// { {M11:0.7071068 M12:1.414214 M13:0 M14:0}
// {M21:-0.7071068 M22:1.414214 M23:0 M24:0}
// {M31:0 M32:0 M33:1 M34:0}
// {M41:1.414214 M42:2.828427 M43:0 M44:1} }

System.Diagnostics.Trace.WriteLine(SRT);
// { {M11:0.7071068 M12:0.7071068 M13:0 M14:0}
// {M21:-1.414214 M22:1.414214 M23:0 M24:0}
// {M31:0 M32:0 M33:1 M34:0}
// {M41:2 M42:0 M43:0 M44:1} }