function createPath(scale){ var c = 0.55191502449; var ellipseCurvePath = new THREE.CurvePath(); ellipseCurvePath.add(new THREE.CubicBezierCurve3( new THREE.Vector3( 0, 1, 0 ).multiplyScalar(scale), new THREE.Vector3( c, 1, 0 ).multiplyScalar(scale), new THREE.Vector3( 1, c, 0 ).multiplyScalar(scale), new THREE.Vector3( 1, 0, 0 ).multiplyScalar(scale) )); ellipseCurvePath.add(new THREE.CubicBezierCurve3( new THREE.Vector3( 1, 0, 0 ).multiplyScalar(scale), new THREE.Vector3( 1, -c, 0 ).multiplyScalar(scale), new THREE.Vector3( c, -1, 0 ).multiplyScalar(scale), new THREE.Vector3( 0, -1, 0 ).multiplyScalar(scale) )); ellipseCurvePath.add(new THREE.CubicBezierCurve3( new THREE.Vector3( 0, -1, 0 ).multiplyScalar(scale), new THREE.Vector3( -c, -1, 0 ).multiplyScalar(scale), new THREE.Vector3( -1, -c, 0 ).multiplyScalar(scale), new THREE.Vector3( -1, 0, 0 ).multiplyScalar(scale) )); ellipseCurvePath.add(new THREE.CubicBezierCurve3( new THREE.Vector3( -1, 0, 0 ).multiplyScalar(scale), new THREE.Vector3( -1, c, 0 ).multiplyScalar(scale), new THREE.Vector3( -c, 1, 0 ).multiplyScalar(scale), new THREE.Vector3( 0, 1, 0 ).multiplyScalar(scale) )); ellipseCurvePath.closePath(); var geometryt = ellipseCurvePath.createPointsGeometry( 100 ); var line = new THREE.Line(geometryt, new THREE.LineBasicMaterial({color : '#FFF'})); return { line: line, spline: ellipseCurvePath }; }
generateGeometry(angle,wobble) { var position = new THREE.Vector3(0,0,0) var direction = new THREE.Vector3(0,0.1,0) var velocity = 0.5*this.scale var axis = new THREE.Vector3(0,0,1) var axis2 = new THREE.Vector3(0,1,0) var axis3 = new THREE.Vector3(1,0,0) var savedPositions = [] var savedDirections = [] var level = 1 var skeletonPieces = [] var skeletonGeometry = new THREE.Geometry() var symbol = '' for (i = 0; i < this.string.length; i++){ symbol = this.string.charAt(i) if (symbol === 'F'){ var numFs = 1 symbol = this.string.charAt(i+1) while (symbol === 'F'){ numFs++ i++ symbol = this.string.charAt(i+1) } //draw forward var newPosition = new THREE.Vector3() newPosition.copy(position) newPosition.addScaledVector(direction,velocity*numFs) var segment = new THREE.LineCurve(position,newPosition) segment.level = level skeletonPieces.push(segment) position = newPosition } else if (symbol === 'L'){ if (Math.random()>2/level){ var leaf = new Leaf(position,direction,this.prototypeLeafGeometry) this.leaves.push(leaf.geometry) } } else if (symbol === '-'){ //turn left direction.applyAxisAngle(axis,-angle) } else if (symbol === '+'){ //turn right direction.applyAxisAngle(axis,angle) } else if (symbol === '['){ //save position and angle level+=1 var savedPosition = new THREE.Vector3() savedPosition.copy(position) savedPositions.push(savedPosition) var savedDirection = new THREE.Vector3() savedDirection.copy(direction) savedDirections.push(savedDirection) } else if (symbol === ']'){ //draw leaf //recall position and angle level-=1 position = savedPositions.pop() direction = savedDirections.pop() axis.applyAxisAngle(axis2,wobble) axis.applyAxisAngle(axis3,wobble) } } //now build by level var length = 0 i = 0 console.log(skeletonPieces.length) while(i < skeletonPieces.length){ length = 0 var branchPath = new THREE.CurvePath() level = skeletonPieces[i].level while(i<skeletonPieces.length && skeletonPieces[i].level === level){ branchPath.add(skeletonPieces[i]) length++ i++ } skeletonGeometry.merge(new THREE.TubeGeometry(branchPath, length, //segments this.scale*0.2/level, //radius 12, //radius segments false //closed )) } //add color var numFaces = skeletonGeometry.faces.length for (var i = 0; i < numFaces; i++){ // var hue = parseInt(i/numFaces) var hue = i/numFaces var saturation = 1 var color = new THREE.Color() color.setHSL(hue,saturation,0.5) skeletonGeometry.faces[i].color = color } skeletonGeometry.colorsNeedUpdate = true this.skeletonGeometry = skeletonGeometry // this.leafGeometry = leafGeometry }