@openhps/core
Version:
Open Hybrid Positioning System - Core component
58 lines • 2.04 kB
JavaScript
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 };