#[repr(C)]
pub struct Quaternion<T> { pub x: T, pub y: T, pub z: T, pub w: T, }
Expand description

Quaternions are a convenient representation for rotations in 3D spaces.

IMPORTANT: Quaternions are only valid as rotations as long as they are normalized (i.e their magnitude is 1). Most operations assume this, instead of normalizing inputs behind your back, so be careful.

They essentially consist of a vector part (x, y, z), and scalar part (w). For unit quaternions, the vector part is the unit axis of rotation scaled by the sine of the half-angle of the rotation, and the scalar part is the cosine of the half-angle.

Fields§

§x: T§y: T§z: T§w: T

Implementations§

source§

impl<T> Quaternion<T>

source

pub fn from_xyzw(x: T, y: T, z: T, w: T) -> Self

Creates a new quaternion with x, y, z and w elements in order.

You are responsible for ensuring that the resulting quaternion is normalized.

source

pub fn from_scalar_and_vec3<V: Into<Vec3<T>>>(pair: (T, V)) -> Self

Creates a new quaternion from a scalar-and-vector pair.

You are responsible for ensuring that the resulting quaternion is normalized.

source

pub fn into_scalar_and_vec3(self) -> (T, Vec3<T>)

Converts this quaternion into a scalar-and-vector pair by destructuring.

Not to be confused with into_angle_axis().

source

pub fn zero() -> Selfwhere T: Zero,

Creates a new quaternion with all elements set to zero.

Be careful: since it has a magnitude equal to zero, it is not valid to use for most operations.

source

pub fn identity() -> Selfwhere T: Zero + One,

Creates the identity quaternion.

use std::f32::consts::PI;

let id = Quaternion::<f32>::identity();
assert_eq!(id, Default::default());
assert_relative_eq!(id, id.conjugate());
assert_relative_eq!(id, id.inverse());

let q = Quaternion::rotation_y(PI);
assert_relative_eq!(id * q, q);
assert_relative_eq!(q * id, q);
source

pub fn conjugate(self) -> Selfwhere T: Neg<Output = T>,

Gets this quaternion’s conjugate (copy with negated vector part).

On normalized quaternions, the conjugate also happens to be the inverse.

use std::f32::consts::PI;

let p = Quaternion::rotation_x(PI);
let q = Quaternion::rotation_z(PI);
assert_relative_eq!((p*q).conjugate(), q.conjugate() * p.conjugate());

// Rotation quaternions are normalized, so their conjugate is also their inverse.
assert_relative_eq!(q.conjugate(), q.inverse());
source

pub fn inverse(self) -> Selfwhere T: Neg<Output = T> + Copy + Add<T, Output = T> + Mul<Output = T> + Div<Output = T>,

Gets this quaternion’s inverse, i.e the one that reverses its effect.

On normalized quaternions, the inverse happens to be the conjugate.

use std::f32::consts::PI;

let rot = Quaternion::rotation_y(PI);
let inv = rot.inverse();
assert_relative_eq!(rot*inv, Quaternion::identity());
assert_relative_eq!(inv*rot, Quaternion::identity());

let p = Quaternion::rotation_x(PI);
let q = Quaternion::rotation_z(PI);
assert_relative_eq!((p*q).inverse(), q.inverse() * p.inverse());
source

pub fn dot(self, q: Self) -> Twhere T: Copy + Add<T, Output = T> + Mul<Output = T>,

Gets the dot product between two quaternions.

source

pub fn normalized(self) -> Selfwhere T: Real + Add<T, Output = T>,

Gets a normalized copy of this quaternion.

source

pub fn magnitude_squared(self) -> Twhere T: Real + Add<T, Output = T>,

Gets this quaternion’s magnitude, squared.

source

pub fn magnitude(self) -> Twhere T: Real + Add<T, Output = T>,

Gets this quaternion’s magnitude.

source

pub fn rotation_from_to_3d<V: Into<Vec3<T>>>(from: V, to: V) -> Selfwhere T: Real + Add<T, Output = T>,

Creates a quaternion that would rotate a from direction to to.


let (from, to) = (Vec4::<f32>::unit_x(), Vec4::<f32>::unit_y());
let q = Quaternion::<f32>::rotation_from_to_3d(from, to);
assert_relative_eq!(q * from, to);
assert_relative_eq!(q * Vec4::unit_y(), -Vec4::unit_x());

let (from, to) = (Vec4::<f32>::unit_x(), -Vec4::<f32>::unit_x());
let q = Quaternion::<f32>::rotation_from_to_3d(from, to);
assert_relative_eq!(q * from, to);
source

pub fn rotation_3d<V: Into<Vec3<T>>>(angle_radians: T, axis: V) -> Selfwhere T: Real + Add<T, Output = T>,

Creates a quaternion from an angle and axis. The axis is not required to be normalized.

source

pub fn rotation_x(angle_radians: T) -> Selfwhere T: Real + Add<T, Output = T>,

Creates a quaternion from an angle for a rotation around the X axis.

source

pub fn rotation_y(angle_radians: T) -> Selfwhere T: Real + Add<T, Output = T>,

Creates a quaternion from an angle for a rotation around the Y axis.

source

pub fn rotation_z(angle_radians: T) -> Selfwhere T: Real + Add<T, Output = T>,

Creates a quaternion from an angle for a rotation around the Y axis.

source

pub fn rotated_3d<V: Into<Vec3<T>>>(self, angle_radians: T, axis: V) -> Selfwhere T: Real + Add<T, Output = T>,

Returns this quaternion rotated around the given axis with given angle. The axis is not required to be normalized.

source

pub fn rotated_x(self, angle_radians: T) -> Selfwhere T: Real + Add<T, Output = T>,

Returns this quaternion rotated around the X axis with given angle.

source

pub fn rotated_y(self, angle_radians: T) -> Selfwhere T: Real + Add<T, Output = T>,

Returns this quaternion rotated around the Y axis with given angle.

source

pub fn rotated_z(self, angle_radians: T) -> Selfwhere T: Real + Add<T, Output = T>,

Returns this quaternion rotated around the Z axis with given angle.

source

pub fn rotate_3d<V: Into<Vec3<T>>>(&mut self, angle_radians: T, axis: V)where T: Real + Add<T, Output = T>,

Rotates this quaternion around the given axis with given angle. The axis is not required to be normalized.

source

pub fn rotate_x(&mut self, angle_radians: T)where T: Real + Add<T, Output = T>,

Rotates this quaternion around the X axis with given angle.

source

pub fn rotate_y(&mut self, angle_radians: T)where T: Real + Add<T, Output = T>,

Rotates this quaternion around the Y axis with given angle.

source

pub fn rotate_z(&mut self, angle_radians: T)where T: Real + Add<T, Output = T>,

Rotates this quaternion around the Z axis with given angle.

source

pub fn into_angle_axis(self) -> (T, Vec3<T>)where T: Real,

Convert this quaternion to angle-axis representation, assuming the quaternion is normalized.

use std::f32::consts::PI;

let q = Quaternion::rotation_x(PI/2.);
let (angle, axis) = q.into_angle_axis();
assert_relative_eq!(angle, PI/2.);
assert_relative_eq!(axis, Vec3::unit_x());

let angle = PI*4./5.;
let axis = Vec3::new(1_f32, 2., 3.);
let q = Quaternion::rotation_3d(angle, axis);
let (a, v) = q.into_angle_axis();
assert_relative_eq!(a, angle);
assert_relative_eq!(v, axis.normalized());
source

pub fn into_vec4(self) -> Vec4<T>

Converts this quaternion to a Vec4 by destructuring.

source

pub fn from_vec4(v: Vec4<T>) -> Self

Creates a quaternion from a Vec4 by destructuring. You are responsible for ensuring that the resulting quaternion is normalized.

source

pub fn into_vec3(self) -> Vec3<T>

Converts this quaternion to a Vec3 by destructuring, dropping the w element.

source§

impl<T> Quaternion<T>where T: Copy + One + Mul<Output = T> + Sub<Output = T> + MulAdd<T, T, Output = T>,

source

pub fn lerp_precise_unnormalized(from: Self, to: Self, factor: T) -> Selfwhere T: Clamp + Zero,

Performs linear interpolation without normalizing the result, using an implementation that supposedly yields a more precise result.

This is probably not what you’re looking for. For an implementation that normalizes the result (which is more commonly wanted), see the Lerp implementation.

source

pub fn lerp_unclamped_precise_unnormalized( from: Self, to: Self, factor: T ) -> Self

Performs linear interpolation without normalizing the result and without implicitly constraining factor to be between 0 and 1, using an implementation that supposedly yields a more precise result.

This is probably not what you’re looking for. For an implementation that normalizes the result (which is more commonly wanted), see the Lerp implementation.

source§

impl<T> Quaternion<T>where T: Copy + Sub<Output = T> + MulAdd<T, T, Output = T>,

source

pub fn lerp_unnormalized(from: Self, to: Self, factor: T) -> Selfwhere T: Clamp + Zero + One,

Performs linear interpolation without normalizing the result.

This is probably not what you’re looking for. For an implementation that normalizes the result (which is more commonly wanted), see the Lerp implementation.

source

pub fn lerp_unclamped_unnormalized(from: Self, to: Self, factor: T) -> Self

Performs linear interpolation without normalizing the result and without implicitly constraining factor to be between 0 and 1.

This is probably not what you’re looking for. For an implementation that normalizes the result (which is more commonly wanted), see the Lerp implementation.

source§

impl<T> Quaternion<T>where T: Lerp<T, Output = T> + Add<T, Output = T> + Real,

source

pub fn slerp_unclamped(from: Self, to: Self, factor: T) -> Self

Performs spherical linear interpolation without implictly constraining factor to be between 0 and 1.

use std::f32::consts::PI;

let from = Quaternion::rotation_z(0_f32);
let to = Quaternion::rotation_z(PI*9./10.);

let angles = 32;
for i in 0..angles {
    let factor = (i as f32) / (angles as f32);
    let expected = Quaternion::rotation_z(factor * PI*9./10.);
    let slerp = Quaternion::slerp(from, to, factor);
    assert_relative_eq!(slerp, expected);
}
source

pub fn slerp(from: Self, to: Self, factor: T) -> Selfwhere T: Clamp,

Perform spherical linear interpolation, constraining factor to be between 0 and 1.

Trait Implementations§

source§

impl<T: AbsDiffEq> AbsDiffEq<Quaternion<T>> for Quaternion<T>where T::Epsilon: Copy,

§

type Epsilon = <T as AbsDiffEq<T>>::Epsilon

Used for specifying relative comparisons.
source§

fn default_epsilon() -> T::Epsilon

The default tolerance to use when testing values that are close together. Read more
source§

fn abs_diff_eq(&self, other: &Self, epsilon: Self::Epsilon) -> bool

A test for equality that uses the absolute difference to compute the approximate equality of two numbers.
source§

fn abs_diff_ne(&self, other: &Rhs, epsilon: Self::Epsilon) -> bool

The inverse of AbsDiffEq::abs_diff_eq.
source§

impl<T> Add<Quaternion<T>> for Quaternion<T>where T: Add<Output = T>,

§

type Output = Quaternion<T>

The resulting type after applying the + operator.
source§

fn add(self, rhs: Self) -> Self::Output

Performs the + operation. Read more
source§

impl<T: Clone> Clone for Quaternion<T>

source§

fn clone(&self) -> Quaternion<T>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<T: Debug> Debug for Quaternion<T>

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<T: Zero + One> Default for Quaternion<T>

The default value for a quaternion is the identity.

assert_eq!(Quaternion::<f32>::identity(), Quaternion::default());
source§

fn default() -> Self

Returns the “default value” for a type. Read more
source§

impl<'de, T> Deserialize<'de> for Quaternion<T>where T: Deserialize<'de>,

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<T> Div<T> for Quaternion<T>where T: Copy + Div<Output = T>,

§

type Output = Quaternion<T>

The resulting type after applying the / operator.
source§

fn div(self, rhs: T) -> Self::Output

Performs the / operation. Read more
source§

impl<T> From<Quaternion<T>> for Mat3<T>where T: Copy + Zero + One + Mul<Output = T> + Add<Output = T> + Sub<Output = T>,

source§

fn from(q: Quaternion<T>) -> Self

Converts to this type from the input type.
source§

impl<T> From<Quaternion<T>> for Mat3<T>where T: Copy + Zero + One + Mul<Output = T> + Add<Output = T> + Sub<Output = T>,

source§

fn from(q: Quaternion<T>) -> Self

Converts to this type from the input type.
source§

impl<T> From<Quaternion<T>> for Mat4<T>where T: Copy + Zero + One + Mul<Output = T> + Add<Output = T> + Sub<Output = T>,

Rotation matrices can be obtained from quaternions. This implementation only works properly if the quaternion is normalized.

use std::f32::consts::PI;

let angles = 32;
for i in 0..angles {
    let theta = PI * 2. * (i as f32) / (angles as f32);

    assert_relative_eq!(Mat4::rotation_x(theta), Mat4::from(Quaternion::rotation_x(theta)), epsilon = 0.000001);
    assert_relative_eq!(Mat4::rotation_y(theta), Mat4::from(Quaternion::rotation_y(theta)), epsilon = 0.000001);
    assert_relative_eq!(Mat4::rotation_z(theta), Mat4::from(Quaternion::rotation_z(theta)), epsilon = 0.000001);

    assert_relative_eq!(Mat4::rotation_x(theta), Mat4::rotation_3d(theta, Vec4::unit_x()));
    assert_relative_eq!(Mat4::rotation_y(theta), Mat4::rotation_3d(theta, Vec4::unit_y()));
    assert_relative_eq!(Mat4::rotation_z(theta), Mat4::rotation_3d(theta, Vec4::unit_z()));

    // See what rotating unit vectors do for most angles between 0 and 2*PI.
    // It's helpful to picture this as a right-handed coordinate system.

    let v = Vec4::unit_y();
    let m = Mat4::rotation_x(theta);
    assert_relative_eq!(m * v, Vec4::new(0., theta.cos(), theta.sin(), 0.));

    let v = Vec4::unit_z();
    let m = Mat4::rotation_y(theta);
    assert_relative_eq!(m * v, Vec4::new(theta.sin(), 0., theta.cos(), 0.));

    let v = Vec4::unit_x();
    let m = Mat4::rotation_z(theta);
    assert_relative_eq!(m * v, Vec4::new(theta.cos(), theta.sin(), 0., 0.));
}
source§

fn from(q: Quaternion<T>) -> Self

Converts to this type from the input type.
source§

impl<T> From<Quaternion<T>> for Mat4<T>where T: Copy + Zero + One + Mul<Output = T> + Add<Output = T> + Sub<Output = T>,

Rotation matrices can be obtained from quaternions. This implementation only works properly if the quaternion is normalized.

use std::f32::consts::PI;

let angles = 32;
for i in 0..angles {
    let theta = PI * 2. * (i as f32) / (angles as f32);

    assert_relative_eq!(Mat4::rotation_x(theta), Mat4::from(Quaternion::rotation_x(theta)), epsilon = 0.000001);
    assert_relative_eq!(Mat4::rotation_y(theta), Mat4::from(Quaternion::rotation_y(theta)), epsilon = 0.000001);
    assert_relative_eq!(Mat4::rotation_z(theta), Mat4::from(Quaternion::rotation_z(theta)), epsilon = 0.000001);

    assert_relative_eq!(Mat4::rotation_x(theta), Mat4::rotation_3d(theta, Vec4::unit_x()));
    assert_relative_eq!(Mat4::rotation_y(theta), Mat4::rotation_3d(theta, Vec4::unit_y()));
    assert_relative_eq!(Mat4::rotation_z(theta), Mat4::rotation_3d(theta, Vec4::unit_z()));

    // See what rotating unit vectors do for most angles between 0 and 2*PI.
    // It's helpful to picture this as a right-handed coordinate system.

    let v = Vec4::unit_y();
    let m = Mat4::rotation_x(theta);
    assert_relative_eq!(m * v, Vec4::new(0., theta.cos(), theta.sin(), 0.));

    let v = Vec4::unit_z();
    let m = Mat4::rotation_y(theta);
    assert_relative_eq!(m * v, Vec4::new(theta.sin(), 0., theta.cos(), 0.));

    let v = Vec4::unit_x();
    let m = Mat4::rotation_z(theta);
    assert_relative_eq!(m * v, Vec4::new(theta.cos(), theta.sin(), 0., 0.));
}
source§

fn from(q: Quaternion<T>) -> Self

Converts to this type from the input type.
source§

impl<T> From<Quaternion<T>> for SimdVec3<T>

A Vec3 can be created directly from a quaternion’s x, y and z elements.

source§

fn from(v: Quaternion<T>) -> Self

Converts to this type from the input type.
source§

impl<T> From<Quaternion<T>> for SimdVec4<T>

A Vec4 can be created directly from a quaternion’s x, y, z and w elements.

source§

fn from(v: Quaternion<T>) -> Self

Converts to this type from the input type.
source§

impl<T> From<Quaternion<T>> for Vec3<T>

A Vec3 can be created directly from a quaternion’s x, y and z elements.

source§

fn from(v: Quaternion<T>) -> Self

Converts to this type from the input type.
source§

impl<T> From<Quaternion<T>> for Vec4<T>

A Vec4 can be created directly from a quaternion’s x, y, z and w elements.

source§

fn from(v: Quaternion<T>) -> Self

Converts to this type from the input type.
source§

impl<T> From<Vec4<T>> for Quaternion<T>

A quaternion can be created directly from a Vec4’s x, y, z and w elements. You are responsible for ensuring that the resulting quaternion is normalized.

source§

fn from(v: Vec4<T>) -> Self

Converts to this type from the input type.
source§

impl<T> From<Vec4<T>> for Quaternion<T>

A quaternion can be created directly from a Vec4’s x, y, z and w elements. You are responsible for ensuring that the resulting quaternion is normalized.

source§

fn from(v: SimdVec4<T>) -> Self

Converts to this type from the input type.
source§

impl<T: Hash> Hash for Quaternion<T>

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl<'a, T, Factor> Lerp<Factor> for &'a Quaternion<T>where T: Lerp<Factor, Output = T> + Add<T, Output = T> + Real, Factor: Copy,

The Lerp implementation for quaternion is the “Normalized LERP”.

§

type Output = Quaternion<T>

The resulting type after performing the LERP operation.
source§

fn lerp_unclamped_precise(from: Self, to: Self, factor: Factor) -> Quaternion<T>

Returns the linear interpolation of from to to with factor unconstrained, using a possibly slower but more precise operation. Read more
source§

fn lerp_unclamped(from: Self, to: Self, factor: Factor) -> Quaternion<T>

Returns the linear interpolation of from to to with factor unconstrained, using the supposedly fastest but less precise implementation. Read more
source§

fn lerp_unclamped_inclusive_range( range: RangeInclusive<Self>, factor: Factor ) -> Self::Output

Version of lerp_unclamped() that used a single RangeInclusive parameter instead of two values.
source§

fn lerp_unclamped_precise_inclusive_range( range: RangeInclusive<Self>, factor: Factor ) -> Self::Output

Version of lerp_unclamped_precise() that used a single RangeInclusive parameter instead of two values.
source§

impl<T, Factor> Lerp<Factor> for Quaternion<T>where T: Lerp<Factor, Output = T> + Add<T, Output = T> + Real, Factor: Copy,

The Lerp implementation for quaternion is the “Normalized LERP”.

§

type Output = Quaternion<T>

The resulting type after performing the LERP operation.
source§

fn lerp_unclamped_precise(from: Self, to: Self, factor: Factor) -> Self

Returns the linear interpolation of from to to with factor unconstrained, using a possibly slower but more precise operation. Read more
source§

fn lerp_unclamped(from: Self, to: Self, factor: Factor) -> Self

Returns the linear interpolation of from to to with factor unconstrained, using the supposedly fastest but less precise implementation. Read more
source§

fn lerp_unclamped_inclusive_range( range: RangeInclusive<Self>, factor: Factor ) -> Self::Output

Version of lerp_unclamped() that used a single RangeInclusive parameter instead of two values.
source§

fn lerp_unclamped_precise_inclusive_range( range: RangeInclusive<Self>, factor: Factor ) -> Self::Output

Version of lerp_unclamped_precise() that used a single RangeInclusive parameter instead of two values.
source§

impl<T> Mul<Quaternion<T>> for Quaternion<T>where T: Copy + Mul<Output = T> + Sub<Output = T> + Zero + Add<T, Output = T>,

The Mul implementation for quaternions is concatenation, a.k.a Grassman product.

use std::f32::consts::PI;

let v = Vec4::unit_x();
let p = Quaternion::rotation_y(PI/2.);
let q = Quaternion::rotation_z(PI/2.);
assert_relative_eq!((p*q)*v, p*(q*v));
assert_relative_eq!(p*q*v, Vec4::unit_y());
assert_relative_eq!(q*p*v, -Vec4::unit_z());
§

type Output = Quaternion<T>

The resulting type after applying the * operator.
source§

fn mul(self, rhs: Self) -> Self::Output

Performs the * operation. Read more
source§

impl<T> Mul<T> for Quaternion<T>where T: Mul<Output = T> + Copy,

§

type Output = Quaternion<T>

The resulting type after applying the * operator.
source§

fn mul(self, rhs: T) -> Self::Output

Performs the * operation. Read more
source§

impl<T: Real + Add<T, Output = T>> Mul<Vec3<T>> for Quaternion<T>

3D vectors can be rotated by being premultiplied by a quaternion, assuming the quaternion is normalized.

§

type Output = Vec3<T>

The resulting type after applying the * operator.
source§

fn mul(self, rhs: SimdVec3<T>) -> Self::Output

Performs the * operation. Read more
source§

impl<T: Real + Add<T, Output = T>> Mul<Vec3<T>> for Quaternion<T>

3D vectors can be rotated by being premultiplied by a quaternion, assuming the quaternion is normalized.

§

type Output = Vec3<T>

The resulting type after applying the * operator.
source§

fn mul(self, rhs: Vec3<T>) -> Self::Output

Performs the * operation. Read more
source§

impl<T: Real + Add<T, Output = T>> Mul<Vec4<T>> for Quaternion<T>

3D vectors can be rotated by being premultiplied by a quaternion, assuming the quaternion is normalized. On Vec4s, the w element is preserved, so you can safely rotate points and directions.

use std::f32::consts::PI;

let v = Vec4::unit_x();

let q = Quaternion::<f32>::identity();
assert_relative_eq!(q * v, v);

let q = Quaternion::rotation_z(PI);
assert_relative_eq!(q * v, -v);

let q = Quaternion::rotation_z(PI * 0.5);
assert_relative_eq!(q * v, Vec4::unit_y());

let q = Quaternion::rotation_z(PI * 1.5);
assert_relative_eq!(q * v, -Vec4::unit_y());

let angles = 32;
for i in 0..angles {
    let theta = PI * 2. * (i as f32) / (angles as f32);

    // See what rotating unit vectors do for most angles between 0 and 2*PI.
    // It's helpful to picture this as a right-handed coordinate system.

    let v = Vec4::unit_y();
    let q = Quaternion::rotation_x(theta);
    assert_relative_eq!(q * v, Vec4::new(0., theta.cos(), theta.sin(), 0.));

    let v = Vec4::unit_z();
    let q = Quaternion::rotation_y(theta);
    assert_relative_eq!(q * v, Vec4::new(theta.sin(), 0., theta.cos(), 0.));

    let v = Vec4::unit_x();
    let q = Quaternion::rotation_z(theta);
    assert_relative_eq!(q * v, Vec4::new(theta.cos(), theta.sin(), 0., 0.));
}
§

type Output = Vec4<T>

The resulting type after applying the * operator.
source§

fn mul(self, rhs: SimdVec4<T>) -> Self::Output

Performs the * operation. Read more
source§

impl<T: Real + Add<T, Output = T>> Mul<Vec4<T>> for Quaternion<T>

3D vectors can be rotated by being premultiplied by a quaternion, assuming the quaternion is normalized. On Vec4s, the w element is preserved, so you can safely rotate points and directions.

use std::f32::consts::PI;

let v = Vec4::unit_x();

let q = Quaternion::<f32>::identity();
assert_relative_eq!(q * v, v);

let q = Quaternion::rotation_z(PI);
assert_relative_eq!(q * v, -v);

let q = Quaternion::rotation_z(PI * 0.5);
assert_relative_eq!(q * v, Vec4::unit_y());

let q = Quaternion::rotation_z(PI * 1.5);
assert_relative_eq!(q * v, -Vec4::unit_y());

let angles = 32;
for i in 0..angles {
    let theta = PI * 2. * (i as f32) / (angles as f32);

    // See what rotating unit vectors do for most angles between 0 and 2*PI.
    // It's helpful to picture this as a right-handed coordinate system.

    let v = Vec4::unit_y();
    let q = Quaternion::rotation_x(theta);
    assert_relative_eq!(q * v, Vec4::new(0., theta.cos(), theta.sin(), 0.));

    let v = Vec4::unit_z();
    let q = Quaternion::rotation_y(theta);
    assert_relative_eq!(q * v, Vec4::new(theta.sin(), 0., theta.cos(), 0.));

    let v = Vec4::unit_x();
    let q = Quaternion::rotation_z(theta);
    assert_relative_eq!(q * v, Vec4::new(theta.cos(), theta.sin(), 0., 0.));
}
§

type Output = Vec4<T>

The resulting type after applying the * operator.
source§

fn mul(self, rhs: Vec4<T>) -> Self::Output

Performs the * operation. Read more
source§

impl<T> Neg for Quaternion<T>where T: Neg<Output = T>,

§

type Output = Quaternion<T>

The resulting type after applying the - operator.
source§

fn neg(self) -> Self::Output

Performs the unary - operation. Read more
source§

impl<T: PartialEq> PartialEq<Quaternion<T>> for Quaternion<T>

source§

fn eq(&self, other: &Quaternion<T>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<T: RelativeEq> RelativeEq<Quaternion<T>> for Quaternion<T>where T::Epsilon: Copy,

source§

fn default_max_relative() -> T::Epsilon

The default relative tolerance for testing values that are far-apart. Read more
source§

fn relative_eq( &self, other: &Self, epsilon: T::Epsilon, max_relative: T::Epsilon ) -> bool

A test for equality that uses a relative comparison if the values are far apart.
source§

fn relative_ne( &self, other: &Rhs, epsilon: Self::Epsilon, max_relative: Self::Epsilon ) -> bool

The inverse of RelativeEq::relative_eq.
source§

impl<T> Serialize for Quaternion<T>where T: Serialize,

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<'a, T, Factor> Slerp<Factor> for &'a Quaternion<T>where T: Lerp<T, Output = T> + Add<T, Output = T> + Real, Factor: Into<T>,

§

type Output = Quaternion<T>

The resulting type after performing the SLERP operation.
source§

fn slerp_unclamped(from: Self, to: Self, factor: Factor) -> Quaternion<T>

Performs spherical linear interpolation without implictly constraining factor to be between 0 and 1.
source§

impl<T, Factor> Slerp<Factor> for Quaternion<T>where T: Lerp<T, Output = T> + Add<T, Output = T> + Real, Factor: Into<T>,

§

type Output = Quaternion<T>

The resulting type after performing the SLERP operation.
source§

fn slerp_unclamped(from: Self, to: Self, factor: Factor) -> Self

Performs spherical linear interpolation without implictly constraining factor to be between 0 and 1.
source§

impl<T> Sub<Quaternion<T>> for Quaternion<T>where T: Sub<Output = T>,

§

type Output = Quaternion<T>

The resulting type after applying the - operator.
source§

fn sub(self, rhs: Self) -> Self::Output

Performs the - operation. Read more
source§

impl<T: UlpsEq> UlpsEq<Quaternion<T>> for Quaternion<T>where T::Epsilon: Copy,

source§

fn default_max_ulps() -> u32

The default ULPs to tolerate when testing values that are far-apart. Read more
source§

fn ulps_eq(&self, other: &Self, epsilon: T::Epsilon, max_ulps: u32) -> bool

A test for equality that uses units in the last place (ULP) if the values are far apart.
source§

fn ulps_ne(&self, other: &Rhs, epsilon: Self::Epsilon, max_ulps: u32) -> bool

The inverse of UlpsEq::ulps_eq.
source§

impl<T: Copy> Copy for Quaternion<T>

source§

impl<T: Eq> Eq for Quaternion<T>

source§

impl<T> StructuralEq for Quaternion<T>

source§

impl<T> StructuralPartialEq for Quaternion<T>

Auto Trait Implementations§

§

impl<T> RefUnwindSafe for Quaternion<T>where T: RefUnwindSafe,

§

impl<T> Send for Quaternion<T>where T: Send,

§

impl<T> Sync for Quaternion<T>where T: Sync,

§

impl<T> Unpin for Quaternion<T>where T: Unpin,

§

impl<T> UnwindSafe for Quaternion<T>where T: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<T> DeserializeOwned for Twhere T: for<'de> Deserialize<'de>,