mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-06 16:33:15 +01:00
45 lines
1.2 KiB
JavaScript
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;
|
|
}
|