UNPKG

gs-json

Version:

gs-JSON is a domain agnostic unifying 3D file format for geometric and semantic modelling (hence the 'gs').

152 lines 5.52 kB
import * as three from "three"; const EPS = 1e-6; /** * Utility functions for threejs. */ // Matrices ====================================================================================================== export function multVectorMatrix(v, m) { const v2 = v.clone(); v2.applyMatrix4(m); return v2; } export function multXYZMatrix(xyz, m) { const v2 = new three.Vector3(...xyz); v2.applyMatrix4(m); return v2.toArray().slice(0, 3); } export function xformMatrix(o, x, y, z) { x.normalize(); y.normalize(); z.normalize(); const m1 = new three.Matrix4(); const o_neg = o.clone().negate(); m1.setPosition(o_neg); const m2 = new three.Matrix4(); m2.makeBasis(x, y, z); m2.getInverse(m2); const m3 = new three.Matrix4(); m3.multiplyMatrices(m2, m1); return m3; } export function xformMatrixFromXYZs(o, axes) { return xformMatrix(new three.Vector3(...o), new three.Vector3(...axes[0]), new three.Vector3(...axes[1]), new three.Vector3(...axes[2])); } export function matrixInv(m) { const m2 = new three.Matrix4(); return m2.getInverse(m); } // Vectors ======================================================================================================= export function vectorsFromVertices(vertices) { return vertices.map((v) => new three.Vector3(...v.getPoint().getPosition())); } export function vectorsFromPoints(points) { return points.map((p) => new three.Vector3(...p.getPosition())); } export function subVectors(v1, v2, norm = false) { const v3 = new three.Vector3(); v3.subVectors(v1, v2); if (norm) { v3.normalize(); } return v3; } export function addVectors(v1, v2, norm = false) { const v3 = new three.Vector3(); v3.addVectors(v1, v2); if (norm) { v3.normalize(); } return v3; } export function crossVectors(v1, v2, norm = false) { const v3 = new three.Vector3(); v3.crossVectors(v1, v2); if (norm) { v3.normalize(); } return v3; } export function vectorFromPointsAtoB(a, b, norm = false) { const v = subVectors(new three.Vector3(...b.getPosition()), new three.Vector3(...a.getPosition())); if (norm) { v.normalize(); } return v; } export function vectorFromVerticesAtoB(a, b, norm = false) { const v = subVectors(new three.Vector3(...b.getPoint().getPosition()), new three.Vector3(...a.getPoint().getPosition())); if (norm) { v.normalize(); } return v; } // XYZ =========================================================================================================== export function subXYZs(xyz1, xyz2, norm = false) { return subVectors(new three.Vector3(...xyz1), new three.Vector3(...xyz2), norm).toArray().slice(0, 3); } export function addXYZs(xyz1, xyz2, norm = false) { return addVectors(new three.Vector3(...xyz1), new three.Vector3(...xyz2), norm).toArray().slice(0, 3); } export function crossXYZs(xyz1, xyz2, norm = false) { return crossVectors(new three.Vector3(...xyz1), new three.Vector3(...xyz2), norm).toArray().slice(0, 3); } export function normalizeXYZ(xyz) { return new three.Vector3(...xyz).normalize().toArray().slice(0, 3); } export function lengthXYZ(xyz) { return new three.Vector3(...xyz).length(); } export function setLengthXYZ(xyz, length) { return new three.Vector3(...xyz).setLength(length).toArray(); } export function makeXYZOrthogonal(xyz1, xyz2, normalize) { // create normalised vectors const vec_x = new three.Vector3(...xyz1); const len = vec_x.length(); if (len < EPS) { return null; } vec_x.normalize(); const vec2 = new three.Vector3(...xyz2).normalize(); // check if vec1 and vec2 are parallel const abs_dot = Math.abs(vec_x.dot(vec2)); if ((1 - abs_dot) < EPS) { return null; } // make vec_z const vec_z = new three.Vector3(); vec_z.crossVectors(vec_x, vec2); // make vec_y const vec_y = new three.Vector3(); vec_y.crossVectors(vec_z, vec_x); // return if (normalize) { return [ vec_x.toArray(), vec_y.toArray(), vec_z.toArray(), ]; } else { return [ xyz1, vec_y.setLength(len).toArray(), vec_z.toArray(), ]; } } // Points ======================================================================================================== export function subPoints(p1, p2, norm = false) { return subVectors(new three.Vector3(...p1.getPosition()), new three.Vector3(...p2.getPosition()), norm).toArray().slice(0, 3); } export function addPoints(p1, p2, norm = false) { return addVectors(new three.Vector3(...p1.getPosition()), new three.Vector3(...p2.getPosition()), norm).toArray().slice(0, 3); } // Vertices ====================================================================================================== export function subVertices(v1, v2, norm = false) { return subVectors(new three.Vector3(...v1.getPoint().getPosition()), new three.Vector3(...v2.getPoint().getPosition()), norm).toArray().slice(0, 3); } export function addVertices(v1, v2, norm = false) { return addVectors(new three.Vector3(...v1.getPoint().getPosition()), new three.Vector3(...v2.getPoint().getPosition()), norm).toArray().slice(0, 3); } //# sourceMappingURL=threex.js.map