浏览代码

Added MathUtils class for quaternion rotations by Proper Euler angles.

gbath 7 年之前
父节点
当前提交
7bf7a6043f
共有 1 个文件被更改,包括 87 次插入0 次删除
  1. 87 0
      examples/js/utils/MathUtils.js

+ 87 - 0
examples/js/utils/MathUtils.js

@@ -0,0 +1,87 @@
+/**
+ * @author WestLangley
+ * @author thezwap 
+ */
+
+THREE.MathUtils = {
+    setQuaternionFromProperEuler: function (q, a, b, c, order) {
+
+        var cos = Math.cos;
+        var sin = Math.sin;
+
+        var c1 = cos(a / 2);
+        var c2 = cos(b / 2);
+        var c3 = cos(c / 2);
+
+        var s1 = sin(a / 2);
+        var s2 = sin(b / 2);
+        var s3 = sin(c / 2);
+
+        var c13 = cos((a + c) / 2);
+        var s13 = sin((a + c) / 2);
+
+        var c1_3 = cos((a - c) / 2);
+        var s1_3 = sin((a - c) / 2);
+
+        var c3_1 = cos((c - a) / 2);
+        var s3_1 = sin((c - a) / 2);
+
+        var qx = 0;
+        var qy = 0;
+        var qz = 0;
+        var qw = 0;
+
+        if (order === 'XYX') {
+
+            qx = c2 * s13;
+            qy = s2 * c1_3;
+            qz = s2 * s1_3;
+            qw = c2 * c13;
+
+        } else if (order === 'YZY') {
+
+            qx = s2 * s1_3;
+            qy = c2 * s13;
+            qz = s2 * c1_3;
+            qw = c2 * c13;
+
+        } else if (order === 'ZXZ') {
+
+            qx = s2 * c1_3;
+            qy = s2 * s1_3;
+            qz = c2 * s13;
+            qw = c2 * c13;
+
+        } else if (order === 'XZX') {
+
+            qx = c2 * s13;
+            qy = s2 * s3_1;
+            qz = s2 * c3_1;
+            qw = c2 * c13;
+
+        } else if (order === 'YXY') {
+
+            qx = s2 * c3_1;
+            qy = c2 * s13;
+            qz = s2 * s3_1;
+            qw = c2 * c13;
+
+        } else if (order === 'ZYZ') {
+
+            qx = s2 * s3_1;
+            qy = s2 * c3_1;
+            qz = c2 * s13;
+            qw = c2 * c13;
+
+        }
+
+        else {
+
+            console.warn('THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order.');
+
+        }
+
+        q.set( qx, qy, qz, qw);
+
+    }
+}