From 9768d3a728ebd90e66e9e3b8fd7f99cd577767ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Sat, 25 Sep 2021 19:13:32 -0700 Subject: [PATCH] Added quaternion to axis conversion functions. --- include/bx/inline/math.inl | 51 ++++++++++++++++++++++++++++++++++++++ include/bx/math.h | 9 +++++++ 2 files changed, 60 insertions(+) diff --git a/include/bx/inline/math.inl b/include/bx/inline/math.inl index cbb77a2..6699a73 100644 --- a/include/bx/inline/math.inl +++ b/include/bx/inline/math.inl @@ -909,6 +909,57 @@ namespace bx }; } + inline BX_CONST_FUNC Vec3 toXAxis(const Quaternion _a) + { + const float xx = _a.x; + const float yy = _a.y; + const float zz = _a.z; + const float ww = _a.w; + const float ysq = square(yy); + const float zsq = square(zz); + + return + { + 1.0f - 2.0f * ysq - 2.0f * zsq, + 2.0f * xx * yy + 2.0f * zz * ww, + 2.0f * xx * zz - 2.0f * yy * ww, + }; + } + + inline BX_CONST_FUNC Vec3 toYAxis(const Quaternion _a) + { + const float xx = _a.x; + const float yy = _a.y; + const float zz = _a.z; + const float ww = _a.w; + const float xsq = square(xx); + const float zsq = square(zz); + + return + { + 2.0f * xx * yy - 2.0f * zz * ww, + 1.0f - 2.0f * xsq - 2.0f * zsq, + 2.0f * yy * zz + 2.0f * xx * ww, + }; + } + + inline BX_CONST_FUNC Vec3 toZAxis(const Quaternion _a) + { + const float xx = _a.x; + const float yy = _a.y; + const float zz = _a.z; + const float ww = _a.w; + const float xsq = square(xx); + const float ysq = square(yy); + + return + { + 2.0f * xx * zz + 2.0f * yy * ww, + 2.0f * yy * zz - 2.0f * xx * ww, + 1.0f - 2.0f * xsq - 2.0f * ysq, + }; + } + inline BX_CONST_FUNC Quaternion rotateAxis(const Vec3 _axis, float _angle) { const float ha = _angle * 0.5f; diff --git a/include/bx/math.h b/include/bx/math.h index f5f6248..ee4aa29 100644 --- a/include/bx/math.h +++ b/include/bx/math.h @@ -492,6 +492,15 @@ namespace bx /// BX_CONST_FUNC Vec3 toEuler(const Quaternion _a); + /// + BX_CONST_FUNC Vec3 toXAxis(const Quaternion _a); + + /// + BX_CONST_FUNC Vec3 toYAxis(const Quaternion _a); + + /// + BX_CONST_FUNC Vec3 toZAxis(const Quaternion _a); + /// BX_CONST_FUNC Quaternion rotateAxis(const Vec3 _axis, float _angle);