xzw 1 روز پیش
والد
کامیت
aab80cbb7d
1فایلهای تغییر یافته به همراه14 افزوده شده و 9 حذف شده
  1. 14 9
      src/custom/utils/math.js

+ 14 - 9
src/custom/utils/math.js

@@ -455,16 +455,21 @@ var math = {
         
     } */
     
-    getQuaByAim: function (aim, center=new THREE.Vector3) { 
-        let forward = new THREE.Vector3(0, 1, 0)
-        let qua1 = new THREE.Quaternion().setFromUnitVectors(forward, aim.clone().sub(center).normalize())
-        /*  var _ = (new THREE.Matrix4).lookAt(center,aim,   new THREE.Vector3(0,1,0));  
-        let qua2 = (new THREE.Quaternion).setFromRotationMatrix(_);
-        let rot1 = new THREE.Euler().setFromQuaternion(qua1)
-        let rot2 = new THREE.Euler().setFromQuaternion(qua2)  //奇怪,qua2怎么都不对
-        console.log(rot1,rot2) */
-        return qua1
+    getQuaByAim: function (aim, center=new THREE.Vector3,  { rollFree, forward, up}={}){ 
+        let aimQua
+        if(rollFree){
+            forward = forward || new THREE.Vector3(0, 1, 0)
+            aimQua = new THREE.Quaternion().setFromUnitVectors(forward, aim.clone().sub(center).normalize())//一个单位向量旋转到另一个单位向量的最短路径
+        }else{
+            up = up || new THREE.Vector3(0, 0, 1)
+            let _ = (new THREE.Matrix4).lookAt(center, aim, up)  
+            aimQua = (new THREE.Quaternion).setFromRotationMatrix(_);
+        } 
+        //这二者结果不一定相同,setFromUnitVectors可能使roll不为0
+        return aimQua
     },
+       
+       
     getAimByQua: function (quaternion, center=new THREE.Vector3) {
         return new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion).add(center)
     },