|
@@ -1,23 +1,23 @@
|
|
|
import { MathUtils } from './MathUtils.js';
|
|
|
|
|
|
-function Quaternion( x = 0, y = 0, z = 0, w = 1 ) {
|
|
|
+class Quaternion {
|
|
|
|
|
|
- this._x = x;
|
|
|
- this._y = y;
|
|
|
- this._z = z;
|
|
|
- this._w = w;
|
|
|
+ constructor( x = 0, y = 0, z = 0, w = 1 ) {
|
|
|
|
|
|
-}
|
|
|
+ this._x = x;
|
|
|
+ this._y = y;
|
|
|
+ this._z = z;
|
|
|
+ this._w = w;
|
|
|
|
|
|
-Object.assign( Quaternion, {
|
|
|
+ }
|
|
|
|
|
|
- slerp: function ( qa, qb, qm, t ) {
|
|
|
+ static slerp( qa, qb, qm, t ) {
|
|
|
|
|
|
return qm.copy( qa ).slerp( qb, t );
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- slerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {
|
|
|
+ static slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {
|
|
|
|
|
|
// fuzz-free, array-based Quaternion SLERP operation
|
|
|
|
|
@@ -75,9 +75,9 @@ Object.assign( Quaternion, {
|
|
|
dst[ dstOffset + 2 ] = z0;
|
|
|
dst[ dstOffset + 3 ] = w0;
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- multiplyQuaternionsFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {
|
|
|
+ static multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {
|
|
|
|
|
|
const x0 = src0[ srcOffset0 ];
|
|
|
const y0 = src0[ srcOffset0 + 1 ];
|
|
@@ -98,85 +98,65 @@ Object.assign( Quaternion, {
|
|
|
|
|
|
}
|
|
|
|
|
|
-} );
|
|
|
-
|
|
|
-Object.defineProperties( Quaternion.prototype, {
|
|
|
-
|
|
|
- x: {
|
|
|
-
|
|
|
- get: function () {
|
|
|
-
|
|
|
- return this._x;
|
|
|
-
|
|
|
- },
|
|
|
-
|
|
|
- set: function ( value ) {
|
|
|
-
|
|
|
- this._x = value;
|
|
|
- this._onChangeCallback();
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- },
|
|
|
-
|
|
|
- y: {
|
|
|
+ get x() {
|
|
|
|
|
|
- get: function () {
|
|
|
+ return this._x;
|
|
|
|
|
|
- return this._y;
|
|
|
+ }
|
|
|
|
|
|
- },
|
|
|
+ set x( value ) {
|
|
|
|
|
|
- set: function ( value ) {
|
|
|
+ this._x = value;
|
|
|
+ this._onChangeCallback();
|
|
|
|
|
|
- this._y = value;
|
|
|
- this._onChangeCallback();
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
+ get y() {
|
|
|
|
|
|
- },
|
|
|
+ return this._y;
|
|
|
|
|
|
- z: {
|
|
|
+ }
|
|
|
|
|
|
- get: function () {
|
|
|
+ set y( value ) {
|
|
|
|
|
|
- return this._z;
|
|
|
+ this._y = value;
|
|
|
+ this._onChangeCallback();
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- set: function ( value ) {
|
|
|
+ get z() {
|
|
|
|
|
|
- this._z = value;
|
|
|
- this._onChangeCallback();
|
|
|
+ return this._z;
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- },
|
|
|
+ set z( value ) {
|
|
|
|
|
|
- w: {
|
|
|
+ this._z = value;
|
|
|
+ this._onChangeCallback();
|
|
|
|
|
|
- get: function () {
|
|
|
+ }
|
|
|
|
|
|
- return this._w;
|
|
|
+ get w() {
|
|
|
|
|
|
- },
|
|
|
+ return this._w;
|
|
|
|
|
|
- set: function ( value ) {
|
|
|
+ }
|
|
|
|
|
|
- this._w = value;
|
|
|
- this._onChangeCallback();
|
|
|
+ set w( value ) {
|
|
|
|
|
|
- }
|
|
|
+ this._w = value;
|
|
|
+ this._onChangeCallback();
|
|
|
|
|
|
}
|
|
|
|
|
|
-} );
|
|
|
+ get isQuaternion() {
|
|
|
|
|
|
-Object.assign( Quaternion.prototype, {
|
|
|
+ return true;
|
|
|
|
|
|
- isQuaternion: true,
|
|
|
+ }
|
|
|
|
|
|
- set: function ( x, y, z, w ) {
|
|
|
+ set( x, y, z, w ) {
|
|
|
|
|
|
this._x = x;
|
|
|
this._y = y;
|
|
@@ -187,15 +167,15 @@ Object.assign( Quaternion.prototype, {
|
|
|
|
|
|
return this;
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- clone: function () {
|
|
|
+ clone() {
|
|
|
|
|
|
return new this.constructor( this._x, this._y, this._z, this._w );
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- copy: function ( quaternion ) {
|
|
|
+ copy( quaternion ) {
|
|
|
|
|
|
this._x = quaternion.x;
|
|
|
this._y = quaternion.y;
|
|
@@ -206,9 +186,9 @@ Object.assign( Quaternion.prototype, {
|
|
|
|
|
|
return this;
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- setFromEuler: function ( euler, update ) {
|
|
|
+ setFromEuler( euler, update ) {
|
|
|
|
|
|
if ( ! ( euler && euler.isEuler ) ) {
|
|
|
|
|
@@ -286,9 +266,9 @@ Object.assign( Quaternion.prototype, {
|
|
|
|
|
|
return this;
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- setFromAxisAngle: function ( axis, angle ) {
|
|
|
+ setFromAxisAngle( axis, angle ) {
|
|
|
|
|
|
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm
|
|
|
|
|
@@ -305,9 +285,9 @@ Object.assign( Quaternion.prototype, {
|
|
|
|
|
|
return this;
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- setFromRotationMatrix: function ( m ) {
|
|
|
+ setFromRotationMatrix( m ) {
|
|
|
|
|
|
// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm
|
|
|
|
|
@@ -363,9 +343,9 @@ Object.assign( Quaternion.prototype, {
|
|
|
|
|
|
return this;
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- setFromUnitVectors: function ( vFrom, vTo ) {
|
|
|
+ setFromUnitVectors( vFrom, vTo ) {
|
|
|
|
|
|
// assumes direction vectors vFrom and vTo are normalized
|
|
|
|
|
@@ -406,15 +386,15 @@ Object.assign( Quaternion.prototype, {
|
|
|
|
|
|
return this.normalize();
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- angleTo: function ( q ) {
|
|
|
+ angleTo( q ) {
|
|
|
|
|
|
return 2 * Math.acos( Math.abs( MathUtils.clamp( this.dot( q ), - 1, 1 ) ) );
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- rotateTowards: function ( q, step ) {
|
|
|
+ rotateTowards( q, step ) {
|
|
|
|
|
|
const angle = this.angleTo( q );
|
|
|
|
|
@@ -426,23 +406,23 @@ Object.assign( Quaternion.prototype, {
|
|
|
|
|
|
return this;
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- identity: function () {
|
|
|
+ identity() {
|
|
|
|
|
|
return this.set( 0, 0, 0, 1 );
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- inverse: function () {
|
|
|
+ inverse() {
|
|
|
|
|
|
// quaternion is assumed to have unit length
|
|
|
|
|
|
return this.conjugate();
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- conjugate: function () {
|
|
|
+ conjugate() {
|
|
|
|
|
|
this._x *= - 1;
|
|
|
this._y *= - 1;
|
|
@@ -452,27 +432,27 @@ Object.assign( Quaternion.prototype, {
|
|
|
|
|
|
return this;
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- dot: function ( v ) {
|
|
|
+ dot( v ) {
|
|
|
|
|
|
return this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- lengthSq: function () {
|
|
|
+ lengthSq() {
|
|
|
|
|
|
return this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- length: function () {
|
|
|
+ length() {
|
|
|
|
|
|
return Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- normalize: function () {
|
|
|
+ normalize() {
|
|
|
|
|
|
let l = this.length();
|
|
|
|
|
@@ -498,9 +478,9 @@ Object.assign( Quaternion.prototype, {
|
|
|
|
|
|
return this;
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- multiply: function ( q, p ) {
|
|
|
+ multiply( q, p ) {
|
|
|
|
|
|
if ( p !== undefined ) {
|
|
|
|
|
@@ -511,15 +491,15 @@ Object.assign( Quaternion.prototype, {
|
|
|
|
|
|
return this.multiplyQuaternions( this, q );
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- premultiply: function ( q ) {
|
|
|
+ premultiply( q ) {
|
|
|
|
|
|
return this.multiplyQuaternions( q, this );
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- multiplyQuaternions: function ( a, b ) {
|
|
|
+ multiplyQuaternions( a, b ) {
|
|
|
|
|
|
// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm
|
|
|
|
|
@@ -535,9 +515,9 @@ Object.assign( Quaternion.prototype, {
|
|
|
|
|
|
return this;
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- slerp: function ( qb, t ) {
|
|
|
+ slerp( qb, t ) {
|
|
|
|
|
|
if ( t === 0 ) return this;
|
|
|
if ( t === 1 ) return this.copy( qb );
|
|
@@ -605,15 +585,15 @@ Object.assign( Quaternion.prototype, {
|
|
|
|
|
|
return this;
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- equals: function ( quaternion ) {
|
|
|
+ equals( quaternion ) {
|
|
|
|
|
|
return ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- fromArray: function ( array, offset ) {
|
|
|
+ fromArray( array, offset ) {
|
|
|
|
|
|
if ( offset === undefined ) offset = 0;
|
|
|
|
|
@@ -626,9 +606,9 @@ Object.assign( Quaternion.prototype, {
|
|
|
|
|
|
return this;
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- toArray: function ( array, offset ) {
|
|
|
+ toArray( array, offset ) {
|
|
|
|
|
|
if ( array === undefined ) array = [];
|
|
|
if ( offset === undefined ) offset = 0;
|
|
@@ -640,9 +620,9 @@ Object.assign( Quaternion.prototype, {
|
|
|
|
|
|
return array;
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- fromBufferAttribute: function ( attribute, index ) {
|
|
|
+ fromBufferAttribute( attribute, index ) {
|
|
|
|
|
|
this._x = attribute.getX( index );
|
|
|
this._y = attribute.getY( index );
|
|
@@ -651,19 +631,19 @@ Object.assign( Quaternion.prototype, {
|
|
|
|
|
|
return this;
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- _onChange: function ( callback ) {
|
|
|
+ _onChange( callback ) {
|
|
|
|
|
|
this._onChangeCallback = callback;
|
|
|
|
|
|
return this;
|
|
|
|
|
|
- },
|
|
|
+ }
|
|
|
|
|
|
- _onChangeCallback: function () {}
|
|
|
+ _onChangeCallback() {}
|
|
|
|
|
|
-} );
|
|
|
+}
|
|
|
|
|
|
|
|
|
export { Quaternion };
|