|
@@ -258,19 +258,41 @@ THREE.Quaternion.prototype = {
|
|
|
|
|
|
setFromUnitVectors: function () {
|
|
|
|
|
|
- // http://lolengine.net/blog/2013/09/18/beautiful-maths-quaternion-from-vectors
|
|
|
+ // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final
|
|
|
|
|
|
// assumes direction vectors vFrom and vTo are normalized
|
|
|
|
|
|
- var v1;
|
|
|
+ var v1, r;
|
|
|
+
|
|
|
+ var EPS = 0.000001;
|
|
|
|
|
|
return function( vFrom, vTo ) {
|
|
|
|
|
|
if ( v1 === undefined ) v1 = new THREE.Vector3();
|
|
|
|
|
|
- v1.crossVectors( vFrom, vTo );
|
|
|
+ r = vFrom.dot( vTo ) + 1;
|
|
|
+
|
|
|
+ if ( r < EPS ) {
|
|
|
+
|
|
|
+ r = 0;
|
|
|
+
|
|
|
+ if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {
|
|
|
+
|
|
|
+ v1.set( - vFrom.y, vFrom.x, 0 );
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ v1.set( 0, - vFrom.z, vFrom.y );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ v1.crossVectors( vFrom, vTo );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
- this.set( v1.x, v1.y, v1.z, vFrom.dot( vTo ) + 1 ).normalize();
|
|
|
+ this.set( v1.x, v1.y, v1.z, r ).normalize();
|
|
|
|
|
|
this._updateEuler();
|
|
|
|