Package com.badlogic.gdx.math
Class Quaternion
- java.lang.Object
-
- com.badlogic.gdx.math.Quaternion
-
- All Implemented Interfaces:
java.io.Serializable
public class Quaternion extends java.lang.Object implements java.io.Serializable
A simple quaternion class.
-
-
Constructor Summary
Constructors Constructor Description Quaternion()
Quaternion(float x, float y, float z, float w)
Constructor, sets the four components of the quaternion.Quaternion(Quaternion quaternion)
Constructor, sets the quaternion components from the given quaternion.Quaternion(Vector3 axis, float angle)
Constructor, sets the quaternion from the given axis vector and the angle around that axis in degrees.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description Quaternion
add(float qx, float qy, float qz, float qw)
Add the x,y,z,w components of the passed in quaternion to the ones of this quaternionQuaternion
add(Quaternion quaternion)
Add the x,y,z,w components of the passed in quaternion to the ones of this quaternionQuaternion
conjugate()
Conjugate the quaternion.Quaternion
cpy()
float
dot(float x, float y, float z, float w)
Get the dot product between this and the other quaternion (commutative).static float
dot(float x1, float y1, float z1, float w1, float x2, float y2, float z2, float w2)
Get the dot product between the two quaternions (commutative).float
dot(Quaternion other)
Get the dot product between this and the other quaternion (commutative).boolean
equals(java.lang.Object obj)
Quaternion
exp(float alpha)
Calculates (this quaternion)^alpha where alpha is a real number and stores the result in this quaternion.float
getAngle()
Get the angle in degrees of the rotation this quaternion represents.float
getAngleAround(float axisX, float axisY, float axisZ)
Get the angle in degrees of the rotation around the specified axis.float
getAngleAround(Vector3 axis)
Get the angle in degrees of the rotation around the specified axis.float
getAngleAroundRad(float axisX, float axisY, float axisZ)
Get the angle in radians of the rotation around the specified axis.float
getAngleAroundRad(Vector3 axis)
Get the angle in radians of the rotation around the specified axis.float
getAngleRad()
Get the angle in radians of the rotation this quaternion represents.float
getAxisAngle(Vector3 axis)
Get the axis angle representation of the rotation in degrees.float
getAxisAngleRad(Vector3 axis)
Get the axis-angle representation of the rotation in radians.int
getGimbalPole()
Get the pole of the gimbal lock, if any.float
getPitch()
Get the pitch euler angle in degrees, which is the rotation around the x axis.float
getPitchRad()
Get the pitch euler angle in radians, which is the rotation around the x axis.float
getRoll()
Get the roll euler angle in degrees, which is the rotation around the z axis.float
getRollRad()
Get the roll euler angle in radians, which is the rotation around the z axis.void
getSwingTwist(float axisX, float axisY, float axisZ, Quaternion swing, Quaternion twist)
Get the swing rotation and twist rotation for the specified axis.void
getSwingTwist(Vector3 axis, Quaternion swing, Quaternion twist)
Get the swing rotation and twist rotation for the specified axis.float
getYaw()
Get the yaw euler angle in degrees, which is the rotation around the y axis.float
getYawRad()
Get the yaw euler angle in radians, which is the rotation around the y axis.int
hashCode()
Quaternion
idt()
Sets the quaternion to an identity Quaternionboolean
isIdentity()
boolean
isIdentity(float tolerance)
float
len()
static float
len(float x, float y, float z, float w)
float
len2()
static float
len2(float x, float y, float z, float w)
Quaternion
mul(float scalar)
Multiplies the components of this quaternion with the given scalar.Quaternion
mul(float x, float y, float z, float w)
Multiplies this quaternion with another one in the form of this = this * otherQuaternion
mul(Quaternion other)
Multiplies this quaternion with another one in the form of this = this * otherQuaternion
mulLeft(float x, float y, float z, float w)
Multiplies this quaternion with another one in the form of this = other * thisQuaternion
mulLeft(Quaternion other)
Multiplies this quaternion with another one in the form of this = other * thisQuaternion
nor()
Normalizes this quaternion to unit lengthQuaternion
set(float x, float y, float z, float w)
Sets the components of the quaternionQuaternion
set(Quaternion quaternion)
Sets the quaternion components from the given quaternion.Quaternion
set(Vector3 axis, float angle)
Sets the quaternion components from the given axis and angle around that axis.Quaternion
setEulerAngles(float yaw, float pitch, float roll)
Sets the quaternion to the given euler angles in degrees.Quaternion
setEulerAnglesRad(float yaw, float pitch, float roll)
Sets the quaternion to the given euler angles in radians.Quaternion
setFromAxes(boolean normalizeAxes, float xx, float xy, float xz, float yx, float yy, float yz, float zx, float zy, float zz)
Sets the Quaternion from the given x-, y- and z-axis.Quaternion
setFromAxes(float xx, float xy, float xz, float yx, float yy, float yz, float zx, float zy, float zz)
Sets the Quaternion from the given x-, y- and z-axis which have to be orthonormal.Quaternion
setFromAxis(float x, float y, float z, float degrees)
Sets the quaternion components from the given axis and angle around that axis.Quaternion
setFromAxis(Vector3 axis, float degrees)
Sets the quaternion components from the given axis and angle around that axis.Quaternion
setFromAxisRad(float x, float y, float z, float radians)
Sets the quaternion components from the given axis and angle around that axis.Quaternion
setFromAxisRad(Vector3 axis, float radians)
Sets the quaternion components from the given axis and angle around that axis.Quaternion
setFromCross(float x1, float y1, float z1, float x2, float y2, float z2)
Set this quaternion to the rotation between two vectors.Quaternion
setFromCross(Vector3 v1, Vector3 v2)
Set this quaternion to the rotation between two vectors.Quaternion
setFromMatrix(boolean normalizeAxes, Matrix3 matrix)
Sets the Quaternion from the given matrix, optionally removing any scaling.Quaternion
setFromMatrix(boolean normalizeAxes, Matrix4 matrix)
Sets the Quaternion from the given matrix, optionally removing any scaling.Quaternion
setFromMatrix(Matrix3 matrix)
Sets the Quaternion from the given rotation matrix, which must not contain scaling.Quaternion
setFromMatrix(Matrix4 matrix)
Sets the Quaternion from the given rotation matrix, which must not contain scaling.Quaternion
slerp(Quaternion[] q)
Spherical linearly interpolates multiple quaternions and stores the result in this Quaternion.Quaternion
slerp(Quaternion[] q, float[] w)
Spherical linearly interpolates multiple quaternions by the given weights and stores the result in this Quaternion.Quaternion
slerp(Quaternion end, float alpha)
Spherical linear interpolation between this quaternion and the other quaternion, based on the alpha value in the range [0,1].void
toMatrix(float[] matrix)
Fills a 4x4 matrix with the rotation matrix represented by this quaternion.java.lang.String
toString()
Vector3
transform(Vector3 v)
Transforms the given vector using this quaternion
-
-
-
Constructor Detail
-
Quaternion
public Quaternion(float x, float y, float z, float w)
Constructor, sets the four components of the quaternion.- Parameters:
x
- The x-componenty
- The y-componentz
- The z-componentw
- The w-component
-
Quaternion
public Quaternion()
-
Quaternion
public Quaternion(Quaternion quaternion)
Constructor, sets the quaternion components from the given quaternion.- Parameters:
quaternion
- The quaternion to copy.
-
Quaternion
public Quaternion(Vector3 axis, float angle)
Constructor, sets the quaternion from the given axis vector and the angle around that axis in degrees.- Parameters:
axis
- The axisangle
- The angle in degrees.
-
-
Method Detail
-
set
public Quaternion set(float x, float y, float z, float w)
Sets the components of the quaternion- Parameters:
x
- The x-componenty
- The y-componentz
- The z-componentw
- The w-component- Returns:
- This quaternion for chaining
-
set
public Quaternion set(Quaternion quaternion)
Sets the quaternion components from the given quaternion.- Parameters:
quaternion
- The quaternion.- Returns:
- This quaternion for chaining.
-
set
public Quaternion set(Vector3 axis, float angle)
Sets the quaternion components from the given axis and angle around that axis.- Parameters:
axis
- The axisangle
- The angle in degrees- Returns:
- This quaternion for chaining.
-
cpy
public Quaternion cpy()
- Returns:
- a copy of this quaternion
-
len
public static final float len(float x, float y, float z, float w)
- Returns:
- the euclidean length of the specified quaternion
-
len
public float len()
- Returns:
- the euclidean length of this quaternion
-
toString
public java.lang.String toString()
- Overrides:
toString
in classjava.lang.Object
-
setEulerAngles
public Quaternion setEulerAngles(float yaw, float pitch, float roll)
Sets the quaternion to the given euler angles in degrees.- Parameters:
yaw
- the rotation around the y axis in degreespitch
- the rotation around the x axis in degreesroll
- the rotation around the z axis degrees- Returns:
- this quaternion
-
setEulerAnglesRad
public Quaternion setEulerAnglesRad(float yaw, float pitch, float roll)
Sets the quaternion to the given euler angles in radians.- Parameters:
yaw
- the rotation around the y axis in radianspitch
- the rotation around the x axis in radiansroll
- the rotation around the z axis in radians- Returns:
- this quaternion
-
getGimbalPole
public int getGimbalPole()
Get the pole of the gimbal lock, if any.- Returns:
- positive (+1) for north pole, negative (-1) for south pole, zero (0) when no gimbal lock
-
getRollRad
public float getRollRad()
Get the roll euler angle in radians, which is the rotation around the z axis. Requires that this quaternion is normalized.- Returns:
- the rotation around the z axis in radians (between -PI and +PI)
-
getRoll
public float getRoll()
Get the roll euler angle in degrees, which is the rotation around the z axis. Requires that this quaternion is normalized.- Returns:
- the rotation around the z axis in degrees (between -180 and +180)
-
getPitchRad
public float getPitchRad()
Get the pitch euler angle in radians, which is the rotation around the x axis. Requires that this quaternion is normalized.- Returns:
- the rotation around the x axis in radians (between -(PI/2) and +(PI/2))
-
getPitch
public float getPitch()
Get the pitch euler angle in degrees, which is the rotation around the x axis. Requires that this quaternion is normalized.- Returns:
- the rotation around the x axis in degrees (between -90 and +90)
-
getYawRad
public float getYawRad()
Get the yaw euler angle in radians, which is the rotation around the y axis. Requires that this quaternion is normalized.- Returns:
- the rotation around the y axis in radians (between -PI and +PI)
-
getYaw
public float getYaw()
Get the yaw euler angle in degrees, which is the rotation around the y axis. Requires that this quaternion is normalized.- Returns:
- the rotation around the y axis in degrees (between -180 and +180)
-
len2
public static final float len2(float x, float y, float z, float w)
-
len2
public float len2()
- Returns:
- the length of this quaternion without square root
-
nor
public Quaternion nor()
Normalizes this quaternion to unit length- Returns:
- the quaternion for chaining
-
conjugate
public Quaternion conjugate()
Conjugate the quaternion.- Returns:
- This quaternion for chaining
-
transform
public Vector3 transform(Vector3 v)
Transforms the given vector using this quaternion- Parameters:
v
- Vector to transform
-
mul
public Quaternion mul(Quaternion other)
Multiplies this quaternion with another one in the form of this = this * other- Parameters:
other
- Quaternion to multiply with- Returns:
- This quaternion for chaining
-
mul
public Quaternion mul(float x, float y, float z, float w)
Multiplies this quaternion with another one in the form of this = this * other- Parameters:
x
- the x component of the other quaternion to multiply withy
- the y component of the other quaternion to multiply withz
- the z component of the other quaternion to multiply withw
- the w component of the other quaternion to multiply with- Returns:
- This quaternion for chaining
-
mulLeft
public Quaternion mulLeft(Quaternion other)
Multiplies this quaternion with another one in the form of this = other * this- Parameters:
other
- Quaternion to multiply with- Returns:
- This quaternion for chaining
-
mulLeft
public Quaternion mulLeft(float x, float y, float z, float w)
Multiplies this quaternion with another one in the form of this = other * this- Parameters:
x
- the x component of the other quaternion to multiply withy
- the y component of the other quaternion to multiply withz
- the z component of the other quaternion to multiply withw
- the w component of the other quaternion to multiply with- Returns:
- This quaternion for chaining
-
add
public Quaternion add(Quaternion quaternion)
Add the x,y,z,w components of the passed in quaternion to the ones of this quaternion
-
add
public Quaternion add(float qx, float qy, float qz, float qw)
Add the x,y,z,w components of the passed in quaternion to the ones of this quaternion
-
toMatrix
public void toMatrix(float[] matrix)
Fills a 4x4 matrix with the rotation matrix represented by this quaternion.- Parameters:
matrix
- Matrix to fill
-
idt
public Quaternion idt()
Sets the quaternion to an identity Quaternion- Returns:
- this quaternion for chaining
-
isIdentity
public boolean isIdentity()
- Returns:
- If this quaternion is an identity Quaternion
-
isIdentity
public boolean isIdentity(float tolerance)
- Returns:
- If this quaternion is an identity Quaternion
-
setFromAxis
public Quaternion setFromAxis(Vector3 axis, float degrees)
Sets the quaternion components from the given axis and angle around that axis.- Parameters:
axis
- The axisdegrees
- The angle in degrees- Returns:
- This quaternion for chaining.
-
setFromAxisRad
public Quaternion setFromAxisRad(Vector3 axis, float radians)
Sets the quaternion components from the given axis and angle around that axis.- Parameters:
axis
- The axisradians
- The angle in radians- Returns:
- This quaternion for chaining.
-
setFromAxis
public Quaternion setFromAxis(float x, float y, float z, float degrees)
Sets the quaternion components from the given axis and angle around that axis.- Parameters:
x
- X direction of the axisy
- Y direction of the axisz
- Z direction of the axisdegrees
- The angle in degrees- Returns:
- This quaternion for chaining.
-
setFromAxisRad
public Quaternion setFromAxisRad(float x, float y, float z, float radians)
Sets the quaternion components from the given axis and angle around that axis.- Parameters:
x
- X direction of the axisy
- Y direction of the axisz
- Z direction of the axisradians
- The angle in radians- Returns:
- This quaternion for chaining.
-
setFromMatrix
public Quaternion setFromMatrix(boolean normalizeAxes, Matrix4 matrix)
Sets the Quaternion from the given matrix, optionally removing any scaling.
-
setFromMatrix
public Quaternion setFromMatrix(Matrix4 matrix)
Sets the Quaternion from the given rotation matrix, which must not contain scaling.
-
setFromMatrix
public Quaternion setFromMatrix(boolean normalizeAxes, Matrix3 matrix)
Sets the Quaternion from the given matrix, optionally removing any scaling.
-
setFromMatrix
public Quaternion setFromMatrix(Matrix3 matrix)
Sets the Quaternion from the given rotation matrix, which must not contain scaling.
-
setFromAxes
public Quaternion setFromAxes(float xx, float xy, float xz, float yx, float yy, float yz, float zx, float zy, float zz)
Sets the Quaternion from the given x-, y- and z-axis which have to be orthonormal.
Taken from Bones framework for JPCT, see http://www.aptalkarga.com/bones/ which in turn took it from Graphics Gem code at ftp://ftp.cis.upenn.edu/pub/graphics/shoemake/quatut.ps.Z.
- Parameters:
xx
- x-axis x-coordinatexy
- x-axis y-coordinatexz
- x-axis z-coordinateyx
- y-axis x-coordinateyy
- y-axis y-coordinateyz
- y-axis z-coordinatezx
- z-axis x-coordinatezy
- z-axis y-coordinatezz
- z-axis z-coordinate
-
setFromAxes
public Quaternion setFromAxes(boolean normalizeAxes, float xx, float xy, float xz, float yx, float yy, float yz, float zx, float zy, float zz)
Sets the Quaternion from the given x-, y- and z-axis.
Taken from Bones framework for JPCT, see http://www.aptalkarga.com/bones/ which in turn took it from Graphics Gem code at ftp://ftp.cis.upenn.edu/pub/graphics/shoemake/quatut.ps.Z.
- Parameters:
normalizeAxes
- whether to normalize the axes (necessary when they contain scaling)xx
- x-axis x-coordinatexy
- x-axis y-coordinatexz
- x-axis z-coordinateyx
- y-axis x-coordinateyy
- y-axis y-coordinateyz
- y-axis z-coordinatezx
- z-axis x-coordinatezy
- z-axis y-coordinatezz
- z-axis z-coordinate
-
setFromCross
public Quaternion setFromCross(Vector3 v1, Vector3 v2)
Set this quaternion to the rotation between two vectors.- Parameters:
v1
- The base vector, which should be normalized.v2
- The target vector, which should be normalized.- Returns:
- This quaternion for chaining
-
setFromCross
public Quaternion setFromCross(float x1, float y1, float z1, float x2, float y2, float z2)
Set this quaternion to the rotation between two vectors.- Parameters:
x1
- The base vectors x value, which should be normalized.y1
- The base vectors y value, which should be normalized.z1
- The base vectors z value, which should be normalized.x2
- The target vector x value, which should be normalized.y2
- The target vector y value, which should be normalized.z2
- The target vector z value, which should be normalized.- Returns:
- This quaternion for chaining
-
slerp
public Quaternion slerp(Quaternion end, float alpha)
Spherical linear interpolation between this quaternion and the other quaternion, based on the alpha value in the range [0,1]. Taken from Bones framework for JPCT, see http://www.aptalkarga.com/bones/- Parameters:
end
- the end quaternionalpha
- alpha in the range [0,1]- Returns:
- this quaternion for chaining
-
slerp
public Quaternion slerp(Quaternion[] q)
Spherical linearly interpolates multiple quaternions and stores the result in this Quaternion. Will not destroy the data previously inside the elements of q. result = (q_1^w_1)*(q_2^w_2)* ... *(q_n^w_n) where w_i=1/n.- Parameters:
q
- List of quaternions- Returns:
- This quaternion for chaining
-
slerp
public Quaternion slerp(Quaternion[] q, float[] w)
Spherical linearly interpolates multiple quaternions by the given weights and stores the result in this Quaternion. Will not destroy the data previously inside the elements of q or w. result = (q_1^w_1)*(q_2^w_2)* ... *(q_n^w_n) where the sum of w_i is 1. Lists must be equal in length.- Parameters:
q
- List of quaternionsw
- List of weights- Returns:
- This quaternion for chaining
-
exp
public Quaternion exp(float alpha)
Calculates (this quaternion)^alpha where alpha is a real number and stores the result in this quaternion. See http://en.wikipedia.org/wiki/Quaternion#Exponential.2C_logarithm.2C_and_power- Parameters:
alpha
- Exponent- Returns:
- This quaternion for chaining
-
hashCode
public int hashCode()
- Overrides:
hashCode
in classjava.lang.Object
-
equals
public boolean equals(java.lang.Object obj)
- Overrides:
equals
in classjava.lang.Object
-
dot
public static final float dot(float x1, float y1, float z1, float w1, float x2, float y2, float z2, float w2)
Get the dot product between the two quaternions (commutative).- Parameters:
x1
- the x component of the first quaterniony1
- the y component of the first quaternionz1
- the z component of the first quaternionw1
- the w component of the first quaternionx2
- the x component of the second quaterniony2
- the y component of the second quaternionz2
- the z component of the second quaternionw2
- the w component of the second quaternion- Returns:
- the dot product between the first and second quaternion.
-
dot
public float dot(Quaternion other)
Get the dot product between this and the other quaternion (commutative).- Parameters:
other
- the other quaternion.- Returns:
- the dot product of this and the other quaternion.
-
dot
public float dot(float x, float y, float z, float w)
Get the dot product between this and the other quaternion (commutative).- Parameters:
x
- the x component of the other quaterniony
- the y component of the other quaternionz
- the z component of the other quaternionw
- the w component of the other quaternion- Returns:
- the dot product of this and the other quaternion.
-
mul
public Quaternion mul(float scalar)
Multiplies the components of this quaternion with the given scalar.- Parameters:
scalar
- the scalar.- Returns:
- this quaternion for chaining.
-
getAxisAngle
public float getAxisAngle(Vector3 axis)
Get the axis angle representation of the rotation in degrees. The supplied vector will receive the axis (x, y and z values) of the rotation and the value returned is the angle in degrees around that axis. Note that this method will alter the supplied vector, the existing value of the vector is ignored. This will normalize this quaternion if needed. The received axis is a unit vector. However, if this is an identity quaternion (no rotation), then the length of the axis may be zero.- Parameters:
axis
- vector which will receive the axis- Returns:
- the angle in degrees
- See Also:
- wikipedia, calculation
-
getAxisAngleRad
public float getAxisAngleRad(Vector3 axis)
Get the axis-angle representation of the rotation in radians. The supplied vector will receive the axis (x, y and z values) of the rotation and the value returned is the angle in radians around that axis. Note that this method will alter the supplied vector, the existing value of the vector is ignored. This will normalize this quaternion if needed. The received axis is a unit vector. However, if this is an identity quaternion (no rotation), then the length of the axis may be zero.- Parameters:
axis
- vector which will receive the axis- Returns:
- the angle in radians
- See Also:
- wikipedia, calculation
-
getAngleRad
public float getAngleRad()
Get the angle in radians of the rotation this quaternion represents. Does not normalize the quaternion. UsegetAxisAngleRad(Vector3)
to get both the axis and the angle of this rotation. UsegetAngleAroundRad(Vector3)
to get the angle around a specific axis.- Returns:
- the angle in radians of the rotation
-
getAngle
public float getAngle()
Get the angle in degrees of the rotation this quaternion represents. UsegetAxisAngle(Vector3)
to get both the axis and the angle of this rotation. UsegetAngleAround(Vector3)
to get the angle around a specific axis.- Returns:
- the angle in degrees of the rotation
-
getSwingTwist
public void getSwingTwist(float axisX, float axisY, float axisZ, Quaternion swing, Quaternion twist)
Get the swing rotation and twist rotation for the specified axis. The twist rotation represents the rotation around the specified axis. The swing rotation represents the rotation of the specified axis itself, which is the rotation around an axis perpendicular to the specified axis. The swing and twist rotation can be used to reconstruct the original quaternion: this = swing * twist- Parameters:
axisX
- the X component of the normalized axis for which to get the swing and twist rotationaxisY
- the Y component of the normalized axis for which to get the swing and twist rotationaxisZ
- the Z component of the normalized axis for which to get the swing and twist rotationswing
- will receive the swing rotation: the rotation around an axis perpendicular to the specified axistwist
- will receive the twist rotation: the rotation around the specified axis- See Also:
- calculation
-
getSwingTwist
public void getSwingTwist(Vector3 axis, Quaternion swing, Quaternion twist)
Get the swing rotation and twist rotation for the specified axis. The twist rotation represents the rotation around the specified axis. The swing rotation represents the rotation of the specified axis itself, which is the rotation around an axis perpendicular to the specified axis. The swing and twist rotation can be used to reconstruct the original quaternion: this = swing * twist- Parameters:
axis
- the normalized axis for which to get the swing and twist rotationswing
- will receive the swing rotation: the rotation around an axis perpendicular to the specified axistwist
- will receive the twist rotation: the rotation around the specified axis- See Also:
- calculation
-
getAngleAroundRad
public float getAngleAroundRad(float axisX, float axisY, float axisZ)
Get the angle in radians of the rotation around the specified axis. The axis must be normalized.- Parameters:
axisX
- the x component of the normalized axis for which to get the angleaxisY
- the y component of the normalized axis for which to get the angleaxisZ
- the z component of the normalized axis for which to get the angle- Returns:
- the angle in radians of the rotation around the specified axis
-
getAngleAroundRad
public float getAngleAroundRad(Vector3 axis)
Get the angle in radians of the rotation around the specified axis. The axis must be normalized.- Parameters:
axis
- the normalized axis for which to get the angle- Returns:
- the angle in radians of the rotation around the specified axis
-
getAngleAround
public float getAngleAround(float axisX, float axisY, float axisZ)
Get the angle in degrees of the rotation around the specified axis. The axis must be normalized.- Parameters:
axisX
- the x component of the normalized axis for which to get the angleaxisY
- the y component of the normalized axis for which to get the angleaxisZ
- the z component of the normalized axis for which to get the angle- Returns:
- the angle in degrees of the rotation around the specified axis
-
getAngleAround
public float getAngleAround(Vector3 axis)
Get the angle in degrees of the rotation around the specified axis. The axis must be normalized.- Parameters:
axis
- the normalized axis for which to get the angle- Returns:
- the angle in degrees of the rotation around the specified axis
-
-