Struct num_quaternion::UnitQuaternion
source · pub struct UnitQuaternion<T>(/* private fields */);
Expand description
A quaternion with norm $1$.
Unit quaternions form a non-commutative group that can be conveniently used for rotating 3D vectors. A 3D vector can be interpreted as a pure quaternion (a quaternion with real part zero). Such a pure quaternion $v$ can be rotated in 3D space by computing $q^{-1}\cdot v\cdot q$ for a unit quaternion $q$. The resulting product is again a pure quaternion which is $v$ rotated around the axis given by the imaginary part of $q$. The angle of rotation is double the angle between $1$ and $q$ interpreted as 4D vectors.
Multiplying two unit quaternions yields again unit quaternion in theory.
However, due to limited machine precision, rounding errors accumulate
in practice and the resulting norm may deviate from $1$ more and more.
Thus, when you multiply a unit quaternions many times, then you need to
adjust the norm. This can be done by calling the function
adjust_norm()
.
See also Quaternion
.
Implementations§
source§impl<T> UnitQuaternion<T>where
T: Float,
impl<T> UnitQuaternion<T>where
T: Float,
sourcepub fn from_euler_angles(roll: T, pitch: T, yaw: T) -> Self
pub fn from_euler_angles(roll: T, pitch: T, yaw: T) -> Self
Creates a new Quaternion from roll, pitch and yaw angles.
sourcepub fn from_rotation_vector(v: &[T; 3]) -> Self
pub fn from_rotation_vector(v: &[T; 3]) -> Self
Returns a quaternion from a vector which is parallel to the rotation axis and whose norm is the rotation angle.
source§impl<T> UnitQuaternion<T>
impl<T> UnitQuaternion<T>
sourcepub const ONE: Self = _
pub const ONE: Self = _
A constant UnitQuaternion
of value $1$.
See also UnitQuaternion::one()
, Quaternion::ONE
.
sourcepub const I: Self = _
pub const I: Self = _
A constant UnitQuaternion
of value $i$.
See also UnitQuaternion::i()
, Quaternion::I
.
sourcepub const J: Self = _
pub const J: Self = _
A constant UnitQuaternion
of value $j$.
See also UnitQuaternion::j()
, Quaternion::J
.
sourcepub const K: Self = _
pub const K: Self = _
A constant UnitQuaternion
of value $k$.
See also UnitQuaternion::k()
, Quaternion::K
.
source§impl<T> UnitQuaternion<T>
impl<T> UnitQuaternion<T>
sourcepub fn i() -> Self
pub fn i() -> Self
Returns the imaginary unit $i$.
See also UnitQuaternion::I
, Quaternion::i()
.
sourcepub fn j() -> Self
pub fn j() -> Self
Returns the imaginary unit $j$.
See also UnitQuaternion::J
, Quaternion::j()
.
sourcepub fn k() -> Self
pub fn k() -> Self
Returns the imaginary unit $k$.
See also UnitQuaternion::K
, Quaternion::k()
.
source§impl<T> UnitQuaternion<T>
impl<T> UnitQuaternion<T>
sourcepub fn into_quaternion(self) -> Quaternion<T>
pub fn into_quaternion(self) -> Quaternion<T>
Returns the inner quaternion.
sourcepub fn as_quaternion(&self) -> &Quaternion<T>
pub fn as_quaternion(&self) -> &Quaternion<T>
Returns a reference to the inner quaternion.
source§impl<T> UnitQuaternion<T>
impl<T> UnitQuaternion<T>
source§impl<T> UnitQuaternion<T>
impl<T> UnitQuaternion<T>
source§impl<T> UnitQuaternion<T>where
T: Float,
impl<T> UnitQuaternion<T>where
T: Float,
sourcepub fn adjust_norm(self) -> Self
pub fn adjust_norm(self) -> Self
Renormalizes self
.
By many multiplications of unit quaternions, round off errors can lead to norms which are deviating from $1$. This function fix that inaccuracy.
source§impl<T> UnitQuaternion<T>
impl<T> UnitQuaternion<T>
sourcepub fn rotate_vector(self, vector: [T; 3]) -> [T; 3]
pub fn rotate_vector(self, vector: [T; 3]) -> [T; 3]
Rotates a vector using a quaternion.
Given a unit quaternion $q$ and a pure quaternion $v$ (i. e. a quaternion with real part zero), the mapping $v \mapsto q^*vq$ is a 3D rotation in the space of pure quaternions. This function performs this 3D rotation efficiently.
Trait Implementations§
source§impl<T> Add<Quaternion<T>> for UnitQuaternion<T>
impl<T> Add<Quaternion<T>> for UnitQuaternion<T>
§type Output = Quaternion<T>
type Output = Quaternion<T>
+
operator.source§impl<T> Add<T> for UnitQuaternion<T>
impl<T> Add<T> for UnitQuaternion<T>
source§impl<T> Add<UnitQuaternion<T>> for Quaternion<T>where
T: Add<T, Output = T>,
impl<T> Add<UnitQuaternion<T>> for Quaternion<T>where
T: Add<T, Output = T>,
§type Output = Quaternion<T>
type Output = Quaternion<T>
+
operator.source§impl<T> Add for UnitQuaternion<T>
impl<T> Add for UnitQuaternion<T>
§type Output = Quaternion<T>
type Output = Quaternion<T>
+
operator.source§impl<T> Borrow<Quaternion<T>> for UnitQuaternion<T>
impl<T> Borrow<Quaternion<T>> for UnitQuaternion<T>
source§fn borrow(&self) -> &Quaternion<T>
fn borrow(&self) -> &Quaternion<T>
source§impl<T: Clone> Clone for UnitQuaternion<T>
impl<T: Clone> Clone for UnitQuaternion<T>
source§fn clone(&self) -> UnitQuaternion<T>
fn clone(&self) -> UnitQuaternion<T>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl<T> ConstOne for UnitQuaternion<T>
impl<T> ConstOne for UnitQuaternion<T>
source§impl<T: Debug> Debug for UnitQuaternion<T>
impl<T: Debug> Debug for UnitQuaternion<T>
source§impl<T> Default for UnitQuaternion<T>
impl<T> Default for UnitQuaternion<T>
source§impl<T> Div<Quaternion<T>> for UnitQuaternion<T>
impl<T> Div<Quaternion<T>> for UnitQuaternion<T>
§type Output = Quaternion<T>
type Output = Quaternion<T>
/
operator.source§impl<T> Div<T> for UnitQuaternion<T>
impl<T> Div<T> for UnitQuaternion<T>
source§impl<T> Div<UnitQuaternion<T>> for Quaternion<T>
impl<T> Div<UnitQuaternion<T>> for Quaternion<T>
§type Output = Quaternion<T>
type Output = Quaternion<T>
/
operator.source§impl<T> Div for UnitQuaternion<T>
impl<T> Div for UnitQuaternion<T>
§type Output = UnitQuaternion<T>
type Output = UnitQuaternion<T>
/
operator.source§impl<'a, T> From<&'a UnitQuaternion<T>> for &'a Quaternion<T>
impl<'a, T> From<&'a UnitQuaternion<T>> for &'a Quaternion<T>
source§fn from(q: &'a UnitQuaternion<T>) -> Self
fn from(q: &'a UnitQuaternion<T>) -> Self
source§impl<T> From<UnitQuaternion<T>> for Quaternion<T>
impl<T> From<UnitQuaternion<T>> for Quaternion<T>
source§fn from(q: UnitQuaternion<T>) -> Self
fn from(q: UnitQuaternion<T>) -> Self
source§impl<T: Hash> Hash for UnitQuaternion<T>
impl<T: Hash> Hash for UnitQuaternion<T>
source§impl<T> Inv for &UnitQuaternion<T>
impl<T> Inv for &UnitQuaternion<T>
source§impl<T> Inv for UnitQuaternion<T>
impl<T> Inv for UnitQuaternion<T>
source§impl<T> Mul<Quaternion<T>> for UnitQuaternion<T>
impl<T> Mul<Quaternion<T>> for UnitQuaternion<T>
§type Output = Quaternion<T>
type Output = Quaternion<T>
*
operator.source§impl<T> Mul<T> for UnitQuaternion<T>
impl<T> Mul<T> for UnitQuaternion<T>
source§impl<T> Mul<UnitQuaternion<T>> for Quaternion<T>
impl<T> Mul<UnitQuaternion<T>> for Quaternion<T>
§type Output = Quaternion<T>
type Output = Quaternion<T>
*
operator.source§impl<T> Mul for UnitQuaternion<T>
impl<T> Mul for UnitQuaternion<T>
§type Output = UnitQuaternion<T>
type Output = UnitQuaternion<T>
*
operator.source§impl<T> Neg for UnitQuaternion<T>where
T: Neg<Output = T>,
impl<T> Neg for UnitQuaternion<T>where
T: Neg<Output = T>,
source§impl<T> One for UnitQuaternion<T>
impl<T> One for UnitQuaternion<T>
source§impl<T: PartialEq> PartialEq for UnitQuaternion<T>
impl<T: PartialEq> PartialEq for UnitQuaternion<T>
source§fn eq(&self, other: &UnitQuaternion<T>) -> bool
fn eq(&self, other: &UnitQuaternion<T>) -> bool
self
and other
values to be equal, and is used
by ==
.source§impl<T> Sub<Quaternion<T>> for UnitQuaternion<T>
impl<T> Sub<Quaternion<T>> for UnitQuaternion<T>
§type Output = Quaternion<T>
type Output = Quaternion<T>
-
operator.source§impl<T> Sub<T> for UnitQuaternion<T>
impl<T> Sub<T> for UnitQuaternion<T>
source§impl<T> Sub<UnitQuaternion<T>> for Quaternion<T>where
T: Sub<T, Output = T>,
impl<T> Sub<UnitQuaternion<T>> for Quaternion<T>where
T: Sub<T, Output = T>,
§type Output = Quaternion<T>
type Output = Quaternion<T>
-
operator.source§impl<T> Sub for UnitQuaternion<T>
impl<T> Sub for UnitQuaternion<T>
§type Output = Quaternion<T>
type Output = Quaternion<T>
-
operator.