Struct vek::quaternion::repr_c::Quaternion [] [src]

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

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

Methods

impl<T> Quaternion<T>
[src]

[src]

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

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

[src]

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

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

[src]

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

Not to be confused with into_angle_axis().

[src]

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.

[src]

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);

[src]

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());

[src]

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());

[src]

Gets the dot product between two quaternions.

[src]

Gets a normalized copy of this quaternion.

[src]

Gets this quaternion's magnitude, squared.

[src]

Gets this quaternion's magnitude.

[src]

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


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

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);

[src]

Creates a Quaternion from an angle and axis.

[src]

[src]

[src]

[src]

[src]

[src]

[src]

[src]

[src]

[src]

[src]

[src]

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 q = Quaternion::rotation_3d(PI*4./5., Vec3::new(1., 2., 3.));
let (angle, axis) = q.into_angle_axis();
assert_relative_eq!(angle, PI*4./5.);
assert_relative_eq!(axis, Vec3::new(1., 2., 3.));

[src]

[src]

[src]

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

[src]

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.

[src]

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.

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

[src]

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.

[src]

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.

impl<T> Quaternion<T> where
    T: Lerp<T, Output = T> + Sum + Float
[src]

[src]

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);
}

[src]

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

Trait Implementations

impl<T: Debug> Debug for Quaternion<T>
[src]

[src]

Formats the value using the given formatter.

impl<T: Clone> Clone for Quaternion<T>
[src]

[src]

Returns a copy of the value. Read more

1.0.0
[src]

Performs copy-assignment from source. Read more

impl<T: Copy> Copy for Quaternion<T>
[src]

impl<T: Hash> Hash for Quaternion<T>
[src]

[src]

Feeds this value into the given [Hasher]. Read more

1.3.0
[src]

Feeds a slice of this type into the given [Hasher]. Read more

impl<T: Eq> Eq for Quaternion<T>
[src]

impl<T: PartialEq> PartialEq for Quaternion<T>
[src]

[src]

This method tests for self and other values to be equal, and is used by ==. Read more

[src]

This method tests for !=.

impl<T: Zero + One> Default for Quaternion<T>
[src]

The default value for a Quaternion is the identity.

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

[src]

Returns the "default value" for a type. Read more

impl<T, Factor> Lerp<Factor> for Quaternion<T> where
    T: Lerp<Factor, Output = T> + Sum + Float,
    Factor: Copy
[src]

The Lerp implementation for Quaternion is the "Normalized LERP".

The resulting type after performing the LERP operation.

[src]

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

[src]

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

[src]

Alias to lerp_unclamped which constrains factor to be between 0 and 1 (inclusive). Read more

[src]

Alias to lerp_unclamped_precise which constrains factor to be between 0 and 1 (inclusive). Read more

impl<'a, T, Factor> Lerp<Factor> for &'a Quaternion<T> where
    T: Lerp<Factor, Output = T> + Sum + Float,
    Factor: Copy
[src]

The Lerp implementation for Quaternion is the "Normalized LERP".

The resulting type after performing the LERP operation.

[src]

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

[src]

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

[src]

Alias to lerp_unclamped which constrains factor to be between 0 and 1 (inclusive). Read more

[src]

Alias to lerp_unclamped_precise which constrains factor to be between 0 and 1 (inclusive). Read more

impl<T, Factor> Slerp<Factor> for Quaternion<T> where
    T: Lerp<T, Output = T> + Sum + Float,
    Factor: Into<T>, 
[src]

The resulting type after performing the SLERP operation.

[src]

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

[src]

Performs spherical linear interpolation, constraining factor to be between 0 and 1. Read more

impl<'a, T, Factor> Slerp<Factor> for &'a Quaternion<T> where
    T: Lerp<T, Output = T> + Sum + Float,
    Factor: Into<T>, 
[src]

The resulting type after performing the SLERP operation.

[src]

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

[src]

Performs spherical linear interpolation, constraining factor to be between 0 and 1. Read more

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

The resulting type after applying the - operator.

[src]

Performs the unary - operation.

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

The resulting type after applying the / operator.

[src]

Performs the / operation.

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

The resulting type after applying the + operator.

[src]

Performs the + operation.

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

The resulting type after applying the - operator.

[src]

Performs the - operation.

impl<T> Mul for Quaternion<T> where
    T: Copy + Mul<Output = T> + Sub<Output = T> + Zero + Sum
[src]

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());

The resulting type after applying the * operator.

[src]

Performs the * operation.

impl<T> Mul<T> for Quaternion<T> where
    T: Mul<Output = T> + Copy
[src]

The resulting type after applying the * operator.

[src]

Performs the * operation.

impl<T: ApproxEq> ApproxEq for Quaternion<T> where
    T::Epsilon: Copy
[src]

Used for specifying relative comparisons.

[src]

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

[src]

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

[src]

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

[src]

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

[src]

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

[src]

The inverse of ApproxEq::relative_eq.

[src]

The inverse of ApproxEq::ulps_eq.

impl<T: Float + Sum> Mul<Vec4<T>> for Quaternion<T>
[src]

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.));
}

The resulting type after applying the * operator.

[src]

Performs the * operation.

impl<T: Float + Sum> Mul<Vec3<T>> for Quaternion<T>
[src]

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

The resulting type after applying the * operator.

[src]

Performs the * operation.

impl<T> From<Vec4<T>> for Quaternion<T>
[src]

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.

[src]

Performs the conversion.