52#if MOCHI_ASSERT_VERBOSE_ENABLED && MOCHI_LOG_ENABLED
53 auto norm =
Norm<3>(normalizedAxis);
57 "Quaternion::FromUnitAxisAngle expects a unit length vector, but got [%g, %g, %g] (magnitude %g).",
65 double c =
Cos(
static_cast<double>(angleRadians) * 0.5);
66 double s =
Sin(
static_cast<double>(angleRadians) * 0.5);
96 Vec4r vrotVector(rotVector[0], rotVector[1], rotVector[2], 0.0_r);
100inline real Quaternion::GetAngleImpl(
Quaternion& qPositiveNormalized,
real& vectorMag)
const {
105 if (qPositiveNormalized.
data[3] < 0_r) {
106 qPositiveNormalized.
data = -qPositiveNormalized.
data;
108 real w = qPositiveNormalized.
data[3];
113 return 2_r * (w < vectorMag ?
ACos(w) :
ASin(vectorMag));
119 return GetAngleImpl(qPositiveNormalized, vectorMag);
125 *outAngleRad = GetAngleImpl(qPositiveNormalized, vectorMag);
127 vectorMag > 1e-9_r ? (qPositiveNormalized.
data / vectorMag) :
Vec4r{1_r, 0_r, 0_r, 0_r};
128 *outAxis =
Real3{axis[0], axis[1], axis[2]};
134 *outAxis =
Vec4r{outAxisTemp[0], outAxisTemp[1], outAxisTemp[2], 0_r};
141 return outAxis * outAngle;
146 return Real3{r[0], r[1], r[2]};
197 auto r = *
this *
Vec4r{v[0], v[1], v[2], 0_r};
198 return Real3{r[0], r[1], r[2]};
219#if MOCHI_USE_REFLECTION
221struct SReflectTypeTraits<
superdex::Quaternion> {
222 static constexpr SReflect::CoreType coreType = SReflect::CoreType::CT_array;
223 static SReflect::ArrayTypeInfo
const& GetTypeInfo() {
224 static auto const* s_typeInfo =
225 SReflect::MakeFixedArrayTypeInfo<superdex::Quaternion, superdex::real, 4>(
"superdex::Quaternion");
static Quaternion RotationY(real a)
Quaternion operator*(Quaternion const &rhs) const
static Quaternion FromUnitAxisAngle(Vec4r normalizedAxis, real angleRadians)
Quaternion GetConjugate() const
Real3 ToRotationVector() const
void ToAxisAngle(Real3 *outAxis, real *outAngleRad) const
bool operator!=(Quaternion const &rhs) const
static Quaternion Identity()
static Quaternion RotationX(real a)
bool operator==(Quaternion const &rhs) const
static Quaternion RotationZ(real a)
static Quaternion FromAxisAngle(Vec4r axis, real angleRadians)
Quaternion operator-() const
Vec4r VToRotationVector() const
static Quaternion FromRotationVector(Vec4r rotVector)
Quaternion operator+(Quaternion const &a) const
#define MOCHI_LOG_WARNING(...)
Simd< T, 2 > Shuffle(Simd< T, 2 > a)
Simd< T, N > Cross3(Simd< T, N > a, Simd< T, N > b)
constexpr To StaticCast(From const &a)
constexpr T kDefaultNearEqualEpsilon
constexpr auto MulAdd(A a, B b, C c)
Simd< T, N > Set(Simd< T, N > a, T value)
V Broadcast(typename V::Scalar a)
Simd< T, N > Normalize(Simd< T, N > a)
Simd< T, N > VNorm(Simd< T, N > a)
bool NearEqual(TransformRT const &a, TransformRT const &b, real epsilon=kDefaultNearEqualEpsilon< real >)
Simd< T, N > Neg(Simd< T, N > a)