UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

58 lines 2.04 kB
var AxisAngle_1; import { __decorate, __metadata } from "tslib"; import { AngleUnit } from '../unit/AngleUnit'; import { SerializableObject, SerializableMember, NumberType } from '../../data/decorators'; import { Matrix4 } from './Matrix4'; import { Vector3 } from './Vector3'; /** * Axis-angle rotation */ let AxisAngle = AxisAngle_1 = class AxisAngle extends Vector3 { constructor(x, y, z, angle = null, unit = AngleUnit.RADIAN) { super(unit.convert(x ? x : 0, AngleUnit.RADIAN), unit.convert(y ? y : 0, AngleUnit.RADIAN), unit.convert(z ? z : 0, AngleUnit.RADIAN)); if (angle !== null) { this.angle = unit.convert(angle, AngleUnit.RADIAN); } else { this.angle = Math.sqrt(Math.pow(this.x, 2) + Math.pow(this.y, 2) + Math.pow(this.z, 2)); this.normalize(); } } /** * Convert quaternion to axis angles * @param {THREE.Quaternion} quat Quaternion * @returns {AxisAngle} Axis angle instance */ static fromQuaternion(quat) { const axis = new AxisAngle_1(); axis.angle = 2 * Math.acos(quat.w); if (1 - quat.w * quat.w < 0.000001) { axis.x = quat.x; axis.y = quat.y; axis.z = quat.z; } else { // http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/ const s = Math.sqrt(1 - quat.w * quat.w); axis.x = quat.x / s; axis.y = quat.y / s; axis.z = quat.z / s; } return axis; } /** * Convert axis angle to rotation matrix * @returns {Matrix4} Rotation matrix */ toRotationMatrix() { return Matrix4.rotationFromAxisAngle(this, this.angle); } clone() { const vector = new this.constructor(); vector.angle = this.angle; return vector; } }; __decorate([SerializableMember({ numberType: NumberType.DOUBLE }), __metadata("design:type", Number)], AxisAngle.prototype, "angle", void 0); AxisAngle = AxisAngle_1 = __decorate([SerializableObject(), __metadata("design:paramtypes", [Number, Number, Number, Number, AngleUnit])], AxisAngle); export { AxisAngle };