MathUtils.js 1.6 KB

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