diff --git a/libs/math/Matrix4.cpp b/libs/math/Matrix4.cpp index 29b636f7a8..059d860f64 100644 --- a/libs/math/Matrix4.cpp +++ b/libs/math/Matrix4.cpp @@ -238,166 +238,6 @@ Matrix4 Matrix4::getRotationForEulerXYZDegrees(const Vector3& euler) return getRotationForEulerXYZ(euler_degrees_to_radians(euler)); } -Matrix4 Matrix4::getRotationForEulerYZX(const Vector3& euler) -{ - double cx = cos(euler[0]); - double sx = sin(euler[0]); - double cy = cos(euler[1]); - double sy = sin(euler[1]); - double cz = cos(euler[2]); - double sz = sin(euler[2]); - - return Matrix4::byColumns( - cy*cz, - cx*cy*sz + sx*sy, - sx*cy*sz - cx*sy, - 0, - -sz, - cx*cz, - sx*cz, - 0, - sy*cz, - cx*sy*sz - sx*cy, - sx*sy*sz + cx*cy, - 0, - 0, - 0, - 0, - 1 - ); -} - -Matrix4 Matrix4::getRotationForEulerXZY(const Vector3& euler) -{ - double cx = cos(euler[0]); - double sx = sin(euler[0]); - double cy = cos(euler[1]); - double sy = sin(euler[1]); - double cz = cos(euler[2]); - double sz = sin(euler[2]); - - return Matrix4::byColumns( - cy*cz, - sz, - -sy*cz, - 0, - sx*sy - cx*cy*sz, - cx*cz, - cx*sy*sz + sx*cy, - 0, - sx*cy*sz + cx*sy, - -sx*cz, - cx*cy - sx*sy*sz, - 0, - 0, - 0, - 0, - 1 - ); -} - -Matrix4 Matrix4::getRotationForEulerYXZ(const Vector3& euler) -{ - double cx = cos(euler[0]); - double sx = sin(euler[0]); - double cy = cos(euler[1]); - double sy = sin(euler[1]); - double cz = cos(euler[2]); - double sz = sin(euler[2]); - - return Matrix4::byColumns( - cy*cz - sx*sy*sz, - cy*sz + sx*sy*cz, - -cx*sy, - 0, - -cx*sz, - cx*cz, - sx, - 0, - sy*cz + sx*cy*sz, - sy*sz - sx*cy*cz, - cx*cy, - 0, - 0, - 0, - 0, - 1 - ); -} - -Matrix4 Matrix4::getRotationForEulerYXZDegrees(const Vector3& euler) -{ - return getRotationForEulerYXZ(euler_degrees_to_radians(euler)); -} - -Matrix4 Matrix4::getRotationForEulerZXY(const Vector3& euler) -{ - double cx = cos(euler[0]); - double sx = sin(euler[0]); - double cy = cos(euler[1]); - double sy = sin(euler[1]); - double cz = cos(euler[2]); - double sz = sin(euler[2]); - - return Matrix4::byColumns( - cy*cz + sx*sy*sz, - cx*sz, - sx*cy*sz - sy*cz, - 0, - sx*sy*cz - cy*sz, - cx*cz, - sy*sz + sx*cy*cz, - 0, - cx*sy, - -sx, - cx*cy, - 0, - 0, - 0, - 0, - 1 - ); -} - -Matrix4 Matrix4::getRotationForEulerZXYDegrees(const Vector3& euler) -{ - return getRotationForEulerZXY(euler_degrees_to_radians(euler)); -} - -Matrix4 Matrix4::getRotationForEulerZYX(const Vector3& euler) -{ - double cx = cos(euler[0]); - double sx = sin(euler[0]); - double cy = cos(euler[1]); - double sy = sin(euler[1]); - double cz = cos(euler[2]); - double sz = sin(euler[2]); - - return Matrix4::byColumns( - cy*cz, - cx*sz + sx*sy*cz, - sx*sz - cx*sy*cz, - 0, - -cy*sz, - cx*cz - sx*sy*sz, - sx*cz + cx*sy*sz, - 0, - sy, - -sx*cy, - cx*cy, - 0, - 0, - 0, - 0, - 1 - ); -} - -Matrix4 Matrix4::getRotationForEulerZYXDegrees(const Vector3& euler) -{ - return getRotationForEulerZYX(euler_degrees_to_radians(euler)); -} - // Get a scale matrix Matrix4 Matrix4::getScale(const Vector3& scale) { diff --git a/libs/math/Matrix4.h b/libs/math/Matrix4.h index 885a8e314c..f4329f77f8 100644 --- a/libs/math/Matrix4.h +++ b/libs/math/Matrix4.h @@ -154,46 +154,6 @@ class Matrix4 */ static Matrix4 getRotationForEulerXYZDegrees(const Vector3& euler); - /** - * Constructs a pure-rotation matrix from a set of euler angles (radians) in the order (y, z, x). - */ - static Matrix4 getRotationForEulerYZX(const Vector3& euler); - - /** - * Constructs a pure-rotation matrix from a set of euler angles (radians) in the order (x, z, y). - */ - static Matrix4 getRotationForEulerXZY(const Vector3& euler); - - /** - * Constructs a pure-rotation matrix from a set of euler angles (radians) in the order (y, x, z). - */ - static Matrix4 getRotationForEulerYXZ(const Vector3& euler); - - /** - * Constructs a pure-rotation matrix from a set of euler angles (degrees) in the order (y, x, z). - */ - static Matrix4 getRotationForEulerYXZDegrees(const Vector3& euler); - - /** - * Constructs a pure-rotation matrix from a set of euler angles (radians) in the order (z, x, y). - */ - static Matrix4 getRotationForEulerZXY(const Vector3& euler); - - /** - * Constructs a pure-rotation matrix from a set of euler angles (degrees) in the order (z, x, y). - */ - static Matrix4 getRotationForEulerZXYDegrees(const Vector3& euler); - - /** - * Constructs a pure-rotation matrix from a set of euler angles (radians) in the order (z, y, x). - */ - static Matrix4 getRotationForEulerZYX(const Vector3& euler); - - /** - * Constructs a pure-rotation matrix from a set of euler angles (degrees) in the order (z, y, x). - */ - static Matrix4 getRotationForEulerZYXDegrees(const Vector3& euler); - /** * \brief * Get a matrix representing the given scale in 3D space. @@ -535,25 +495,6 @@ class Matrix4 */ void rotateByEulerXYZDegrees(const Vector3& euler); - /** - * Concatenates this with the pivoted rotation transform produced - * by euler angles (degrees) in the order (x, y, z). - * The concatenated rotation occurs before self. - */ - void rotateByEulerXYZDegrees(const Vector3& euler, const Vector3& pivot); - - /** - * Returns this matrix concatenated with the rotation transform produced by the given - * euler angles (degrees) in the order (y, x, z). The concatenated rotation occurs before this matrix. - */ - Matrix4 getRotatedByEulerYXZDegrees(const Vector3& euler) const; - - /** - * Returns this matrix concatenated with the rotation transform produced by the given - * euler angles (degrees) in the order (z, x, y). The concatenated rotation occurs before this matrix. - */ - Matrix4 getRotatedByEulerZXYDegrees(const Vector3& euler) const; - /** * Calculates and returns a set of euler angles in radians that produce * the rotation component of this matrix when applied in the order (x, y, z). @@ -568,48 +509,6 @@ class Matrix4 */ Vector3 getEulerAnglesXYZDegrees() const; - /** - * Calculates and returns a set of euler angles in radians that produce - * the rotation component of this matrix when applied in the order (y, x, z). - * This matrix must be affine and orthonormal (unscaled) to produce a meaningful result. - */ - Vector3 getEulerAnglesYXZ() const; - - /** - * Calculates and returns a set of euler angles in degrees that produce - * the rotation component of this matrix when applied in the order (y, x, z). - * This matrix must be affine and orthonormal (unscaled) to produce a meaningful result. - */ - Vector3 getEulerAnglesYXZDegrees() const; - - /** - * Calculates and returns a set of euler angles in radians that produce - * the rotation component of this matrix when applied in the order (z, x, y). - * This matrix must be affine and orthonormal (unscaled) to produce a meaningful result. - */ - Vector3 getEulerAnglesZXY() const; - - /** - * Calculates and returns a set of euler angles in degrees that produce - * the rotation component of this matrix when applied in the order (z, x, y). - * This matrix must be affine and orthonormal (unscaled) to produce a meaningful result. - */ - Vector3 getEulerAnglesZXYDegrees() const; - - /** - * Calculates and returns a set of euler angles in radians that produce - * the rotation component of this matrix when applied in the order (z, y, x). - * This matrix must be affine and orthonormal (unscaled) to produce a meaningful result. - */ - Vector3 getEulerAnglesZYX() const; - - /** - * Calculates and returns a set of euler angles in degrees that produce - * the rotation component of this matrix when applied in the order (z, y, x). - * This matrix must be affine and orthonormal (unscaled) to produce a meaningful result. - */ - Vector3 getEulerAnglesZYXDegrees() const; - /** * Calculates and returns the (x, y, z) scale values that produce the scale component of this matrix. * This matrix must be affine and orthogonal to produce a meaningful result. @@ -949,23 +848,6 @@ inline void Matrix4::rotateByEulerXYZDegrees(const Vector3& euler) multiplyBy(getRotationForEulerXYZDegrees(euler)); } -inline void Matrix4::rotateByEulerXYZDegrees(const Vector3& euler, const Vector3& pivot) -{ - translateBy(pivot); - rotateByEulerXYZDegrees(euler); - translateBy(-pivot); -} - -inline Matrix4 Matrix4::getRotatedByEulerYXZDegrees(const Vector3& euler) const -{ - return getMultipliedBy(getRotationForEulerYXZDegrees(euler)); -} - -inline Matrix4 Matrix4::getRotatedByEulerZXYDegrees(const Vector3& euler) const -{ - return getMultipliedBy(getRotationForEulerZXYDegrees(euler)); -} - inline Vector3 Matrix4::getEulerAnglesXYZ() const { double a = asin(-xz()); @@ -995,93 +877,6 @@ inline Vector3 Matrix4::getEulerAnglesXYZDegrees() const return Vector3(radians_to_degrees(eulerRad.x()), radians_to_degrees(eulerRad.y()), radians_to_degrees(eulerRad.z())); } -inline Vector3 Matrix4::getEulerAnglesYXZ() const -{ - double a = asin(yz()); - double ca = cos(a); - - if (fabs(ca) > 0.005f) // Gimbal lock? - { - return Vector3( - a, - atan2(-xz() / ca, zz() / ca), - atan2(-yx() / ca, yy() / ca) - ); - } - else // Gimbal lock has occurred - { - return Vector3( - a, - atan2(zx(), xx()), - 0 - ); - } -} - -inline Vector3 Matrix4::getEulerAnglesYXZDegrees() const -{ - Vector3 eulerRad = getEulerAnglesYXZ(); - return Vector3(radians_to_degrees(eulerRad.x()), radians_to_degrees(eulerRad.y()), radians_to_degrees(eulerRad.z())); -} - -inline Vector3 Matrix4::getEulerAnglesZXY() const -{ - double a = asin(-zy()); - double ca = cos(a); - - if (fabs(ca) > 0.005f) // Gimbal lock? - { - return Vector3( - a, - atan2(zx() / ca, zz() / ca), - atan2(xy() / ca, yy()/ ca) - ); - } - else // Gimbal lock has occurred - { - return Vector3( - a, - 0, - atan2(-yx(), xx()) - ); - } -} - -inline Vector3 Matrix4::getEulerAnglesZXYDegrees() const -{ - Vector3 eulerRad = getEulerAnglesZXY(); - return Vector3(radians_to_degrees(eulerRad.x()), radians_to_degrees(eulerRad.y()), radians_to_degrees(eulerRad.z())); -} - -inline Vector3 Matrix4::getEulerAnglesZYX() const -{ - double a = asin(zx()); - double ca = cos(a); - - if (fabs(ca) > 0.005f) // Gimbal lock? - { - return Vector3( - atan2(-zy() / ca, zz()/ ca), - a, - atan2(-yx() / ca, xx() / ca) - ); - } - else // Gimbal lock has occurred - { - return Vector3( - 0, - a, - atan2(xy(), yy()) - ); - } -} - -inline Vector3 Matrix4::getEulerAnglesZYXDegrees() const -{ - Vector3 eulerRad = getEulerAnglesZYX(); - return Vector3(radians_to_degrees(eulerRad.x()), radians_to_degrees(eulerRad.y()), radians_to_degrees(eulerRad.z())); -} - inline Vector3 Matrix4::getScale() const { return Vector3( diff --git a/test/math/Matrix4.cpp b/test/math/Matrix4.cpp index 2e9fd8408d..6cdd12e318 100644 --- a/test/math/Matrix4.cpp +++ b/test/math/Matrix4.cpp @@ -233,138 +233,6 @@ TEST(MathTest, MatrixRotationForEulerXYZDegrees) EXPECT_DOUBLE_EQ(testEuler.z(), euler.z()) << "getEulerAnglesXYZDegrees fault at z()"; } -TEST(MathTest, MatrixRotationForEulerYXZDegrees) -{ - // Test euler angle constructors - Vector3 euler(30, -55, 75); - - // Convert degrees to radians - double pi = 3.141592653589793238462643383f; - double cx = cos(euler[0] * c_pi / 180.0f); - double sx = sin(euler[0] * c_pi / 180.0f); - double cy = cos(euler[1] * c_pi / 180.0f); - double sy = sin(euler[1] * c_pi / 180.0f); - double cz = cos(euler[2] * c_pi / 180.0f); - double sz = sin(euler[2] * c_pi / 180.0f); - - Matrix4 eulerYXZ = Matrix4::getRotationForEulerYXZDegrees(euler); - - EXPECT_DOUBLE_EQ(eulerYXZ.xx(), cy * cz - sx * sy * sz) << "Matrix getRotationForEulerYXZDegrees failed"; - EXPECT_DOUBLE_EQ(eulerYXZ.xy(), cy * sz + sx * sy * cz) << "Matrix getRotationForEulerYXZDegrees failed"; - EXPECT_DOUBLE_EQ(eulerYXZ.xz(), -cx * sy) << "Matrix getRotationForEulerYXZDegrees failed"; - EXPECT_DOUBLE_EQ(eulerYXZ.xw(), 0) << "Matrix getRotationForEulerYXZDegrees failed"; - - EXPECT_DOUBLE_EQ(eulerYXZ.yx(), -cx * sz) << "Matrix getRotationForEulerYXZDegrees failed"; - EXPECT_DOUBLE_EQ(eulerYXZ.yy(), cx * cz) << "Matrix getRotationForEulerYXZDegrees failed"; - EXPECT_DOUBLE_EQ(eulerYXZ.yz(), sx) << "Matrix getRotationForEulerYXZDegrees failed"; - EXPECT_DOUBLE_EQ(eulerYXZ.yw(), 0) << "Matrix getRotationForEulerYXZDegrees failed"; - - EXPECT_DOUBLE_EQ(eulerYXZ.zx(), sy * cz + sx * cy * sz) << "Matrix getRotationForEulerYXZDegrees failed"; - EXPECT_DOUBLE_EQ(eulerYXZ.zy(), sy * sz - sx * cy * cz) << "Matrix getRotationForEulerYXZDegrees failed"; - EXPECT_DOUBLE_EQ(eulerYXZ.zz(), cx * cy) << "Matrix getRotationForEulerYXZDegrees failed"; - EXPECT_DOUBLE_EQ(eulerYXZ.zw(), 0) << "Matrix getRotationForEulerYXZDegrees failed"; - - EXPECT_DOUBLE_EQ(eulerYXZ.tx(), 0) << "Matrix getRotationForEulerYXZDegrees failed"; - EXPECT_DOUBLE_EQ(eulerYXZ.ty(), 0) << "Matrix getRotationForEulerYXZDegrees failed"; - EXPECT_DOUBLE_EQ(eulerYXZ.tz(), 0) << "Matrix getRotationForEulerYXZDegrees failed"; - EXPECT_DOUBLE_EQ(eulerYXZ.tw(), 1) << "Matrix getRotationForEulerYXZDegrees failed"; - - // Test Euler Angle retrieval (YXZ) - Vector3 testEuler = eulerYXZ.getEulerAnglesYXZDegrees(); - - EXPECT_DOUBLE_EQ(testEuler.x(), euler.x()) << "getEulerAnglesYXZDegrees fault at x()"; - EXPECT_DOUBLE_EQ(testEuler.y(), euler.y()) << "getEulerAnglesYXZDegrees fault at y()"; - EXPECT_DOUBLE_EQ(testEuler.z(), euler.z()) << "getEulerAnglesYXZDegrees fault at z()"; -} - -TEST(MathTest, MatrixRotationForEulerZXYDegrees) -{ - // Test euler angle constructors - Vector3 euler(30, -55, 75); - - // Convert degrees to radians - double pi = 3.141592653589793238462643383f; - double cx = cos(euler[0] * c_pi / 180.0f); - double sx = sin(euler[0] * c_pi / 180.0f); - double cy = cos(euler[1] * c_pi / 180.0f); - double sy = sin(euler[1] * c_pi / 180.0f); - double cz = cos(euler[2] * c_pi / 180.0f); - double sz = sin(euler[2] * c_pi / 180.0f); - - Matrix4 eulerZXY = Matrix4::getRotationForEulerZXYDegrees(euler); - - EXPECT_DOUBLE_EQ(eulerZXY.xx(), cy * cz + sx * sy * sz) << "Matrix getRotationForEulerZXYDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZXY.xy(), cx * sz) << "Matrix getRotationForEulerZXYDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZXY.xz(), sx * cy * sz - sy * cz) << "Matrix getRotationForEulerZXYDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZXY.xw(), 0) << "Matrix getRotationForEulerZXYDegrees failed"; - - EXPECT_DOUBLE_EQ(eulerZXY.yx(), sx * sy * cz - cy * sz) << "Matrix getRotationForEulerZXYDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZXY.yy(), cx * cz) << "Matrix getRotationForEulerZXYDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZXY.yz(), sx * cy * cz + sy * sz) << "Matrix getRotationForEulerZXYDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZXY.yw(), 0) << "Matrix getRotationForEulerZXYDegrees failed"; - - EXPECT_DOUBLE_EQ(eulerZXY.zx(), cx * sy) << "Matrix getRotationForEulerZXYDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZXY.zy(), -sx) << "Matrix getRotationForEulerZXYDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZXY.zz(), cx * cy) << "Matrix getRotationForEulerZXYDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZXY.zw(), 0) << "Matrix getRotationForEulerZXYDegrees failed"; - - EXPECT_DOUBLE_EQ(eulerZXY.tx(), 0) << "Matrix getRotationForEulerZXYDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZXY.ty(), 0) << "Matrix getRotationForEulerZXYDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZXY.tz(), 0) << "Matrix getRotationForEulerZXYDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZXY.tw(), 1) << "Matrix getRotationForEulerZXYDegrees failed"; - - // Test Euler Angle retrieval (ZXY) - Vector3 testEuler = eulerZXY.getEulerAnglesZXYDegrees(); - - EXPECT_DOUBLE_EQ(testEuler.x(), euler.x()) << "getEulerAnglesZXYDegrees fault at x()"; - EXPECT_DOUBLE_EQ(testEuler.y(), euler.y()) << "getEulerAnglesZXYDegrees fault at y()"; - EXPECT_DOUBLE_EQ(testEuler.z(), euler.z()) << "getEulerAnglesZXYDegrees fault at z()"; -} - -TEST(MathTest, MatrixRotationForEulerZYXDegrees) -{ - // Test euler angle constructors - Vector3 euler(30, -55, 75); - - // Convert degrees to radians - double pi = 3.141592653589793238462643383f; - double cx = cos(euler[0] * c_pi / 180.0f); - double sx = sin(euler[0] * c_pi / 180.0f); - double cy = cos(euler[1] * c_pi / 180.0f); - double sy = sin(euler[1] * c_pi / 180.0f); - double cz = cos(euler[2] * c_pi / 180.0f); - double sz = sin(euler[2] * c_pi / 180.0f); - - Matrix4 eulerZYX = Matrix4::getRotationForEulerZYXDegrees(euler); - - EXPECT_DOUBLE_EQ(eulerZYX.xx(), cy * cz) << "Matrix getRotationForEulerZYXDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZYX.xy(), cx * sz + sx * sy * cz) << "Matrix getRotationForEulerZYXDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZYX.xz(), sx * sz - cx * sy * cz) << "Matrix getRotationForEulerZYXDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZYX.xw(), 0) << "Matrix getRotationForEulerZYXDegrees failed"; - - EXPECT_DOUBLE_EQ(eulerZYX.yx(), -cy * sz) << "Matrix getRotationForEulerZYXDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZYX.yy(), cx * cz - sx * sy * sz) << "Matrix getRotationForEulerZYXDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZYX.yz(), sx * cz + cx * sy * sz) << "Matrix getRotationForEulerZYXDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZYX.yw(), 0) << "Matrix getRotationForEulerZYXDegrees failed"; - - EXPECT_DOUBLE_EQ(eulerZYX.zx(), sy) << "Matrix getRotationForEulerZYXDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZYX.zy(), -sx * cy) << "Matrix getRotationForEulerZYXDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZYX.zz(), cx * cy) << "Matrix getRotationForEulerZYXDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZYX.zw(), 0) << "Matrix getRotationForEulerZYXDegrees failed"; - - EXPECT_DOUBLE_EQ(eulerZYX.tx(), 0) << "Matrix getRotationForEulerZYXDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZYX.ty(), 0) << "Matrix getRotationForEulerZYXDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZYX.tz(), 0) << "Matrix getRotationForEulerZYXDegrees failed"; - EXPECT_DOUBLE_EQ(eulerZYX.tw(), 1) << "Matrix getRotationForEulerZYXDegrees failed"; - - // Test Euler Angle retrieval (ZYX) - Vector3 testEuler = eulerZYX.getEulerAnglesZYXDegrees(); - - EXPECT_DOUBLE_EQ(testEuler.x(), euler.x()) << "getEulerAnglesZYXDegrees fault at x()"; - EXPECT_DOUBLE_EQ(testEuler.y(), euler.y()) << "getEulerAnglesZYXDegrees fault at y()"; - EXPECT_DOUBLE_EQ(testEuler.z(), euler.z()) << "getEulerAnglesZYXDegrees fault at z()"; -} - TEST(MathTest, MatrixMultiplication) { auto a = Matrix4::byColumns(3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59);