• Like
openFrameworks 動きを生みだす様々なアルゴリズム - 多摩美メディアアートII
Upcoming SlideShare
Loading in...5
×

openFrameworks 動きを生みだす様々なアルゴリズム - 多摩美メディアアートII

  • 8,760 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
8,760
On Slideshare
0
From Embeds
0
Number of Embeds
3

Actions

Shares
Downloads
142
Comments
0
Likes
17

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. ‣ ‣‣ ‣ ‣ ‣ ‣ ‣ ‣
  • 2. ‣‣‣
  • 3. ‣‣‣ http://goo.gl/zyfQR (Google Docs )
  • 4. ‣‣
  • 5. ‣‣‣void testApp::mouseMoved(int x, int y ){! prevMouseX = x;! prevMouseY = y;}void testApp::mouseDragged(int x, int y, int button){! //1! float dx = x - prevMouseX;! float dy = y - prevMouseY;!! //! particle myParticle;! myParticle.setInitialCondition(x,y, dx*0.5,dy*0.5);! //! particles.push_back(myParticle);!! //! prevMouseX = x;! prevMouseY = y;!}
  • 6.
  • 7.
  • 8. ‣‣‣
  • 9. ‣‣‣ F -F
  • 10. ‣‣void particle::bounceOffWalls(){! //! float minx = 0;! float miny = 0;! float maxx = ofGetWidth();! float maxy = ofGetHeight();! //! if (pos.x > maxx){! ! pos.x = maxx;! ! vel.x *= -1;! } else if (pos.x < minx){! ! pos.x = minx;! ! vel.x *= -1;! }! //! if (pos.y > maxy){! ! pos.y = maxy;! ! vel.y *= -1;! } else if (pos.y < miny){! ! pos.y = miny;! ! vel.y *= -1;! }}
  • 11.
  • 12. ‣‣‣ F = -kx‣ k F = -kx ma = -kx x = -sin k t m x = Csin(ωt + θ x
  • 13. ‣‣ springForce = -stiffness * stretch‣ = - *‣‣ springForce = -stiffness * (position - restPosition)‣
  • 14. ‣‣ springForce = stiffness * (restPositon - position)‣‣ velocity = dumping * (velocity + springFroce)
  • 15. ‣‣‣‣
  • 16. ‣‣‣void spring::update(){! if ((particleA == NULL) || (particleB == NULL)){! ! return;! }!! ofVec2f pta = particleA->pos;! ofVec2f ptb = particleB->pos;!! float theirDistance = (pta - ptb).length();! float springForce = (springiness * (distance - theirDistance));! ofVec2f frcToAdd = (pta-ptb).normalized() * springForce;!! particleA->addForce(frcToAdd.x, frcToAdd.y);! particleB->addForce(-frcToAdd.x, -frcToAdd.y);}
  • 17. ‣‣void testApp::setup(){!!! ofBackground(0,0,0);!! ofSetVerticalSync(true);! ofSetFrameRate(60);! //Particle A! particle_a.setInitialCondition(400, 400, 0, 0);!! //Particle B! particle_b.setInitialCondition(500, 500, 0, 0);! // (spring)! mySpring.distance = 100; //! mySpring.springiness = 0.1f; //! mySpring.particleA = &particle_a;! mySpring.particleB = &particle_b;}
  • 18. ‣‣void testApp::update(){!! //! particle_a.resetForce();! particle_b.resetForce();!! //! mySpring.update();!! // ( )! particle_a.bounceOffWalls();! particle_a.update();!! particle_b.bounceOffWalls();! particle_b.update();}
  • 19. ‣‣void testApp::draw(){! ofSetColor(255, 255, 255);!! //! mySpring.draw();!! //particle! particle_a.draw();! particle_b.draw();}
  • 20. ‣‣
  • 21. ‣‣‣
  • 22. ‣‣void testApp::setup(){!! ofBackground(0,0,0);! ofSetVerticalSync(true);! ofSetFrameRate(60);! ofSetBackgroundAuto(false);! pimg.loadImage("particle32.png");! //particle! for (int i = 0; i < 20; i++){! ! particle myParticle;! ! myParticle.setInitialCondition(ofRandom(500,550),ofRandom(500,550),0,0);! ! particles.push_back(myParticle);! }!! // spring! for (int i = 0; i < (particles.size()-1); i++){! ! spring mySpring;! ! mySpring.distance = 25;! ! mySpring.springiness = 0.2f;! ! mySpring.particleA = & (particles[i]);! ! mySpring.particleB = & (particles[(i+1)%particles.size()]);! ! springs.push_back(mySpring);! }}
  • 23. ‣‣void testApp::update(){! // particle! for (int i = 0; i < particles.size(); i++){! ! particles[i].resetForce();! }! //! for (int i = 0; i < springs.size(); i++){! ! springs[i].update();! }!! // particle! for (int i = 0; i < particles.size(); i++){! ! particles[i].addDampingForce();! ! particles[i].bounceOffWalls();! ! particles[i].update();! }}
  • 24. ‣‣void testApp::draw(){! //! ofSetColor(255, 255, 255, 127);! for (int i = 0; i < springs.size(); i++){! ! springs[i].draw();! }!! // particle! ofSetColor(255, 255, 255);! for (int i = 0; i < particles.size(); i++){! ! particles[i].draw();! }!}
  • 25.
  • 26.
  • 27.
  • 28. ‣‣‣ ‣ ‣‣
  • 29. ‣‣
  • 30. ‣‣‣‣ ‣ ‣ ‣‣‣
  • 31. ‣int fieldWidthint fieldHeightint fieldSizeint externalWidthint externalHeightvector field
  • 32. ‣vectorField();virtual ~vectorField();void setupField(int innerW, int innerH,int outerW, int outerH);void clear();void fadeField(float fadeAmount);void randomizeField(float scale);void draw();ofVec2f getForceFromPos(float xpos, floatypos);
  • 33. ‣void addOutwardCircle(float x, float y,float radius, float strength);void addInwardCircle(float x, float y,float radius, float strength);void addClockwiseCircle(float x, float y,float radius, float strength);void addCounterClockwiseCircle(float x,float y, float radius, float strength);void addVectorCircle(float x, float y,float vx, float vy, float radius, floatstrength);
  • 34. ‣‣ ‣ ‣ ‣ ‣‣
  • 35. ‣‣oid testApp::setup(){!!! ofSetVerticalSync(true);! ofSetFrameRate(60);! ofBackground(0, 0, 0);!! // ( 102 76 )! VF.setupField(102, 76, ofGetWidth(), ofGetHeight());! //! addMode = 1;}
  • 36. ‣‣void testApp::draw(){! //! ofEnableBlendMode(OF_BLENDMODE_ADD);! ofSetColor(0,130,130, 200);! VF.draw();! ofDisableBlendMode();!}
  • 37.
  • 38. ‣‣‣
  • 39. ‣‣void testApp::setup(){!!! ofSetVerticalSync(true);! ofSetFrameRate(60);! ofBackground(0, 0, 0);!! // 10000! for (int i = 0; i < 10000; i++){! ! particle myParticle;! ! myParticle.setInitialCondition! ! (ofRandom(0,ofGetWidth()),ofRandom(0,ofGetHeight()),0,0);! ! particles.push_back(myParticle);! }!! // ( 102 76 )! VF.setupField(102, 76, ofGetWidth(), ofGetHeight());!! //! addMode = 2;}
  • 40. ‣‣void testApp::update(){!! for (int i = 0; i < particles.size(); i++){! !! ! //particle! ! particles[i].resetForce();! !! ! // particle! ! ofVec2f frc;! ! frc = VF.getForceFromPos(particles[i].pos.x, particles[i].pos.y);! !! ! //Particle! ! particles[i].addForce(frc.x, frc.y);! ! particles[i].addDampingForce();! ! particles[i].bounceOffWalls();! ! particles[i].update();! }!! //! VF.fadeField(0.998f);}
  • 41. ‣‣void testApp::draw(){!! ofEnableBlendMode(OF_BLENDMODE_ADD);!! //! ofSetColor(0,130,130, 127);! VF.draw();!! // particle! ofSetColor(0, 127, 255)! ;! for (int i = 0; i < particles.size(); i++){! ! particles[i].draw();! }!!! ofDisableBlendMode();!}
  • 42.
  • 43. ‣‣
  • 44. ‣‣void testApp::mouseDragged(int x, int y, int button){!! float diffx = x - prevMouseX;! float diffy = y - prevMouseY;!! VF.addVectorCircle((float)x, (float)y, diffx*0.3, diffy*0.3, 60, 0.3f);!! prevMouseX = x;! prevMouseY = y;}
  • 45.
  • 46. ‣‣‣ http://www.msavisuals.com/msafluid
  • 47. ‣‣‣‣‣‣ http://www.red3d.com/cwr/boids/
  • 48. ‣ ‣ ‣ ‣ ‣ ‣ ‣
  • 49. ‣‣‣
  • 50. ‣void particle::addFlockingForce(){! // seperation! if(seperation.count > 0){! ! seperation.sum /= (float)seperation.count;! ! float sepFrc ! = seperation.strength;! ! frc -= (seperation.sum.normalized() * sepFrc);! }!! // alignment! if(alignment.count > 0){! ! alignment.sum /= (float)alignment.count;! ! float alignFrc ! = alignment.strength;! ! frc += (alignment.sum! ! * alignFrc);! }!! // cohesion! if(cohesion.count > 0){! ! cohesion.sum /= (float)cohesion.count;! ! cohesion.sum -= pos;! ! float cohFrc ! = cohesion.strength;! ! frc += (cohesion.sum.normalized() * cohFrc);! }!}
  • 51. ‣void particle::addForFlocking(particle &p){!! ofVec3f diff, diffNormalized;! float distance;!! diff! ! ! = p.pos - pos;! distance! ! = diff.length();! diffNormalized! = diff;! diffNormalized.normalize();! if( distance > 0 && distance < seperation.distance ){! ! seperation.sum += diffNormalized;! ! seperation.count++;! }!! if( distance > 0 && distance < alignment.distance ){! ! alignment.sum += p.vel.getNormalized();! ! alignment.count++;! }!! if( distance > 0 && distance < cohesion.distance ){! ! cohesion.sum += p.pos;! ! cohesion.count++;! }}
  • 52.