実現したいこと
リープモーションで認識した手の動きに合わせて、パーティクルで軌跡を描きたいです。
その際に、下の画像のようにフェードして残像を残すような動きにしたいです。
前提
パーティクルのかたまりが手の動きに合わせて一緒に動くところまで出来ました。
背景で動画が再生されているため、簡単なフェードアウトが使えません。
該当のソースコード①
Processing
1import processing.video.*; 2import com.leapmotion.leap.*; 3ParticleSystem ps; 4Controller leap = new Controller(); 5InteractionBox iBox; 6 7PGraphics pg; 8 9int n = 15; 10int x; 11Movie[] video = new Movie[n]; 12 13void setup() { 14 size(1280, 800, P2D); 15 colorMode(HSB,100); 16 frameRate(30); 17 background(0); 18 smooth(); 19 ps = new ParticleSystem(new PVector(50, 50)); 20 21 video = new Movie[n]; 22 for (int i = 0; i < n; i++) { 23 video[i] = new Movie(this, "mv" + i + ".mov"); 24 } 25} 26 27void draw() { 28 29 background(0); 30 31 float d = video[x].duration(); 32 float t = video[x].time(); 33 34 if (t < d) { 35 image(video[x], 0, 0, width, height); 36 37 } else { 38 39 Frame frame = leap.frame(); 40 HandList hands = frame.hands(); 41 int h = hands.count(); 42 43 if (0 < h) { 44 x = int(random(n)); 45 println(x); 46 47 if (0 < video[x].time()) { 48 video[x].jump(0); 49 } 50 video[x].play(); 51 } 52 } 53 ps.addParticle(); 54 ps.run(); 55} 56 57void movieEvent(Movie video){ 58 video.read(); 59}
該当のソースコード②
Processing
1class Particle { 2 PVector position; 3 PVector velocity; 4 PVector acceleration; 5 float lifespan; 6 float lifespan2; 7 float Size = random(0, 10); 8 9 Particle(PVector l) { 10 acceleration = new PVector(0, 0.05); 11 velocity = new PVector(random(-5, 5), random(-5, 5)); 12 position = l.copy(); 13 lifespan = 300.0; 14 lifespan2 = 60.0; 15 } 16 17 void run() { 18 update(); 19 display(); 20 } 21 22 void update() { 23 velocity.add(acceleration); 24 position.add(velocity); 25 lifespan -= 10.0; 26 lifespan2 -= 2.0; 27 } 28 29 void display() { 30 Frame frame = leap.frame(); 31 HandList hands = frame.hands(); 32 iBox = frame.interactionBox(); 33 for(int i = 0; i < hands.count(); i++) { 34 Hand hand = hands.get(i); 35 drawPalm(hand); 36 } 37 } 38 39 void drawPalm(Hand hand) { 40 Vector palmPos = hand.palmPosition(); 41 Vector palmPosNorm = iBox.normalizePoint(palmPos, false); 42 pushMatrix(); 43 translate(palmPosNorm.getX() * width, 44 (1 - palmPosNorm.getY()) * height); 45 stroke(99, 0, 99, lifespan2); 46 fill(c()); 47 ellipse(position.x, position.y, Size, Size); 48 popMatrix(); 49 } 50 51 boolean isDead() { 52 if (lifespan < 0.0) { 53 return true; 54 } else { 55 return false; 56 } 57 } 58 59 color c(){ 60 color c = color(random(30,90), 99, 99, lifespan); 61 return c; 62 } 63}
該当のソースコード③
Processing
1class ParticleSystem { 2 ArrayList<Particle> particles; 3 PVector origin; 4 5 ParticleSystem(PVector position) { 6 origin = position.copy(); 7 particles = new ArrayList<Particle>(); 8 } 9 10 void addParticle() { 11 particles.add(new Particle(origin)); 12 } 13 14 void run() { 15 for (int i = particles.size()-1; i >= 0; i--) { 16 Particle p = particles.get(i); 17 p.run(); 18 if (p.isDead()) { 19 particles.remove(i); 20 } 21 } 22 } 23}
試したこと
フェードをかけると動画まで見えなくなってしまうため、使えませんでした。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/02/18 07:32