Blender V4.3
blender::math::QuaternionBase< T > Struct Template Reference

#include <BLI_math_quaternion_types.hh>

Public Member Functions

 QuaternionBase ()=default
 
 QuaternionBase (const T &new_w, const T &new_x, const T &new_y, const T &new_z)
 
 QuaternionBase (const VecBase< T, 4 > &vec)
 
 QuaternionBase (const T &real, const VecBase< T, 3 > &imaginary)
 
 operator VecBase< T, 4 > () const
 
const VecBase< T, 3 > & imaginary_part () const
 
VecBase< T, 3 > & imaginary_part ()
 
QuaternionBaseoperator*= (const QuaternionBase &b)
 
uint64_t hash () const
 
Quaternion
AngleRadianBase< Ttwist_angle (const Axis axis) const
 
QuaternionBase twist (const Axis axis) const
 
QuaternionBase swing (const Axis axis) const
 
QuaternionBase wrapped_around (const QuaternionBase &reference) const
 

Static Public Member Functions

static QuaternionBase identity ()
 
static QuaternionBase zero ()
 

Public Attributes

T w
 
T x
 
T y
 
T z
 

Friends

QuaternionBase operator* (const QuaternionBase &a, const QuaternionBase &b)
 
QuaternionBase operator* (const QuaternionBase &a, const T &b)
 
QuaternionBase operator- (const QuaternionBase &a)
 
std::ostream & operator<< (std::ostream &stream, const QuaternionBase &rot)
 

Conversion from/to Expmap

VecBase< T, 3 > expmap () const
 
static QuaternionBase expmap (const VecBase< T, 3 > &expmap)
 

Detailed Description

template<typename T>
struct blender::math::QuaternionBase< T >

A blender::math::QuaternionBase<T> represents either an orientation or a rotation.

Mainly used for rigging and armature deformations as they have nice mathematical properties (eg: smooth shortest path interpolation). A blender::math::QuaternionBase<T> is cheaper to combine than MatBase<T, 3, 3>. However, transforming points is slower. Consider converting to a rotation matrix if you are rotating many points.

See this for more information: https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation#Performance_comparisons

Definition at line 37 of file BLI_math_quaternion_types.hh.

Constructor & Destructor Documentation

◆ QuaternionBase() [1/4]

template<typename T >
blender::math::QuaternionBase< T >::QuaternionBase ( )
default

◆ QuaternionBase() [2/4]

template<typename T >
blender::math::QuaternionBase< T >::QuaternionBase ( const T & new_w,
const T & new_x,
const T & new_y,
const T & new_z )
inline

Definition at line 42 of file BLI_math_quaternion_types.hh.

◆ QuaternionBase() [3/4]

template<typename T >
blender::math::QuaternionBase< T >::QuaternionBase ( const VecBase< T, 4 > & vec)
inlineexplicit

Creates a quaternion from an vector without reordering the components.

Note
Component order must follow the scalar constructor (w, x, y, z).

Definition at line 49 of file BLI_math_quaternion_types.hh.

◆ QuaternionBase() [4/4]

template<typename T >
blender::math::QuaternionBase< T >::QuaternionBase ( const T & real,
const VecBase< T, 3 > & imaginary )
inline

Creates a quaternion from real (w) and imaginary parts (x, y, z).

Definition at line 54 of file BLI_math_quaternion_types.hh.

Member Function Documentation

◆ expmap() [1/2]

template<typename T >
VecBase< T, 3 > blender::math::QuaternionBase< T >::expmap ( ) const

Create an exponential map representation of this quaternion. An exponential map is basically the rotation axis multiplied by the rotation angle.

Definition at line 692 of file BLI_math_quaternion.hh.

References BLI_assert, blender::math::is_unit_scale(), and blender::math::to_axis_angle().

Referenced by blender::bke::attribute_math::DefaultMixerStruct< math::Quaternion >::expmap_to_quat(), blender::bke::attribute_math::float4x4Mixer::finalize(), blender::bke::attribute_math::mix3(), blender::bke::attribute_math::mix4(), and blender::tests::TEST().

◆ expmap() [2/2]

template<typename T >
QuaternionBase< T > blender::math::QuaternionBase< T >::expmap ( const VecBase< T, 3 > & expmap)
static

Create a quaternion from an exponential map representation. An exponential map is basically the rotation axis multiplied by the rotation angle.

Definition at line 680 of file BLI_math_quaternion.hh.

References angle(), LIKELY, blender::math::normalize_and_get_length(), T, and blender::math::to_quaternion().

Referenced by blender::bke::attribute_math::mix3(), and blender::bke::attribute_math::mix4().

◆ hash()

template<typename T >
uint64_t blender::math::QuaternionBase< T >::hash ( ) const
inline

Definition at line 163 of file BLI_math_quaternion_types.hh.

◆ identity()

◆ imaginary_part() [1/2]

template<typename T >
VecBase< T, 3 > & blender::math::QuaternionBase< T >::imaginary_part ( )
inline

◆ imaginary_part() [2/2]

template<typename T >
const VecBase< T, 3 > & blender::math::QuaternionBase< T >::imaginary_part ( ) const
inline

Returns the imaginary part of this quaternion (x, y, z).

Definition at line 111 of file BLI_math_quaternion_types.hh.

References blender::math::QuaternionBase< T >::x.

Referenced by blender::math::pow().

◆ operator VecBase< T, 4 >()

template<typename T >
blender::math::QuaternionBase< T >::operator VecBase< T, 4 > ( ) const
inlineexplicit

◆ operator*=()

template<typename T >
QuaternionBase & blender::math::QuaternionBase< T >::operator*= ( const QuaternionBase< T > & b)
inline

Definition at line 143 of file BLI_math_quaternion_types.hh.

References b.

◆ swing()

template<typename T >
QuaternionBase< T > blender::math::QuaternionBase< T >::swing ( const Axis axis) const

Returns the swing part of this quaternion for the basis axis direction. The swing is the original quaternion minus the twist around axis. So we have the following identity : q = q.swing(axis) * q.twist(axis)

Definition at line 149 of file BLI_math_quaternion.hh.

References blender::math::abs(), BLI_assert, blender::math::canonicalize(), and blender::math::invert_normalized().

Referenced by blender::tests::TEST().

◆ twist()

template<typename T >
QuaternionBase< T > blender::math::QuaternionBase< T >::twist ( const Axis axis) const

Returns the twist part of this quaternion for the axis direction. The twist is the isolated rotation in the plane whose axis is normal to.

Definition at line 161 of file BLI_math_quaternion.hh.

References blender::math::canonicalize(), blender::math::AngleCartesianBase< T >::cos(), blender::math::AngleCartesianBase< T >::from_point(), blender::math::AngleCartesianBase< T >::sin(), T, and blender::VecBase< T, Size >::yzw().

Referenced by blender::tests::TEST().

◆ twist_angle()

template<typename T >
AngleRadianBase< T > blender::math::QuaternionBase< T >::twist_angle ( const Axis axis) const

Returns the full twist angle for a given axis direction. The twist is the isolated rotation in the plane whose axis is normal to.

Definition at line 141 of file BLI_math_quaternion.hh.

References blender::math::canonicalize(), T, and blender::VecBase< T, Size >::yzw().

Referenced by blender::tests::TEST().

◆ wrapped_around()

template<typename T >
QuaternionBase< T > blender::math::QuaternionBase< T >::wrapped_around ( const QuaternionBase< T > & reference) const

Methods. Return this quaternions orientation but wrapped around reference.

This means the interpolation between the returned value and reference will always take the shortest path. The angle between them will not be more than pi.

Note
This quaternion is expected to be a unit quaternion.
Works even if reference is not a unit quaternion.

Definition at line 177 of file BLI_math_quaternion.hh.

References BLI_assert, blender::math::distance_squared(), blender::math::invert_normalized(), blender::math::is_unit_scale(), len, blender::math::normalize_and_get_length(), and result.

◆ zero()

template<typename T >
static QuaternionBase blender::math::QuaternionBase< T >::zero ( )
inlinestatic

This is just for convenience. Does not represent a rotation as it is degenerate.

Definition at line 65 of file BLI_math_quaternion_types.hh.

Referenced by blender::tests::TEST(), and blender::tests::TEST().

Friends And Related Symbol Documentation

◆ operator* [1/2]

template<typename T >
QuaternionBase operator* ( const QuaternionBase< T > & a,
const QuaternionBase< T > & b )
friend

Operators.

Definition at line 135 of file BLI_math_quaternion_types.hh.

◆ operator* [2/2]

template<typename T >
QuaternionBase operator* ( const QuaternionBase< T > & a,
const T & b )
friend

Definition at line 150 of file BLI_math_quaternion_types.hh.

◆ operator-

template<typename T >
QuaternionBase operator- ( const QuaternionBase< T > & a)
friend

Definition at line 156 of file BLI_math_quaternion_types.hh.

◆ operator<<

template<typename T >
std::ostream & operator<< ( std::ostream & stream,
const QuaternionBase< T > & rot )
friend

Definition at line 168 of file BLI_math_quaternion_types.hh.

Member Data Documentation

◆ w

◆ x

◆ y

◆ z


The documentation for this struct was generated from the following files: