예제 #1
0
        public static Matrix3D CreateFromQuaternion(Quaternion3D quaternion)
        {
            Matrix3D matrix = new Matrix3D();
            double   num9   = quaternion.X * quaternion.X;
            double   num8   = quaternion.Y * quaternion.Y;
            double   num7   = quaternion.Z * quaternion.Z;
            double   num6   = quaternion.X * quaternion.Y;
            double   num5   = quaternion.Z * quaternion.W;
            double   num4   = quaternion.Z * quaternion.X;
            double   num3   = quaternion.Y * quaternion.W;
            double   num2   = quaternion.Y * quaternion.Z;
            double   num    = quaternion.X * quaternion.W;

            matrix.M11     = 1f - (2f * (num8 + num7));
            matrix.M12     = 2f * (num6 + num5);
            matrix.M13     = 2f * (num4 - num3);
            matrix.M14     = 0f;
            matrix.M21     = 2f * (num6 - num5);
            matrix.M22     = 1f - (2f * (num7 + num9));
            matrix.M23     = 2f * (num2 + num);
            matrix.M24     = 0f;
            matrix.M31     = 2f * (num4 + num3);
            matrix.M32     = 2f * (num2 - num);
            matrix.M33     = 1f - (2f * (num8 + num9));
            matrix.M34     = 0f;
            matrix.OffsetX = 0f;
            matrix.OffsetY = 0f;
            matrix.OffsetZ = 0f;
            matrix.M44     = 1f;
            return(matrix);
        }
예제 #2
0
        /*
         * public Quaternion3D(Vector3D axisOfRotation, double angleInDegrees)
         * {
         *  angleInDegrees = angleInDegrees % 360.0F;
         *  double num2 = angleInDegrees * 0.017453292519943295F;
         *  double length = axisOfRotation.Length;
         *  if (length == 0.0)
         *  {
         *      throw new InvalidOperationException("error vector");
         *  }
         *  Vector3D vectord = (Vector3D)((axisOfRotation / length) * System.Math.Sin(0.5 * num2));
         *  this.X = vectord.X;
         *  this.Y = vectord.Y;
         *  this.Z = vectord.Z;
         *  this.W = System.Math.Cos(0.5 * num2);
         *  //this._isNotDistinguishedIdentity = true;
         * }
         */

        public static Quaternion3D CreateFromAxisAngle(Vector3D axis, double angle)
        {
            Quaternion3D quaternion = new Quaternion3D();
            double       num2       = angle * 0.5;
            double       num        = System.Math.Sin(num2);
            double       num3       = System.Math.Cos(num2);

            quaternion.X = axis.X * num;
            quaternion.Y = axis.Y * num;
            quaternion.Z = axis.Z * num;
            quaternion.W = num3;
            return(quaternion);
        }
예제 #3
0
        public static Quaternion3D operator *(Quaternion3D quaternion1, Quaternion3D quaternion2)
        {
            Quaternion3D quaternion = new Quaternion3D();
            double       x          = quaternion1.X;
            double       y          = quaternion1.Y;
            double       z          = quaternion1.Z;
            double       w          = quaternion1.W;
            double       num4       = quaternion2.X;
            double       num3       = quaternion2.Y;
            double       num2       = quaternion2.Z;
            double       num        = quaternion2.W;
            double       num12      = (y * num2) - (z * num3);
            double       num11      = (z * num4) - (x * num2);
            double       num10      = (x * num3) - (y * num4);
            double       num9       = ((x * num4) + (y * num3)) + (z * num2);

            quaternion.X = ((x * num) + (num4 * w)) + num12;
            quaternion.Y = ((y * num) + (num3 * w)) + num11;
            quaternion.Z = ((z * num) + (num2 * w)) + num10;
            quaternion.W = (w * num) - num9;
            return(quaternion);
        }
예제 #4
0
 static Quaternion3D()
 {
     _identity = new Quaternion3D(0, 0, 0, 1);
 }