|
|
@@ -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)
|
|
|
},
|