Quaternion.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <NumericalMethods/DoublePrecisionMath/Quaternion.h>
  9. #include <AzCore/Math/Quaternion.h>
  10. #include <AzCore/Casting/numeric_cast.h>
  11. namespace NumericalMethods::DoublePrecisionMath
  12. {
  13. Quaternion::Quaternion()
  14. : m_x(0.0)
  15. , m_y(0.0)
  16. , m_z(0.0)
  17. , m_w(1.0)
  18. {
  19. }
  20. Quaternion::Quaternion(double x, double y, double z, double w)
  21. : m_x(x)
  22. , m_y(y)
  23. , m_z(z)
  24. , m_w(w)
  25. {
  26. }
  27. Quaternion::Quaternion(const AZ::Quaternion& q)
  28. : m_x(q.GetX())
  29. , m_y(q.GetY())
  30. , m_z(q.GetZ())
  31. , m_w(q.GetW())
  32. {
  33. }
  34. AZ::Quaternion Quaternion::ToSingle() const
  35. {
  36. return AZ::Quaternion(
  37. aznumeric_cast<float>(m_x), aznumeric_cast<float>(m_y), aznumeric_cast<float>(m_z), aznumeric_cast<float>(m_w));
  38. }
  39. double Quaternion::GetX() const
  40. {
  41. return m_x;
  42. }
  43. double Quaternion::GetY() const
  44. {
  45. return m_y;
  46. }
  47. double Quaternion::GetZ() const
  48. {
  49. return m_z;
  50. }
  51. double Quaternion::GetW() const
  52. {
  53. return m_w;
  54. }
  55. Quaternion Quaternion::operator*(const Quaternion& rhs) const
  56. {
  57. return Quaternion(
  58. +m_x * rhs.m_w + m_y * rhs.m_z - m_z * rhs.m_y + m_w * rhs.m_x,
  59. -m_x * rhs.m_z + m_y * rhs.m_w + m_z * rhs.m_x + m_w * rhs.m_y,
  60. +m_x * rhs.m_y - m_y * rhs.m_x + m_z * rhs.m_w + m_w * rhs.m_z,
  61. -m_x * rhs.m_x - m_y * rhs.m_y - m_z * rhs.m_z + m_w * rhs.m_w);
  62. }
  63. Quaternion Quaternion::operator-() const
  64. {
  65. return Quaternion(-m_x, -m_y, -m_z, -m_w);
  66. }
  67. Quaternion Quaternion::GetNormalized() const
  68. {
  69. double magSq = m_x * m_x + m_y * m_y + m_z * m_z + m_w * m_w;
  70. if (magSq < 1e-20)
  71. {
  72. return Quaternion();
  73. }
  74. else
  75. {
  76. double mag = std::sqrt(magSq);
  77. return Quaternion(m_x / mag, m_y / mag, m_z / mag, m_w / mag);
  78. }
  79. }
  80. Quaternion Quaternion::GetConjugate() const
  81. {
  82. return Quaternion(-m_x, -m_y, -m_z, m_w);
  83. }
  84. } // namespace NumericalMethods::DoublePrecisionMath