// David Eberly, Geometric Tools, Redmond WA 98052 // Copyright (c) 1998-2020 // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt // https://www.geometrictools.com/License/Boost/LICENSE_1_0.txt // Version: 4.0.2019.08.13 #pragma once #include // The Euler angle data structure for representing rotations. See the // document // https://www.geometrictools.com/Documentation/EulerAngles.pdf namespace WwiseGTE { // Factorization into Euler angles is not necessarily unique. Let the // integer indices for the axes be (N0,N1,N2), which must be in the set // {(0,1,2),(0,2,1),(1,0,2),(1,2,0),(2,0,1),(2,1,0), // (0,1,0),(0,2,0),(1,0,1),(1,2,1),(2,0,2),(2,1,2)} // Let the corresponding angles be (angleN0,angleN1,angleN2). If the // result is ER_NOT_UNIQUE_SUM, then the multiple solutions occur because // angleN2+angleN0 is constant. If the result is ER_NOT_UNIQUE_DIF, then // the multiple solutions occur because angleN2-angleN0 is constant. In // either type of nonuniqueness, the function returns angleN0=0. enum EulerResult { // The solution is invalid (incorrect axis indices). ER_INVALID, // The solution is unique. ER_UNIQUE, // The solution is not unique. A sum of angles is constant. ER_NOT_UNIQUE_SUM, // The solution is not unique. A difference of angles is constant. ER_NOT_UNIQUE_DIF }; template class EulerAngles { public: EulerAngles() : axis{0, 0, 0}, angle{ (Real)0, (Real)0, (Real)0 }, result(ER_INVALID) { } EulerAngles(int i0, int i1, int i2, Real a0, Real a1, Real a2) : axis{ i0, i1, i2 }, angle{ a0, a1, a2 }, result(ER_UNIQUE) { } std::array axis; std::array angle; // This member is set during conversions from rotation matrices, // quaternions, or axis-angles. EulerResult result; }; }