topical media & game development

talk show tell print

#javascript-processing-example-topic-simulate-softbody.htm / htm



  <!DOCTYPE html>
  <html><head>
  <script src="javascript-processing-example-processing.js"></script>
  <script src="javascript-processing-example-init.js"></script>
  <link rel="stylesheet" href="javascript-processing-example-style.css">
  </head><body><h1><a href="http://ejohn.org/blog/processingjs/">Processing.js</a></h1>
  <h2>SoftBody</h2>
  
  <p>by Ira Greenberg.  
  
  Softbody dynamics simulation using curveVertex() and curveTightness()</p>
  
  <p><a href="http://processing.org/learning/topics/softbody.html"><b>Original Processing.org Example:</b> SoftBody</a><br>
  <script type="application/processing">
  // center point
  float centerX = 0, centerY = 0;
  
  float radius = 45, rotAngle = -90;
  float accelX, accelY;
  float springing = .0085, damping = .98;
  
  //corner nodes
  int nodes = 5;
  float nodeStartX[] = new float[nodes];
  float nodeStartY[] = new float[nodes];
  float[]nodeX = new float[nodes];
  float[]nodeY = new float[nodes];
  float[]angle = new float[nodes];
  float[]frequency = new float[nodes];
  
  // soft-body dynamics
  float organicConstant = 1;
  
  void setup() {
    size(200, 200);
    //center shape in window
    centerX = width/2;
    centerY = height/2;
    // iniitalize frequencies for corner nodes
    for (int i=0; i<nodes; i++){
      frequency[i] = random(5, 12);
    }
    noStroke();
    smooth();
    frameRate(30);
  }
  
  void draw() {
    //fade background
    fill(0, 100);
    rect(0,0,width, height);
    drawShape();
    moveShape();
  }
  
  void drawShape() {
    //  calculate node  starting locations
    for (int i=0; i<nodes; i++){
      nodeStartX[i] = centerX+cos(radians(rotAngle))*radius;
      nodeStartY[i] = centerY+sin(radians(rotAngle))*radius;
      rotAngle += 360.0/nodes;
    }
  
    // draw polygon
    curveTightness(organicConstant);
    fill(255);
    beginShape();
    for (int i=0; i<nodes; i++){
      curveVertex(nodeX[i], nodeY[i]);
    }
    for (int i=0; i<nodes-1; i++){
      curveVertex(nodeX[i], nodeY[i]);
    }
    endShape(CLOSE);
  }
  
  void moveShape() {
    //move center point
    float deltaX = mouseX-centerX;
    float deltaY = mouseY-centerY;
  
    // create springing effect
    deltaX *= springing;
    deltaY *= springing;
    accelX += deltaX;
    accelY += deltaY;
  
    // move predator's center
    centerX += accelX;
    centerY += accelY;
  
    // slow down springing
    accelX *= damping;
    accelY *= damping;
  
    // change curve tightness
    organicConstant = 1-((abs(accelX)+abs(accelY))*.1);
  
    //move nodes
    for (int i=0; i<nodes; i++){
      nodeX[i] = nodeStartX[i]+sin(radians(angle[i]))*(accelX*2);
      nodeY[i] = nodeStartY[i]+sin(radians(angle[i]))*(accelY*2);
      angle[i]+=frequency[i];
    }
  }
  </script><canvas width="200" height="200"></canvas></p>
  <div style="overflow: hidden; height: 0px; width: 0px;"></div>
  
  <pre><b>// All Examples Written by <a href="http://reas.com/">Casey Reas</a> and <a href="http://benfry.com/">Ben Fry</a>
  // unless otherwise stated.</b>
  // center point
  float centerX = 0, centerY = 0;
  
  float radius = 45, rotAngle = -90;
  float accelX, accelY;
  float springing = .0085, damping = .98;
  
  //corner nodes
  int nodes = 5;
  float nodeStartX[] = new float[nodes];
  float nodeStartY[] = new float[nodes];
  float[]nodeX = new float[nodes];
  float[]nodeY = new float[nodes];
  float[]angle = new float[nodes];
  float[]frequency = new float[nodes];
  
  // soft-body dynamics
  float organicConstant = 1;
  
  void setup() {
    size(200, 200);
    //center shape in window
    centerX = width/2;
    centerY = height/2;
    // iniitalize frequencies for corner nodes
    for (int i=0; i&lt;nodes; i++){
      frequency[i] = random(5, 12);
    }
    noStroke();
    smooth();
    frameRate(30);
  }
  
  void draw() {
    //fade background
    fill(0, 100);
    rect(0,0,width, height);
    drawShape();
    moveShape();
  }
  
  void drawShape() {
    //  calculate node  starting locations
    for (int i=0; i&lt;nodes; i++){
      nodeStartX[i] = centerX+cos(radians(rotAngle))*radius;
      nodeStartY[i] = centerY+sin(radians(rotAngle))*radius;
      rotAngle += 360.0/nodes;
    }
  
    // draw polygon
    curveTightness(organicConstant);
    fill(255);
    beginShape();
    for (int i=0; i&lt;nodes; i++){
      curveVertex(nodeX[i], nodeY[i]);
    }
    for (int i=0; i&lt;nodes-1; i++){
      curveVertex(nodeX[i], nodeY[i]);
    }
    endShape(CLOSE);
  }
  
  void moveShape() {
    //move center point
    float deltaX = mouseX-centerX;
    float deltaY = mouseY-centerY;
  
    // create springing effect
    deltaX *= springing;
    deltaY *= springing;
    accelX += deltaX;
    accelY += deltaY;
  
    // move predator's center
    centerX += accelX;
    centerY += accelY;
  
    // slow down springing
    accelX *= damping;
    accelY *= damping;
  
    // change curve tightness
    organicConstant = 1-((abs(accelX)+abs(accelY))*.1);
  
    //move nodes
    for (int i=0; i&lt;nodes; i++){
      nodeX[i] = nodeStartX[i]+sin(radians(angle[i]))*(accelX*2);
      nodeY[i] = nodeStartY[i]+sin(radians(angle[i]))*(accelY*2);
      angle[i]+=frequency[i];
    }
  }</pre>
  </body></html>
  


(C) Æliens 20/2/2008

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.