gtx_quaternion.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2. // OpenGL Mathematics Copyright (c) 2005 - 2011 G-Truc Creation (www.g-truc.net)
  3. ///////////////////////////////////////////////////////////////////////////////////////////////////
  4. // Created : 2011-05-25
  5. // Updated : 2011-05-31
  6. // Licence : This source is under MIT licence
  7. // File : test/gtx/quaternion.cpp
  8. ///////////////////////////////////////////////////////////////////////////////////////////////////
  9. #include <glm/glm.hpp>
  10. #include <glm/gtc/quaternion.hpp>
  11. #include <glm/gtx/quaternion.hpp>
  12. #include <glm/gtx/epsilon.hpp>
  13. int test_quat_mix()
  14. {
  15. int Error = 0;
  16. glm::quat A = glm::angleAxis(0.0f, glm::vec3(0, 0, 1));
  17. glm::quat B = glm::angleAxis(90.0f, glm::vec3(0, 0, 1));
  18. glm::quat C = glm::mix(A, B, 0.5f);
  19. glm::quat D = glm::angleAxis(45.0f, glm::vec3(0, 0, 1));
  20. Error += glm::equalEpsilon(C.x, D.x, 0.01f) ? 0 : 1;
  21. Error += glm::equalEpsilon(C.y, D.y, 0.01f) ? 0 : 1;
  22. Error += glm::equalEpsilon(C.z, D.z, 0.01f) ? 0 : 1;
  23. Error += glm::equalEpsilon(C.w, D.w, 0.01f) ? 0 : 1;
  24. return Error;
  25. }
  26. int test_quat_fastMix()
  27. {
  28. int Error = 0;
  29. glm::quat A = glm::angleAxis(0.0f, glm::vec3(0, 0, 1));
  30. glm::quat B = glm::angleAxis(90.0f, glm::vec3(0, 0, 1));
  31. glm::quat C = glm::fastMix(A, B, 0.5f);
  32. glm::quat D = glm::angleAxis(45.0f, glm::vec3(0, 0, 1));
  33. Error += glm::equalEpsilon(C.x, D.x, 0.01f) ? 0 : 1;
  34. Error += glm::equalEpsilon(C.y, D.y, 0.01f) ? 0 : 1;
  35. Error += glm::equalEpsilon(C.z, D.z, 0.01f) ? 0 : 1;
  36. Error += glm::equalEpsilon(C.w, D.w, 0.01f) ? 0 : 1;
  37. return Error;
  38. }
  39. int test_quat_shortMix()
  40. {
  41. int Error = 0;
  42. glm::quat A = glm::angleAxis(0.0f, glm::vec3(0, 0, 1));
  43. glm::quat B = glm::angleAxis(90.0f, glm::vec3(0, 0, 1));
  44. glm::quat C = glm::shortMix(A, B, 0.5f);
  45. glm::quat D = glm::angleAxis(45.0f, glm::vec3(0, 0, 1));
  46. Error += glm::equalEpsilon(C.x, D.x, 0.01f) ? 0 : 1;
  47. Error += glm::equalEpsilon(C.y, D.y, 0.01f) ? 0 : 1;
  48. Error += glm::equalEpsilon(C.z, D.z, 0.01f) ? 0 : 1;
  49. Error += glm::equalEpsilon(C.w, D.w, 0.01f) ? 0 : 1;
  50. return Error;
  51. }
  52. int test_quat_angleAxis()
  53. {
  54. int Error = 0;
  55. glm::quat A = glm::angleAxis(0.0f, glm::vec3(0, 0, 1));
  56. glm::quat B = glm::angleAxis(90.0f, glm::vec3(0, 0, 1));
  57. glm::quat C = glm::mix(A, B, 0.5f);
  58. glm::quat D = glm::angleAxis(45.0f, glm::vec3(0, 0, 1));
  59. Error += glm::equalEpsilon(C.x, D.x, 0.01f) ? 0 : 1;
  60. Error += glm::equalEpsilon(C.y, D.y, 0.01f) ? 0 : 1;
  61. Error += glm::equalEpsilon(C.z, D.z, 0.01f) ? 0 : 1;
  62. Error += glm::equalEpsilon(C.w, D.w, 0.01f) ? 0 : 1;
  63. return Error;
  64. }
  65. int test_quat_angle()
  66. {
  67. int Error = 0;
  68. {
  69. glm::quat Q = glm::angleAxis(45.0f, glm::vec3(0, 0, 1));
  70. glm::quat N = glm::normalize(Q);
  71. float L = glm::length(N);
  72. Error += glm::equalEpsilon(L, 1.0f, 0.01f) ? 0 : 1;
  73. float A = glm::angle(N);
  74. Error += glm::equalEpsilon(A, 45.0f, 0.01f) ? 0 : 1;
  75. }
  76. {
  77. glm::quat Q = glm::angleAxis(45.0f, glm::normalize(glm::vec3(0, 1, 1)));
  78. glm::quat N = glm::normalize(Q);
  79. float L = glm::length(N);
  80. Error += glm::equalEpsilon(L, 1.0f, 0.01f) ? 0 : 1;
  81. float A = glm::angle(N);
  82. Error += glm::equalEpsilon(A, 45.0f, 0.01f) ? 0 : 1;
  83. }
  84. {
  85. glm::quat Q = glm::angleAxis(45.0f, glm::normalize(glm::vec3(1, 2, 3)));
  86. glm::quat N = glm::normalize(Q);
  87. float L = glm::length(N);
  88. Error += glm::equalEpsilon(L, 1.0f, 0.01f) ? 0 : 1;
  89. float A = glm::angle(N);
  90. Error += glm::equalEpsilon(A, 45.0f, 0.01f) ? 0 : 1;
  91. }
  92. return Error;
  93. }
  94. int test_quat_normalize()
  95. {
  96. int Error = 0;
  97. {
  98. glm::quat Q = glm::angleAxis(45.0f, glm::vec3(0, 0, 1));
  99. glm::quat N = glm::normalize(Q);
  100. float L = glm::length(N);
  101. Error += glm::equalEpsilon(L, 1.0f, 0.000001f) ? 0 : 1;
  102. }
  103. {
  104. glm::quat Q = glm::angleAxis(45.0f, glm::vec3(0, 0, 2));
  105. glm::quat N = glm::normalize(Q);
  106. float L = glm::length(N);
  107. Error += glm::equalEpsilon(L, 1.0f, 0.000001f) ? 0 : 1;
  108. }
  109. {
  110. glm::quat Q = glm::angleAxis(45.0f, glm::vec3(1, 2, 3));
  111. glm::quat N = glm::normalize(Q);
  112. float L = glm::length(N);
  113. Error += glm::equalEpsilon(L, 1.0f, 0.000001f) ? 0 : 1;
  114. }
  115. return Error;
  116. }
  117. int main()
  118. {
  119. int Error = 0;
  120. Error += test_quat_angle();
  121. Error += test_quat_angleAxis();
  122. Error += test_quat_mix();
  123. Error += test_quat_fastMix();
  124. Error += test_quat_shortMix();
  125. Error += test_quat_normalize();
  126. return Error;
  127. }