Blender V4.3
BLI_math_euler.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
14
16#include "BLI_math_matrix.hh"
18
19namespace blender::math {
20
21/* -------------------------------------------------------------------- */
25template<typename T> EulerXYZBase<T> EulerXYZBase<T>::wrapped() const
26{
28 result.x() = AngleRadianBase<T>(result.x()).wrapped().radian();
29 result.y() = AngleRadianBase<T>(result.y()).wrapped().radian();
30 result.z() = AngleRadianBase<T>(result.z()).wrapped().radian();
31 return result;
32}
33
34template<typename T>
36{
38 result.x() = AngleRadianBase<T>(result.x()).wrapped_around(reference.x()).radian();
39 result.y() = AngleRadianBase<T>(result.y()).wrapped_around(reference.y()).radian();
40 result.z() = AngleRadianBase<T>(result.z()).wrapped_around(reference.z()).radian();
41 return result;
42}
43
46/* -------------------------------------------------------------------- */
50template<typename T> QuaternionBase<T> to_quaternion(const EulerXYZBase<T> &eul)
51{
52 using AngleT = typename EulerXYZBase<T>::AngleT;
53 const AngleT h_angle_i = eul.x() / 2;
54 const AngleT h_angle_j = eul.y() / 2;
55 const AngleT h_angle_k = eul.z() / 2;
56 const T cos_i = math::cos(h_angle_i);
57 const T cos_j = math::cos(h_angle_j);
58 const T cos_k = math::cos(h_angle_k);
59 const T sin_i = math::sin(h_angle_i);
60 const T sin_j = math::sin(h_angle_j);
61 const T sin_k = math::sin(h_angle_k);
62 const T cos_cos = cos_i * cos_k;
63 const T cos_sin = cos_i * sin_k;
64 const T sin_cos = sin_i * cos_k;
65 const T sin_sin = sin_i * sin_k;
66
68 quat.w = cos_j * cos_cos + sin_j * sin_sin;
69 quat.x = cos_j * sin_cos - sin_j * cos_sin;
70 quat.y = cos_j * sin_sin + sin_j * cos_cos;
71 quat.z = cos_j * cos_sin - sin_j * sin_cos;
72 return quat;
73}
74
75template<typename T> QuaternionBase<T> to_quaternion(const Euler3Base<T> &eulO)
76{
77 /* Swizzle to XYZ. */
78 EulerXYZBase<T> eul_xyz{eulO.ijk()};
79 /* Flip with parity. */
80 eul_xyz.y() = eulO.parity() ? -eul_xyz.y() : eul_xyz.y();
81 /* Quaternion conversion. */
82 QuaternionBase<T> quat = to_quaternion(eul_xyz);
83 /* Swizzle back from XYZ. */
84 VecBase<T, 3> quat_xyz;
85 quat_xyz[eulO.i_index()] = quat.x;
86 quat_xyz[eulO.j_index()] = eulO.parity() ? -quat.y : quat.y;
87 quat_xyz[eulO.k_index()] = quat.z;
88
89 return {quat.w, UNPACK3(quat_xyz)};
90}
91
94/* -------------------------------------------------------------------- */
98template<typename T, typename AngleT = AngleRadian>
100{
101 /* Use quaternions as intermediate representation for now... */
103}
104
105template<typename T, typename AngleT = AngleRadian>
107{
108 /* Use quaternions as intermediate representation for now... */
110}
111
114} // namespace blender::math
#define UNPACK3(a)
T cos(const AngleRadianBase< T > &a)
QuaternionBase< T > to_quaternion(const AxisAngleBase< T, AngleT > &axis_angle)
AxisAngleBase< T, AngleT > to_axis_angle(const EulerXYZBase< T > &euler)
T sin(const AngleRadianBase< T > &a)
AngleRadianBase wrapped_around(const AngleRadianBase &reference) const
EulerXYZBase wrapped() const
EulerXYZBase wrapped_around(const EulerXYZBase &reference) const