HelicoidBuilder.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. /*
  2. * HelicoidBuilder.js
  3. *
  4. * @author realor
  5. */
  6. import { ObjectBuilder } from './ObjectBuilder.js'
  7. import { CordBuilder } from './CordBuilder.js'
  8. import { Cord } from '../core/Cord.js'
  9. import { CordGeometry } from '../core/CordGeometry.js'
  10. import * as THREE from '../lib/three.module.js'
  11. class HelicoidBuilder extends CordBuilder {
  12. constructor(radius = 1, laps = 4, advance = 1, segments = 32) {
  13. super()
  14. this.radius = radius
  15. this.laps = laps
  16. this.advance = advance
  17. this.segments = segments
  18. }
  19. performBuild(cord) {
  20. if (cord instanceof Cord) {
  21. const cordPoints = []
  22. const radius = this.radius
  23. const segments = this.segments
  24. const steps = Math.round(this.laps * segments)
  25. const angleByStep = (2 * Math.PI) / segments
  26. const heightByStep = this.advance / segments
  27. let angle = 0
  28. let z = 0
  29. for (let i = 0; i <= steps; i++) {
  30. let x = radius * Math.cos(angle)
  31. let y = radius * Math.sin(angle)
  32. z += heightByStep
  33. cordPoints.push(new THREE.Vector3(x, y, z))
  34. angle += angleByStep
  35. }
  36. const geometry = new CordGeometry(cordPoints)
  37. cord.updateGeometry(geometry)
  38. }
  39. return true
  40. }
  41. copy(source) {
  42. this.radius = source.radius
  43. this.laps = source.laps
  44. this.advance = source.advance
  45. this.segments = source.segments
  46. return this
  47. }
  48. }
  49. ObjectBuilder.addClass(HelicoidBuilder)
  50. export { HelicoidBuilder }