jsketcher/modules/scene/objects/meshLine.js
2020-07-18 22:18:03 -07:00

45 lines
1.2 KiB
JavaScript

import * as vec from 'math/vec';
import {perpendicularVector} from '../../math/commons';
import {Face3, Geometry, Vector3} from 'three';
export function createMeshLineGeometry(points, width) {
const vThree = arr => new Vector3().fromArray(arr);
const geometry = new Geometry();
let base = null;
for (let i = 1; i < points.length; i++) {
let a = points[i - 1];
let b = points[i];
let ab = vec._normalize(vec.sub(b, a));
let dirs = [];
dirs[0] = perpendicularVector(ab);
dirs[1] = vec.cross(ab, dirs[0]);
dirs[2] = vec.negate(dirs[0]);
dirs[3] = vec.negate(dirs[1]);
dirs.forEach(d => vec._mul(d, width));
if (base === null) {
base = dirs.map(d => vec.add(a, d));
}
let lid = dirs.map(d => vec.add(b, d));
let off = geometry.vertices.length;
base.forEach(p => geometry.vertices.push(vThree(p)));
lid.forEach(p => geometry.vertices.push(vThree(p)));
base = lid;
[
[0, 4, 3],
[3, 4, 7],
[2, 3, 7],
[7, 6, 2],
[0, 1, 5],
[5, 4, 0],
[1, 2, 6],
[6, 5, 1],
].forEach(([a, b, c]) => geometry.faces.push(new Face3(a + off, b + off, c + off)));
}
geometry.computeFaceNormals();
return geometry;
}