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
JavaScript
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