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
    };
}
Example #2
0
  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
  }