@openhps/core
Version:
Open Hybrid Positioning System - Core component
104 lines • 3.78 kB
JavaScript
var Quaternion_1;
import { __decorate, __metadata } from "tslib";
import { SerializableObject, SerializableMember, NumberType } from '../../data/decorators';
import * as THREE from './_internal';
import { Euler } from './Euler';
import { Matrix4 } from './Matrix4';
import { AxisAngle } from './AxisAngle';
import { Vector3 } from './Vector3';
/**
* Serializable THREE.js Quaternion
*/
let Quaternion = Quaternion_1 = class Quaternion extends THREE.Quaternion {
/**
* Convert a threejs quaternion to serializable quaternion
* @param {THREE.Quaternion} threeQuaternion ThreeJS created quaternion
* @returns {Quaternion} Serializable quaternion
*/
static fromThreeJS(threeQuaternion) {
const quaternion = new this();
quaternion.x = threeQuaternion.x;
quaternion.y = threeQuaternion.y;
quaternion.z = threeQuaternion.z;
quaternion.w = threeQuaternion.w;
return quaternion;
}
static fromEuler(euler) {
const quaternion = new this();
if (euler instanceof Euler) {
quaternion.setFromEuler(euler);
} else if (euler instanceof Vector3) {
quaternion.setFromEuler(new Euler(euler.x, euler.y, euler.z));
} else if (euler instanceof Array) {
quaternion.setFromEuler(new Euler(euler[0], euler[1], euler[2]));
} else if (euler['yaw'] === undefined) {
quaternion.setFromEuler(new Euler(euler.x, euler.y, euler.z, euler.order, euler.unit));
} else {
quaternion.setFromEuler(new Euler(euler.roll, euler.pitch, euler.yaw, 'ZYX', euler.unit));
}
return quaternion;
}
static fromAxisAngle(axis) {
const quaternion = new this();
if (axis instanceof AxisAngle) {
quaternion.setFromAxisAngle(new Vector3(axis.x, axis.y, axis.z), axis.angle);
} else if (axis instanceof Array) {
const axisAngle = new AxisAngle(axis[0], axis[1], axis[2], axis.length === 4 ? axis[3] : null);
quaternion.setFromAxisAngle(axisAngle, axisAngle.angle);
} else {
const axisAngle = new AxisAngle(axis.x, axis.y, axis.z, axis.angle ? axis.angle : null, axis.unit);
quaternion.setFromAxisAngle(axisAngle, axisAngle.angle);
}
return quaternion;
}
/**
* Convert rotation matrix to quaternion
* @param {Quaternion} this This type
* @param {Matrix4} matrix Rotation matrix
* @returns {Quaternion} Serializable quaternion
*/
static fromRotationMatrix(matrix) {
const quaternion = new this();
quaternion.setFromRotationMatrix(matrix);
return quaternion;
}
/**
* Convert the quaternion to euler angles
* @param {EulerOrder} order Euler order
* @returns {Euler} Converted euler
*/
toEuler(order) {
return Euler.fromQuaternion(this, order);
}
/**
* Convert the quaternion to axis angles
* @returns {AxisAngle} Converted axis angle
*/
toAxisAngle() {
return AxisAngle.fromQuaternion(this);
}
/**
* Convert quaternion to rotation matrix
* @returns {Matrix4} Rotation matrix
*/
toRotationMatrix() {
return Matrix4.rotationFromQuaternion(this);
}
clone() {
return new this.constructor().copy(this);
}
};
__decorate([SerializableMember({
numberType: NumberType.DECIMAL
}), __metadata("design:type", Number)], Quaternion.prototype, "x", void 0);
__decorate([SerializableMember({
numberType: NumberType.DECIMAL
}), __metadata("design:type", Number)], Quaternion.prototype, "y", void 0);
__decorate([SerializableMember({
numberType: NumberType.DECIMAL
}), __metadata("design:type", Number)], Quaternion.prototype, "z", void 0);
__decorate([SerializableMember({
numberType: NumberType.DECIMAL
}), __metadata("design:type", Number)], Quaternion.prototype, "w", void 0);
Quaternion = Quaternion_1 = __decorate([SerializableObject()], Quaternion);
export { Quaternion };