MathUtils.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /**
  2. * @author WestLangley / http://github.com/WestLangley
  3. * @author thezwap / http://github.com/thezwap
  4. */
  5. var MathUtils = {
  6. /**
  7. * @param {Quaternion} q
  8. * @param {number} a
  9. * @param {number} b
  10. * @param {number} c
  11. * @param {string} order
  12. */
  13. setQuaternionFromProperEuler: function (q, a, b, c, order) {
  14. // Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles
  15. // rotations are applied to the axes in the order specified by 'order'
  16. // rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'
  17. // angles are in radians
  18. var cos = Math.cos;
  19. var sin = Math.sin;
  20. var c2 = cos(b / 2);
  21. var s2 = sin(b / 2);
  22. var c13 = cos((a + c) / 2);
  23. var s13 = sin((a + c) / 2);
  24. var c1_3 = cos((a - c) / 2);
  25. var s1_3 = sin((a - c) / 2);
  26. var c3_1 = cos((c - a) / 2);
  27. var s3_1 = sin((c - a) / 2);
  28. if (order === 'XYX') {
  29. q.set(c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13);
  30. } else if (order === 'YZY') {
  31. q.set(s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13);
  32. } else if (order === 'ZXZ') {
  33. q.set(s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13);
  34. } else if (order === 'XZX') {
  35. q.set(c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13);
  36. } else if (order === 'YXY') {
  37. q.set(s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13);
  38. } else if (order === 'ZYZ') {
  39. q.set(s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13);
  40. } else {
  41. console.warn('THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order.');
  42. }
  43. }
  44. };
  45. export {MathUtils};