/// <summary> /// <para>Returns the sum of two quaternions.</para> /// <para>Original signature is 'GLKQuaternion GLKQuaternionAdd ( GLKQuaternion quaternionLeft, GLKQuaternion quaternionRight );'</para> /// <para>Available in OS X x0.8 and later.</para> /// </summary> /// <param name="quaternionLeft">MISSING</param> /// <param name="quaternionRight">MISSING</param> /// <returns>A new quaternion.</returns> public static GLKQuaternion Add (GLKQuaternion quaternionLeft, GLKQuaternion quaternionRight) { GLKQuaternion q = new GLKQuaternion (quaternionLeft.x + quaternionRight.x, quaternionLeft.y + quaternionRight.y, quaternionLeft.z + quaternionRight.z, quaternionLeft.w + quaternionRight.w); return q; }
/// <summary> /// <para>Returns an inverse of a quaternion.</para> /// <para>Original signature is 'GLKQuaternion GLKQuaternionInvert ( GLKQuaternion quaternion );'</para> /// <para>Available in OS X x0.8 and later.</para> /// </summary> /// <param name="quaternion">MISSING</param> /// <returns>A new quaternion that is the inverse of the source quaternion.</returns> public static GLKQuaternion Invert (GLKQuaternion quaternion) { float scale = 1.0f / (quaternion.x * quaternion.x + quaternion.y * quaternion.y + quaternion.z * quaternion.z + quaternion.w * quaternion.w); GLKQuaternion q = new GLKQuaternion (-quaternion.x * scale, -quaternion.y * scale, -quaternion.z * scale, quaternion.w * scale); return q; }
/// <summary> /// <para>Returns a 4x4 matrix that performs a rotation based on a quaternion.</para> /// <para>Original signature is 'GLKMatrix4 GLKMatrix4MakeWithQuaternion ( GLKQuaternion quaternion );'</para> /// <para>Available in OS X v10.8 and later.</para> /// </summary> /// <param name="quaternion">MISSING</param> /// <returns>A new matrix that provides an equivalent rotation to that stored in the quaternion.</returns> public static GLKMatrix4 MakeWithQuaternion (GLKQuaternion quaternion) { quaternion = GLKQuaternion.Normalize (quaternion); float x = quaternion.x; float y = quaternion.y; float z = quaternion.z; float w = quaternion.w; float _2x = x + x; float _2y = y + y; float _2z = z + z; float _2w = w + w; GLKMatrix4 m = new GLKMatrix4 (1.0f - _2y * y - _2z * z, _2x * y + _2w * z, _2x * z - _2w * y, 0.0f, _2x * y - _2w * z, 1.0f - _2x * x - _2z * z, _2y * z + _2w * x, 0.0f, _2x * z + _2w * y, _2y * z - _2w * x, 1.0f - _2x * x - _2y * y, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); return m; }
/// <summary> /// <para>Returns the length of a quaternion.</para> /// <para>Original signature is 'float GLKQuaternionLength ( GLKQuaternion quaternion );'</para> /// <para>Available in OS X x0.8 and later.</para> /// </summary> /// <param name="quaternion">MISSING</param> /// <returns>The length of the quaternion.</returns> public static float Length (GLKQuaternion quaternion) { return (float)Math.Sqrt (quaternion.x * quaternion.x + quaternion.y * quaternion.y + quaternion.z * quaternion.z + quaternion.w * quaternion.w); }
/// <summary> /// <para>Returns the conjugate of a quaternion.</para> /// <para>Original signature is 'GLKQuaternion GLKQuaternionConjugate ( GLKQuaternion quaternion );'</para> /// <para>Available in OS X x0.8 and later.</para> /// </summary> /// <param name="quaternion">MISSING</param> /// <returns>A new quaternion that is the conjugate of the source quaternion.</returns> public static GLKQuaternion Conjugate (GLKQuaternion quaternion) { GLKQuaternion q = new GLKQuaternion (-quaternion.x, -quaternion.y, -quaternion.z, quaternion.w); return q; }
/// <summary> /// <para>Returns a new vector calculated by applying a quaternion rotation to a vector.</para> /// <para>Original signature is 'GLKVector4 GLKQuaternionRotateVector4 ( GLKQuaternion quaternion, GLKVector4 vector );'</para> /// <para>Available in OS X x0.8 and later.</para> /// </summary> /// <param name="quaternion">MISSING</param> /// <param name="vector">MISSING</param> /// <returns>A new vector.</returns> public static GLKVector4 RotateVector4 (GLKQuaternion quaternion, GLKVector4 vector) { GLKQuaternion rotatedQuaternion = Make (vector.x, vector.y, vector.z, 0.0f); rotatedQuaternion = Multiply (Multiply (quaternion, rotatedQuaternion), Invert (quaternion)); return GLKVector4.Make (rotatedQuaternion.x, rotatedQuaternion.y, rotatedQuaternion.z, vector.w); }
/// <summary> /// <para>Returns the difference between two quaternions.</para> /// <para>Original signature is 'GLKQuaternion GLKQuaternionSubtract ( GLKQuaternion quaternionLeft, GLKQuaternion quaternionRight );'</para> /// <para>Available in OS X x0.8 and later.</para> /// </summary> /// <param name="quaternionLeft">MISSING</param> /// <param name="quaternionRight">MISSING</param> /// <returns>A new quaternion.</returns> public static GLKQuaternion Subtract (GLKQuaternion quaternionLeft, GLKQuaternion quaternionRight) { GLKQuaternion q = new GLKQuaternion (quaternionLeft.x - quaternionRight.x, quaternionLeft.y - quaternionRight.y, quaternionLeft.z - quaternionRight.z, quaternionLeft.w - quaternionRight.w); return q; }
/// <summary> /// <para>Returns a normalized version of a quaternion.</para> /// <para>Original signature is 'GLKQuaternion GLKQuaternionNormalize ( GLKQuaternion quaternion );'</para> /// <para>Available in OS X x0.8 and later.</para> /// </summary> /// <param name="quaternion">MISSING</param> /// <returns>A new quaternion, normalized to have a length of 1.0.</returns> public static GLKQuaternion Normalize (GLKQuaternion quaternion) { float scale = 1.0f / Length (quaternion); GLKQuaternion q = new GLKQuaternion (quaternion.x * scale, quaternion.y * scale, quaternion.z * scale, quaternion.w * scale); return q; }
/// <summary> /// <para>Returns the product of two quaternions.</para> /// <para>Original signature is 'GLKQuaternion GLKQuaternionMultiply ( GLKQuaternion quaternionLeft, GLKQuaternion quaternionRight );'</para> /// <para>Available in OS X x0.8 and later.</para> /// </summary> /// <param name="quaternionLeft">MISSING</param> /// <param name="quaternionRight">MISSING</param> /// <returns>A new quaternion.</returns> public static GLKQuaternion Multiply (GLKQuaternion quaternionLeft, GLKQuaternion quaternionRight) { GLKQuaternion q = new GLKQuaternion (quaternionLeft.w * quaternionRight.x + quaternionLeft.x * quaternionRight.w + quaternionLeft.y * quaternionRight.z - quaternionLeft.z * quaternionRight.y, quaternionLeft.w * quaternionRight.y + quaternionLeft.y * quaternionRight.w + quaternionLeft.z * quaternionRight.x - quaternionLeft.x * quaternionRight.z, quaternionLeft.w * quaternionRight.z + quaternionLeft.z * quaternionRight.w + quaternionLeft.x * quaternionRight.y - quaternionLeft.y * quaternionRight.x, quaternionLeft.w * quaternionRight.w - quaternionLeft.x * quaternionRight.x - quaternionLeft.y * quaternionRight.y - quaternionLeft.z * quaternionRight.z); return q; }
/// <summary> /// <para>Returns a quaternion created from a vector and a scalar.</para> /// <para>Original signature is 'GLKQuaternion GLKQuaternionMakeWithVector3 ( GLKVector3 vector, float scalar );'</para> /// <para>Available in OS X x0.8 and later.</para> /// </summary> /// <param name="vector">MISSING</param> /// <param name="scalar">MISSING</param> /// <returns>A new quaternion.</returns> public static GLKQuaternion MakeWithVector3 (GLKVector3 vector, float scalar) { GLKQuaternion q = new GLKQuaternion (vector.x, vector.y, vector.z, scalar); return q; }
/// <summary> /// <para>Creates a quaternion that represents a rotation around an axis.</para> /// <para>Original signature is 'GLKQuaternion GLKQuaternionMakeWithAngleAndAxis ( float radians, float x, float y, float z );'</para> /// <para>Available in OS X x0.8 and later.</para> /// </summary> /// <param name="radians">MISSING</param> /// <param name="x">MISSING</param> /// <param name="y">MISSING</param> /// <param name="z">MISSING</param> /// <returns>A new quaternion.</returns> public static GLKQuaternion MakeWithAngleAndAxis (float radians, float x, float y, float z) { float halfAngle = radians * 0.5f; float scale = (float)Math.Sin (halfAngle); GLKQuaternion q = new GLKQuaternion (scale * x, scale * y, scale * z, (float)Math.Cos (halfAngle)); return q; }
/// <summary> /// <para>Returns a quaternion created from its separate components.</para> /// <para>Original signature is 'GLKQuaternion GLKQuaternionMake ( float x, float y, float z, float w );'</para> /// <para>Available in OS X x0.8 and later.</para> /// </summary> /// <param name="x">MISSING</param> /// <param name="y">MISSING</param> /// <param name="z">MISSING</param> /// <param name="w">MISSING</param> /// <returns>A new quaternion.</returns> public static GLKQuaternion Make (float x, float y, float z, float w) { GLKQuaternion q = new GLKQuaternion (x, y, z, w); return q; }