stl.js 991 B

1234567891011121314151617181920212223242526272829303132333435
  1. const surfaceNormal = triangle => {
  2. const [p1, p2, p3] = triangle
  3. const v = p2.clone().sub(p1)
  4. const w = p3.clone().sub(p1)
  5. const nx = (v.y * w.z) - (v.z * w.y)
  6. const ny = (v.z * w.x) - (v.x * w.z)
  7. const nz = (v.x * w.y) - (v.y * w.x)
  8. const m = Math.abs(nx) + Math.abs(ny) + Math.abs(nz)
  9. const ax = nx / m
  10. const ay = ny / m
  11. const az = nz / m
  12. return [ax, ay, az]
  13. }
  14. const toStl = (triangles) => {
  15. const output = []
  16. output.push('solid exported')
  17. triangles.forEach(t => {
  18. output.push(` facet normal ${surfaceNormal(t).join(' ')}`)
  19. output.push(' outer loop')
  20. t.forEach(v => output.push(` vertex ${v.x} ${v.y} ${v.z}`))
  21. output.push(' endloop')
  22. output.push(' endfacet')
  23. output.push('')
  24. })
  25. output.push('endsolid exported')
  26. output.push('')
  27. return output.join('\n')
  28. }
  29. const rv = (v) => new v.constructor(v.x, -v.z, v.y)
  30. const rotate = (triangles) => triangles.map(([a, b, c]) => [rv(a), rv(b), rv(c)])
  31. module.exports = {toStl, rotate}