|
@@ -20,41 +20,46 @@ class Matrix;
|
|
|
* lerp (linear interpolation): the interpolation curve gives a straight line in quaternion space. It is simple and fast to compute. The only problem is that it does not provide constant angular velocity. Note that a constant velocity is not necessarily a requirement for a curve;
|
|
* lerp (linear interpolation): the interpolation curve gives a straight line in quaternion space. It is simple and fast to compute. The only problem is that it does not provide constant angular velocity. Note that a constant velocity is not necessarily a requirement for a curve;
|
|
|
* slerp (spherical linear interpolation): the interpolation curve forms a great arc on the quaternion unit sphere. Slerp provides constant angular velocity;
|
|
* slerp (spherical linear interpolation): the interpolation curve forms a great arc on the quaternion unit sphere. Slerp provides constant angular velocity;
|
|
|
* squad (spherical spline interpolation): interpolating between a series of rotations using slerp leads to the following problems:
|
|
* squad (spherical spline interpolation): interpolating between a series of rotations using slerp leads to the following problems:
|
|
|
- * the curve is not smooth at the control points;
|
|
|
|
|
- * the angular velocity is not constant;
|
|
|
|
|
- * the angular velocity is not continuous at the control points.
|
|
|
|
|
|
|
+ * - the curve is not smooth at the control points;
|
|
|
|
|
+ * - the angular velocity is not constant;
|
|
|
|
|
+ * - the angular velocity is not continuous at the control points.
|
|
|
*
|
|
*
|
|
|
* Since squad is continuously differentiable, it remedies the first and third problems mentioned above.
|
|
* Since squad is continuously differentiable, it remedies the first and third problems mentioned above.
|
|
|
* The slerp method provided here is intended for interpolation of principal rotations. It treats +q and -q as the same principal rotation and is at liberty to use the negative of either input. The resulting path is always the shorter arc.
|
|
* The slerp method provided here is intended for interpolation of principal rotations. It treats +q and -q as the same principal rotation and is at liberty to use the negative of either input. The resulting path is always the shorter arc.
|
|
|
*
|
|
*
|
|
|
* The lerp method provided here interpolates strictly in quaternion space. Note that the resulting path may pass through the origin if interpolating between a quaternion and its exact negative.
|
|
* The lerp method provided here interpolates strictly in quaternion space. Note that the resulting path may pass through the origin if interpolating between a quaternion and its exact negative.
|
|
|
*
|
|
*
|
|
|
- * As an example, consider the following quaternions
|
|
|
|
|
|
|
+ * As an example, consider the following quaternions:
|
|
|
*
|
|
*
|
|
|
* q1 = (0.6, 0.8, 0.0, 0.0),
|
|
* q1 = (0.6, 0.8, 0.0, 0.0),
|
|
|
* q2 = (0.0, 0.6, 0.8, 0.0),
|
|
* q2 = (0.0, 0.6, 0.8, 0.0),
|
|
|
* q3 = (0.6, 0.0, 0.8, 0.0), and
|
|
* q3 = (0.6, 0.0, 0.8, 0.0), and
|
|
|
* q4 = (-0.8, 0.0, -0.6, 0.0).
|
|
* q4 = (-0.8, 0.0, -0.6, 0.0).
|
|
|
* For the point p = (1.0, 1.0, 1.0), the following figures show the trajectories of p using lerp, slerp, and squad.
|
|
* For the point p = (1.0, 1.0, 1.0), the following figures show the trajectories of p using lerp, slerp, and squad.
|
|
|
- *
|
|
|
|
|
- * @image "http://www.blackberry.com/developers/docs/7.0.0api/net/rim/device/api/math/doc-files/LERP.PNG"
|
|
|
|
|
- * @image "http://www.blackberry.com/developers/docs/7.0.0api/net/rim/device/api/math/doc-files/SLERP.PNG"
|
|
|
|
|
- * @image "http://www.blackberry.com/developers/docs/7.0.0api/net/rim/device/api/math/doc-files/SQUAD.PNG"
|
|
|
|
|
*/
|
|
*/
|
|
|
class Quaternion
|
|
class Quaternion
|
|
|
{
|
|
{
|
|
|
|
|
+ friend class Curve;
|
|
|
|
|
+
|
|
|
public:
|
|
public:
|
|
|
|
|
|
|
|
- /** The x-value of the quaternion's vector component. */
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * The x-value of the quaternion's vector component.
|
|
|
|
|
+ */
|
|
|
float x;
|
|
float x;
|
|
|
- /** The y-value of the quaternion's vector component. */
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * The y-value of the quaternion's vector component.
|
|
|
|
|
+ */
|
|
|
float y;
|
|
float y;
|
|
|
- /** The z-value of the quaternion's vector component. */
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * The z-value of the quaternion's vector component.
|
|
|
|
|
+ */
|
|
|
float z;
|
|
float z;
|
|
|
- /** The scalar component of the quaternion. */
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * The scalar component of the quaternion.
|
|
|
|
|
+ */
|
|
|
float w;
|
|
float w;
|
|
|
|
|
|
|
|
-
|
|
|
|
|
/**
|
|
/**
|
|
|
* Constructs a quaternion initialized to (0, 0, 0, 1).
|
|
* Constructs a quaternion initialized to (0, 0, 0, 1).
|
|
|
*/
|
|
*/
|
|
@@ -73,14 +78,22 @@ public:
|
|
|
/**
|
|
/**
|
|
|
* Constructs a new quaternion from the values in the specified array.
|
|
* Constructs a new quaternion from the values in the specified array.
|
|
|
*
|
|
*
|
|
|
- * @param array
|
|
|
|
|
|
|
+ * @param array The values for the new quaternion.
|
|
|
*/
|
|
*/
|
|
|
Quaternion(float* array);
|
|
Quaternion(float* array);
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Constructs a quaternion equal to the rotation from the specified axis and angle.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param axis A vector describing the axis of rotation.
|
|
|
|
|
+ * @param angle The angle of rotation (in radians).
|
|
|
|
|
+ */
|
|
|
|
|
+ Quaternion(const Vector3& axis, float angle);
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* Constructs a new quaternion that is a copy of the specified one.
|
|
* Constructs a new quaternion that is a copy of the specified one.
|
|
|
*
|
|
*
|
|
|
- * @param copy The quaternion to copy
|
|
|
|
|
|
|
+ * @param copy The quaternion to copy.
|
|
|
*/
|
|
*/
|
|
|
Quaternion(const Quaternion& copy);
|
|
Quaternion(const Quaternion& copy);
|
|
|
|
|
|
|
@@ -92,7 +105,7 @@ public:
|
|
|
/**
|
|
/**
|
|
|
* Returns the identity quaternion.
|
|
* Returns the identity quaternion.
|
|
|
*
|
|
*
|
|
|
- * @return The quaternion.
|
|
|
|
|
|
|
+ * @return The identity quaternion.
|
|
|
*/
|
|
*/
|
|
|
static const Quaternion& identity();
|
|
static const Quaternion& identity();
|
|
|
|
|
|
|
@@ -104,34 +117,25 @@ public:
|
|
|
static const Quaternion& zero();
|
|
static const Quaternion& zero();
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * Determines if this quaterion is equal to the identity quaternion.
|
|
|
|
|
|
|
+ * Determines if this quaternion is equal to the identity quaternion.
|
|
|
*
|
|
*
|
|
|
- * @return true if the identity, false otherwise.
|
|
|
|
|
|
|
+ * @return true if it is the identity quaternion, false otherwise.
|
|
|
*/
|
|
*/
|
|
|
bool isIdentity() const;
|
|
bool isIdentity() const;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * Determines if this quaterion is all zeros.
|
|
|
|
|
|
|
+ * Determines if this quaternion is all zeros.
|
|
|
*
|
|
*
|
|
|
- * @return true if zeros, false otherwise.
|
|
|
|
|
|
|
+ * @return true if this quaternion is all zeros, false otherwise.
|
|
|
*/
|
|
*/
|
|
|
bool isZero() const;
|
|
bool isZero() const;
|
|
|
|
|
|
|
|
- /**
|
|
|
|
|
- * Create a quaternion equal to the rotational part of the specified matrix
|
|
|
|
|
- * and stores the result in dst.
|
|
|
|
|
- *
|
|
|
|
|
- * @param m The matrix.
|
|
|
|
|
- * @param dst A quaternion to store the conjugate in.
|
|
|
|
|
- */
|
|
|
|
|
- static void createFromRotationMatrix(const Matrix& m, Quaternion* dst);
|
|
|
|
|
-
|
|
|
|
|
/**
|
|
/**
|
|
|
* Creates this quaternion equal to the rotation from the specified axis and angle
|
|
* Creates this quaternion equal to the rotation from the specified axis and angle
|
|
|
- * and store the result in dst.
|
|
|
|
|
|
|
+ * and stores the result in dst.
|
|
|
*
|
|
*
|
|
|
* @param axis A vector describing the axis of rotation.
|
|
* @param axis A vector describing the axis of rotation.
|
|
|
- * @param angle The angle of rotation, in radians.
|
|
|
|
|
|
|
+ * @param angle The angle of rotation (in radians).
|
|
|
* @param dst A quaternion to store the conjugate in.
|
|
* @param dst A quaternion to store the conjugate in.
|
|
|
*/
|
|
*/
|
|
|
static void createFromAxisAngle(const Vector3& axis, float angle, Quaternion* dst);
|
|
static void createFromAxisAngle(const Vector3& axis, float angle, Quaternion* dst);
|
|
@@ -226,6 +230,14 @@ public:
|
|
|
*/
|
|
*/
|
|
|
void set(float* array);
|
|
void set(float* array);
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Sets the quaternion equal to the rotation from the specified axis and angle.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param axis The axis of rotation.
|
|
|
|
|
+ * @param angle The angle of rotation (in radians).
|
|
|
|
|
+ */
|
|
|
|
|
+ void set(const Vector3& axis, float angle);
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* Sets the elements of this quaternion to a copy of the specified quaternion.
|
|
* Sets the elements of this quaternion to a copy of the specified quaternion.
|
|
|
*
|
|
*
|
|
@@ -256,10 +268,10 @@ public:
|
|
|
* @param q1 The first quaternion.
|
|
* @param q1 The first quaternion.
|
|
|
* @param q2 The second quaternion.
|
|
* @param q2 The second quaternion.
|
|
|
* @param t The interpolation coefficient.
|
|
* @param t The interpolation coefficient.
|
|
|
- * @param dst A quaternion to store the result in
|
|
|
|
|
|
|
+ * @param dst A quaternion to store the result in.
|
|
|
*/
|
|
*/
|
|
|
static void lerp(const Quaternion& q1, const Quaternion& q2, float t, Quaternion* dst);
|
|
static void lerp(const Quaternion& q1, const Quaternion& q2, float t, Quaternion* dst);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* Interpolates between two quaternions using spherical linear interpolation.
|
|
* Interpolates between two quaternions using spherical linear interpolation.
|
|
|
*
|
|
*
|
|
@@ -273,10 +285,10 @@ public:
|
|
|
* @param q1 The first quaternion.
|
|
* @param q1 The first quaternion.
|
|
|
* @param q2 The second quaternion.
|
|
* @param q2 The second quaternion.
|
|
|
* @param t The interpolation coefficient.
|
|
* @param t The interpolation coefficient.
|
|
|
- * @param dst A quaternion to store the result in
|
|
|
|
|
|
|
+ * @param dst A quaternion to store the result in.
|
|
|
*/
|
|
*/
|
|
|
static void slerp(const Quaternion& q1, const Quaternion& q2, float t, Quaternion* dst);
|
|
static void slerp(const Quaternion& q1, const Quaternion& q2, float t, Quaternion* dst);
|
|
|
-
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* Interpolates over a series of quaternions using spherical spline interpolation.
|
|
* Interpolates over a series of quaternions using spherical spline interpolation.
|
|
|
*
|
|
*
|
|
@@ -289,20 +301,64 @@ public:
|
|
|
*
|
|
*
|
|
|
* @param q1 The first quaternion.
|
|
* @param q1 The first quaternion.
|
|
|
* @param q2 The second quaternion.
|
|
* @param q2 The second quaternion.
|
|
|
- * @param s1 The first control point
|
|
|
|
|
- * @param s2 The second control point
|
|
|
|
|
|
|
+ * @param s1 The first control point.
|
|
|
|
|
+ * @param s2 The second control point.
|
|
|
* @param t The interpolation coefficient.
|
|
* @param t The interpolation coefficient.
|
|
|
- * @param dst A quaternion to store the result in
|
|
|
|
|
|
|
+ * @param dst A quaternion to store the result in.
|
|
|
*/
|
|
*/
|
|
|
static void squad(const Quaternion& q1, const Quaternion& q2, const Quaternion& s1, const Quaternion& s2, float t, Quaternion* dst);
|
|
static void squad(const Quaternion& q1, const Quaternion& q2, const Quaternion& s1, const Quaternion& s2, float t, Quaternion* dst);
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Calculates the quaternion product of this quaternion with the given quaternion.
|
|
|
|
|
+ *
|
|
|
|
|
+ * Note: this does not modify this quaternion.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param q The quaternion to multiply.
|
|
|
|
|
+ * @return The quaternion product.
|
|
|
|
|
+ */
|
|
|
|
|
+ inline Quaternion operator*(const Quaternion& q) const;
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Multiplies this quaternion with the given quaternion.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param q The quaternion to multiply.
|
|
|
|
|
+ * @return This quaternion, after the multiplication occurs.
|
|
|
|
|
+ */
|
|
|
|
|
+ inline Quaternion& operator*=(const Quaternion& q);
|
|
|
|
|
|
|
|
private:
|
|
private:
|
|
|
|
|
|
|
|
- static void slerpForSquad(const Quaternion& q1, const Quaternion& q2, float t, Quaternion* dst);
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * Interpolates between two quaternions using spherical linear interpolation.
|
|
|
|
|
+ *
|
|
|
|
|
+ * Spherical linear interpolation provides smooth transitions between different
|
|
|
|
|
+ * orientations and is often useful for animating models or cameras in 3D.
|
|
|
|
|
+ *
|
|
|
|
|
+ * Note: For accurate interpolation, the input quaternions must be at (or close to) unit length.
|
|
|
|
|
+ * This method does not automatically normalize the input quaternions, so it is up to the
|
|
|
|
|
+ * caller to ensure they call normalize beforehand, if necessary.
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param q1x The x component of the first quaternion.
|
|
|
|
|
+ * @param q1y The y component of the first quaternion.
|
|
|
|
|
+ * @param q1z The z component of the first quaternion.
|
|
|
|
|
+ * @param q1w The w component of the first quaternion.
|
|
|
|
|
+ * @param q2x The x component of the second quaternion.
|
|
|
|
|
+ * @param q2y The y component of the second quaternion.
|
|
|
|
|
+ * @param q2z The z component of the second quaternion.
|
|
|
|
|
+ * @param q2w The w component of the second quaternion.
|
|
|
|
|
+ * @param t The interpolation coefficient.
|
|
|
|
|
+ * @param dstx A pointer to store the x component of the slerp in.
|
|
|
|
|
+ * @param dsty A pointer to store the y component of the slerp in.
|
|
|
|
|
+ * @param dstz A pointer to store the z component of the slerp in.
|
|
|
|
|
+ * @param dstw A pointer to store the w component of the slerp in.
|
|
|
|
|
+ */
|
|
|
|
|
+ static void slerp(float q1x, float q1y, float q1z, float q1w, float q2x, float q2y, float q2z, float q2w, float t, float* dstx, float* dsty, float* dstz, float* dstw);
|
|
|
|
|
|
|
|
|
|
+ static void slerpForSquad(const Quaternion& q1, const Quaternion& q2, float t, Quaternion* dst);
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+#include "Quaternion.inl"
|
|
|
|
|
+
|
|
|
#endif
|
|
#endif
|