@openhps/core
Version:
Open Hybrid Positioning System - Core component
70 lines • 2.55 kB
JavaScript
;
var AxisAngle_1;
Object.defineProperty(exports, "__esModule", { value: true });
exports.AxisAngle = void 0;
const tslib_1 = require("tslib");
const AngleUnit_1 = require("../unit/AngleUnit");
const decorators_1 = require("../../data/decorators");
const Matrix4_1 = require("./Matrix4");
const Vector3_1 = require("./Vector3");
/**
* Axis-angle rotation
*/
let AxisAngle = AxisAngle_1 = class AxisAngle extends Vector3_1.Vector3 {
constructor(x, y, z, angle = null, unit = AngleUnit_1.AngleUnit.RADIAN) {
super(unit.convert(x ? x : 0, AngleUnit_1.AngleUnit.RADIAN), unit.convert(y ? y : 0, AngleUnit_1.AngleUnit.RADIAN), unit.convert(z ? z : 0, AngleUnit_1.AngleUnit.RADIAN));
if (angle !== null) {
this.angle = unit.convert(angle, AngleUnit_1.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_1.Matrix4.rotationFromAxisAngle(this, this.angle);
}
clone() {
const vector = new this.constructor();
vector.angle = this.angle;
return vector;
}
};
exports.AxisAngle = AxisAngle;
tslib_1.__decorate([
(0, decorators_1.SerializableMember)({
numberType: decorators_1.NumberType.DOUBLE,
}),
tslib_1.__metadata("design:type", Number)
], AxisAngle.prototype, "angle", void 0);
exports.AxisAngle = AxisAngle = AxisAngle_1 = tslib_1.__decorate([
(0, decorators_1.SerializableObject)(),
tslib_1.__metadata("design:paramtypes", [Number, Number, Number, Number, AngleUnit_1.AngleUnit])
], AxisAngle);
//# sourceMappingURL=AxisAngle.js.map