public Matrix(float amount, MatrixInitializationType type) { _rowCount = 4; _columnCount = 4; _values = new float[16]; var cos = Mathf.Cos(amount); var sin = Mathf.Sin(amount); switch (type) { case MatrixInitializationType.RotateXVector: _values[0] = 1; _values[5] = cos; _values[6] = -sin; _values[9] = sin; _values[10] = cos; break; case MatrixInitializationType.RotateYVector: _values[5] = 1; _values[0] = cos; _values[2] = sin; _values[8] = -sin; _values[10] = cos; break; case MatrixInitializationType.RotateZVector: _values[10] = 1; _values[0] = cos; _values[1] = -sin; _values[4] = sin; _values[5] = cos; break; case MatrixInitializationType.ShearVector: _values[0] = 1; _values[5] = 1; _values[10] = 1; _values[15] = 1; _values[1] = amount; break; case MatrixInitializationType.ReflectionVector: _values[0] = -1; _values[5] = 1; _values[10] = 1; _values[15] = 1; break; } }
public Matrix(Coordinate coordinate, MatrixInitializationType type) { _rowCount = 4; _columnCount = 4; _values = new float[16]; switch (type) { case MatrixInitializationType.TranslateVector: _values[0] = 1; _values[5] = 1; _values[10] = 1; _values[3] = coordinate.X; _values[7] = coordinate.Y; _values[11] = coordinate.Z; _values[15] = coordinate.W; break; case MatrixInitializationType.ScaleVector: _values[0] = coordinate.X; _values[5] = coordinate.Y; _values[10] = coordinate.Z; _values[15] = coordinate.W; break; case MatrixInitializationType.QuaternionVector: _values[0] = 1 - 2 * Mathf.Pow(coordinate.Y, 2) - 2 * Mathf.Pow(coordinate.Z, 2); _values[1] = 2 * coordinate.X * coordinate.Y - 2 * coordinate.W * coordinate.Z; _values[2] = 2 * coordinate.X * coordinate.Z + 2 * coordinate.W * coordinate.Y; _values[4] = 2 * coordinate.X * coordinate.Y + 2 * coordinate.W * coordinate.Z; _values[5] = 1 - 2 * Mathf.Pow(coordinate.X, 2) - 2 * Mathf.Pow(coordinate.Z, 2); _values[6] = 2 * coordinate.Y * coordinate.Z - 2 * coordinate.W * coordinate.X; _values[8] = 2 * coordinate.X * coordinate.Z - 2 * coordinate.W * coordinate.Y; _values[9] = 2 * coordinate.Y * coordinate.Z + 2 * coordinate.W * coordinate.X; _values[10] = 1 - 2 * Mathf.Pow(coordinate.X, 2) - 2 * Mathf.Pow(coordinate.Y, 2); _values[15] = 1; break; } }