Blender V5.0
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

Referenced by expmap(), swing(), twist(), and wrapped_around().

◆ 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, expmap(), blender::math::is_unit_scale(), and blender::math::to_axis_angle().

◆ expmap() [2/2]

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

◆ 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

Definition at line 115 of file BLI_math_quaternion_types.hh.

◆ 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.

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

◆ operator VecBase< T, 4 >()

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

Conversions.

Definition at line 78 of file BLI_math_quaternion_types.hh.

◆ 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.

◆ 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(), blender::math::Axis::as_int(), BLI_assert, blender::math::canonicalize(), input, blender::math::invert_normalized(), QuaternionBase(), and swing().

Referenced by swing(), and 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::Axis::as_int(), blender::math::canonicalize(), blender::math::AngleCartesianBase< T >::cos(), blender::math::AngleCartesianBase< T >::from_point(), QuaternionBase(), blender::math::AngleCartesianBase< T >::sin(), T, twist(), and blender::VecBase< T, Size >::yzw().

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

◆ 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::Axis::as_int(), 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(), input, blender::math::invert_normalized(), blender::math::is_unit_scale(), len, blender::math::normalize_and_get_length(), QuaternionBase(), result, and T.

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

◆ zero()

template<typename T>
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::math::DualQuaternionBase< float >::identity().

◆ 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

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

Definition at line 38 of file BLI_math_quaternion_types.hh.

Referenced by blender::math::angle_of(), blender::math::angle_of_signed(), blender::nodes::node_fn_rotation_to_quaternion_cc::SeparateQuaternionFunction::call(), blender::math::canonicalize(), blender::math::conjugate(), AttributeConverter< blender::math::Quaternion >::convert(), blender::draw::AttributeConverter< math::Quaternion >::convert(), blender::io::usd::detail::convert_value(), blender::io::fbx::create_transform_curve_data(), blender::io::usd::USDPointInstancerWriter::do_write(), blender::math::dot(), ED_view3d_cursor3d_update(), blender::math::detail::from_rotation(), blender::math::detail::from_rotation(), blender::math::is_equal(), blender::math::is_unit_scale(), blender::math::is_zero(), blender::ed::view3d::geometry_nodes_gizmos::matrix_from_position_and_up_direction(), blender::math::detail::normalized_to_quat_fast(), blender::math::QuaternionBase< float >::operator*, blender::math::QuaternionBase< float >::operator*, blender::math::QuaternionBase< float >::operator-, blender::math::pow(), blender::ed::geometry::run_node_group_exec(), blender::bke::bake::serialize_primitive_value(), blender::ed::geometry::store_input_node_values_rna_props(), blender::math::tests::TEST(), blender::math::tests::TEST(), blender::math::tests::TEST(), blender::tests::TEST(), blender::tests::TEST(), blender::tests::TEST(), blender::tests::TEST(), blender::math::to_axis_angle(), blender::math::to_dual_quaternion(), blender::math::to_quaternion(), blender::math::to_quaternion(), and blender::math::transform_point().

◆ x

◆ y

◆ z


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