示例#1
0
 /// <summary>
 /// creates a new matrix from a rotation matrix and a translation vector
 /// </summary>
 /// <param name="rot"></param>
 /// <param name="trans"></param>
 public Matrix4(Matrix3 rot, Vector3 trans)
 {
     A1 = rot.A1; B1 = rot.B1; C1 = rot.C1; D1 = trans.X;
     A2 = rot.A2; B2 = rot.B2; C2 = rot.C2; D2 = trans.Y;
     A3 = rot.A3; B3 = rot.B3; C3 = rot.C3; D3 = trans.Z;
     A4 = 0; B4 = 0; C4 = 0; D4 = 1.0f;
 }
示例#2
0
 /// <summary>
 /// creates a matrix from a Matrix3 object
 /// </summary>
 /// <param name="m">3x3 matrix</param>
 /// <returns>4x4 matrix</returns>
 public static Matrix4 From(Matrix3 m)
 {
     return new Matrix4(m.A1, m.A2, m.A3, 0, m.B1, m.B2, m.B3, 0, m.C1, m.C2, m.C3, 0, 0, 0, 0, 1);
 }
示例#3
0
 /// <summary>
 /// get 3x3 matrix from 4x4 matrix without specified column and row
 /// </summary>
 /// <param name="source">source matrix (4x4)</param>
 /// <param name="column">column to remove</param>
 /// <param name="row">row to remove</param>
 /// <returns>3x3 matrix from 4x4 matrix without specified column and row</returns>
 public static Matrix3 Minor(Matrix4 source, int column, int row)
 {
     int r = 0;
     Matrix3 result = new Matrix3();
     for (int iRow = 0; iRow < 4; iRow++)
     {
         int c = 0;
         if (iRow != row)
         {
             for (int iColumn = 0; iColumn < 4; iColumn++)
             {
                 if (iColumn != column)
                 {
                     result[c, r] = source[iColumn, iRow];
                     c++;
                 }
             }
             r++;
         }
     }
     return result;
 }
示例#4
0
 /// <summary>
 /// returns the transposed matrix
 /// </summary>
 /// <param name="matrix">matrix to transpose</param>
 /// <returns>the transposed matrix</returns>
 public static Matrix3 Transpose(Matrix3 matrix)
 {
     Matrix3 m = new Matrix3();
     m.A1 = matrix.A1; m.A2 = matrix.B1; m.A3 = matrix.C1;
     m.B1 = matrix.A2; m.B2 = matrix.B2; m.B3 = matrix.C2;
     m.C1 = matrix.A3; m.C2 = matrix.B3; m.C3 = matrix.C3;
     return m;
 }
示例#5
0
        /// <summary>
        /// spherical interpolation between to matrices
        /// </summary>
        /// <param name="a">first matrix</param>
        /// <param name="b">second matrix</param>
        /// <param name="time">interpolation time [0..1]</param>
        /// <returns>interpolated matrix</returns>
        public static Matrix3 Slerp(Matrix3 a, Matrix3 b, float time)
        {
            Quaternion qa = a.Quaternion;
            Quaternion qb = b.Quaternion;

            Quaternion interpolated = Quaternion.Slerp(qa, qb, time);

            Matrix3 result = interpolated.Matrix;
            return result;
        }
示例#6
0
 /// <summary>
 /// builds scale matrix
 /// </summary>
 /// <param name="vec">value to scale</param>
 /// <returns>scale matrix</returns>
 public static Matrix3 Scaling(Vector3 vec)
 {
     Matrix3 m = new Matrix3();
     m.A1 = vec.X;
     m.B2 = vec.Y;
     m.C3 = vec.Z;
     return m;
 }
示例#7
0
 /// <summary>
 /// builds a rotation matrix for a given vector and an angle
 /// </summary>
 /// <param name="vec">to rotate around</param>
 /// <param name="angle">rotation angle</param>
 /// <returns>rotation matrix</returns>
 public static Matrix3 Rotation(Vector3 vec, float angle)
 {
     float c = Math.Trigonometry.Cos(angle);
     float s = Math.Trigonometry.Sin(angle);
     float t = 1 - c;
     Matrix3 m =
       new Matrix3(t * vec.X * vec.X + c, t * vec.X * vec.Y - s * vec.Z, t * vec.X * vec.Z + s * vec.Y,
       t * vec.X * vec.Y + s * vec.Z, t * vec.Y * vec.Y + c, t * vec.Y * vec.Z - s * vec.X,
       t * vec.X * vec.Z - s * vec.Y, t * vec.Y * vec.Z + s * vec.X, t * vec.Z * vec.Z + c);
     return Matrix3.Transpose(m);
 }
示例#8
0
        /// <summary>
        /// returns the rotation matrix for alpha, beta and gamma
        /// </summary>
        /// <param name="alpha">around x-Axis: yaw</param>
        /// <param name="beta">around y-Axis: pitch</param>
        /// <param name="gamma">around z-Axis: role</param>
        public static Matrix3 Rotation(float alpha, float beta, float gamma)
        {
            // some constants
            float sa = Math.Trigonometry.Sin(alpha);
            float ca = Math.Trigonometry.Cos(alpha);
            float sb = Math.Trigonometry.Sin(beta);
            float cb = Math.Trigonometry.Cos(beta);
            float sg = Math.Trigonometry.Sin(gamma);
            float cg = Math.Trigonometry.Cos(gamma);
            float sbsa = sb * sa;
            float sbca = sb * ca;

            Matrix3 m = new Matrix3();

            m.A1 = cg * cb;
            m.A2 = sg * cb;
            m.A3 = -sb;
            m.B1 = cg * sbsa - sg * ca;
            m.B2 = sg * sbsa + cg * ca;
            m.B3 = cb * sa;
            m.C1 = cg * sbca + sg * sa;
            m.C2 = sg * sbca - cg * sa;
            m.C3 = cb * ca;
            return m;
        }