#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<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]; } }</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.