UNPKG

@jscad/modeling

Version:

Constructive Solid Geometry (CSG) Library for JSCAD

61 lines (52 loc) 1.42 kB
const { EPS } = require('../constants') const { sin, cos } = require('../utils/trigonometry') const identity = require('./identity') /** * Creates a matrix from a given angle around a given axis * This is equivalent to (but much faster than): * * mat4.identity(dest) * mat4.rotate(dest, dest, rad, axis) * * @param {mat4} out - receiving matrix * @param {Number} rad - angle to rotate the matrix by * @param {vec3} axis - axis of which to rotate around * @returns {mat4} out * @alias module:modeling/maths/mat4.fromRotation * @example * let matrix = fromRotation(create(), TAU / 4, [0, 0, 3]) */ const fromRotation = (out, rad, axis) => { let [x, y, z] = axis const lengthSquared = x * x + y * y + z * z if (Math.abs(lengthSquared) < EPS) { // axis is 0,0,0 or almost return identity(out) } const len = 1 / Math.sqrt(lengthSquared) x *= len y *= len z *= len const s = sin(rad) const c = cos(rad) const t = 1 - c // Perform rotation-specific matrix multiplication out[0] = x * x * t + c out[1] = y * x * t + z * s out[2] = z * x * t - y * s out[3] = 0 out[4] = x * y * t - z * s out[5] = y * y * t + c out[6] = z * y * t + x * s out[7] = 0 out[8] = x * z * t + y * s out[9] = y * z * t - x * s out[10] = z * z * t + c out[11] = 0 out[12] = 0 out[13] = 0 out[14] = 0 out[15] = 1 return out } module.exports = fromRotation