UNPKG

vertecs

Version:

A typescript entity-component-system framework

39 lines (32 loc) 1.27 kB
import { QuatLike, vec3, Vec3Like } from "ts-gl-matrix"; export default class MathUtils { public static getEulerToDegrees(radians: number): number { return radians * (180 / Math.PI); } /** * Convert a quaternion to euler angles. * Missing function from gl-matrix * @param quat * @param out */ public static getEulerFromQuat(out: Vec3Like, quat: QuatLike): Vec3Like { const sinRCosP = 2 * (quat[3] * quat[0] + quat[1] * quat[2]); const cosRCosP = 1 - 2 * (quat[0] * quat[0] + quat[1] * quat[1]); const roll = Math.atan2(sinRCosP, cosRCosP); const sinP = 2 * (quat[3] * quat[1] - quat[2] * quat[0]); let pitch; if (Math.abs(sinP) >= 1) pitch = (Math.sign(sinP) * Math.PI) / 2; // use 90 degrees if out of range else pitch = Math.asin(sinP); const sinYCosP = 2 * (quat[3] * quat[2] + quat[0] * quat[1]); const cosYCosP = 1 - 2 * (quat[1] * quat[1] + quat[2] * quat[2]); const yaw = Math.atan2(sinYCosP, cosYCosP); vec3.set( out, MathUtils.getEulerToDegrees(roll), MathUtils.getEulerToDegrees(pitch), MathUtils.getEulerToDegrees(yaw) ); return out; } }