basic qua ext rotation functions

This commit is contained in:
BlackMATov
2021-01-26 02:06:46 +07:00
parent 4279552522
commit 1d5ee20967
4 changed files with 108 additions and 0 deletions

View File

@@ -662,3 +662,57 @@ namespace vmath_hpp
return dot(v, normal) / length2(normal) * normal;
}
}
//
// Quaternion Transform
//
namespace vmath_hpp
{
// qrotate
template < typename T >
[[nodiscard]] qua<T> qrotate(T angle, const vec<T, 3>& axis) {
const auto [s, c] = sincos(angle * T(0.5));
const auto [x, y, z] = normalize(axis);
return {vec{x,y,z} * s, c};
}
template < typename T >
[[nodiscard]] qua<T> qrotate(const qua<T>& q, T angle, const vec<T, 3>& axis) {
return q * qrotate(angle, axis);
}
template < typename T >
[[nodiscard]] qua<T> qrotate_x(T angle) {
const auto [s, c] = sincos(angle * T(0.5));
return {s, T(0), T(0), c};
}
template < typename T >
[[nodiscard]] qua<T> qrotate_x(const qua<T>& q, T angle) {
return qrotate(q, angle, unit3_x<T>);
}
template < typename T >
[[nodiscard]] qua<T> qrotate_y(T angle) {
const auto [s, c] = sincos(angle * T(0.5));
return {T(0), s, T(0), c};
}
template < typename T >
[[nodiscard]] qua<T> qrotate_y(const qua<T>& q, T angle) {
return qrotate(q, angle, unit3_y<T>);
}
template < typename T >
[[nodiscard]] qua<T> qrotate_z(T angle) {
const auto [s, c] = sincos(angle * T(0.5));
return {T(0), T(0), s, c};
}
template < typename T >
[[nodiscard]] qua<T> qrotate_z(const qua<T>& q, T angle) {
return qrotate(q, angle, unit3_z<T>);
}
}

View File

@@ -226,3 +226,24 @@ namespace vmath_hpp
return not_equal_to(vec{xs}, vec{ys});
}
}
//
// Quaternion Functions
//
namespace vmath_hpp
{
// conjugate
template < typename T >
[[nodiscard]] constexpr qua<T> conjugate(const qua<T>& q) {
return {-q.v, q.s};
}
// inverse
template < typename T >
[[nodiscard]] constexpr qua<T> inverse(const qua<T>& q) {
return conjugate(q) * rcp(dot(q, q));
}
}