デジタルな日々

ProcessingでLeapMotionその2


さて、前回のつづき

 

前回はProcessingでボールが湧いてくるサンプルとLeapMotionのサンプルをくっつけようとしたんだけどありゃあ無理だったぜ…

 

なぜか三角錐になる手

 

とりあえず手を球体で出したかったんだけどボールのと干渉しちゃって三角錐になるわ、LeapMotionはカメラ位置と連動しないわ、そもそも手をボールに触らせる方法がわからないわ、なかなかうまくいかなかった

 

BRigidはそもそも使い方が見つからなくてサンプルを読んで推測するしかなかったんだよね…
手をBRigidの物体で表現できればなんとかなるのになあ…まだ勉強が足りないや

 

とりあえず作ったものを発表できる状態にしなければならなかったので、簡単なものからやってみることにした。

 

(でも悔しいのでいつかリベンジしてやる!!)

 

 

で、手を振って壁をぶっ壊すプログラムを作ることにした

 

ドカーンバリーン

※画像はイメージです

 

なぜそんなものを作ろうとするのかというと、BRigidのサンプルでレンガの壁のようなものがあったからだ!

 

Brigidサンプル壁

 

このサンプルではスペースキーを押すと…

 

BRigidサンプル壁回る

 

このようにクイッとレンガが回転して…

 

BRigidサンプル壁崩れる

 

崩れるのだ!!

 

 

そしてLeapMotionのサンプルにスワイプ動作を感知するプログラムがあるので、それを組み合わせればスワイプで壁を崩すことができる!!

 

 

そして、できた!!!

 

ひぐちカッター1

 

手を振ると「ひぐちカッター!」と表示され壁が崩れる。
さらに改良して、レンガの角度が変わるのではなく手を振った場所に新しいレンガを出現させるようになったのでよりダイナミック!

 

ひぐちカッター2

 

「ひぐちカッター!!!」
「ドゴオオオオオオ!!!」

 

「手を振った場所に新しいレンガを出現させる」ようにしたつもりだったけど、ちゃんと手の場所からレンガが飛んで行ってるんみたいなんだよね、なぜだろう

 

でもむしろそうしたかったので有難い。なにはともあれ大成功!と言いたいところだが…

 

 

 

ひぐちカッター3

 

ギャーー!!めっちゃクラッシュする!

 

処理が重いのかな…

 

上にある全部レンガを崩せたのはいい方でたいていの場合1回ひぐちカッターするとクラッシュしてしまう。
運が悪いと何も出来ずに止まってしまう…

 

 

う〜ん、コードの書き方が悪いんだろうなあ…
頑張ります…

 

 

次はUnityの使い方を覚えつつUnityでLeapMotionを使ってみたいと思います

 

ProcessingでLeapMotionその1

UnityでLeapMotion

 

壁を壊す奴のソースコード
import com.leapmotion.leap.CircleGesture;
import com.leapmotion.leap.Gesture.State;
import com.leapmotion.leap.Gesture.Type;
import com.leapmotion.leap.Hand;
import com.leapmotion.leap.KeyTapGesture;
import com.leapmotion.leap.ScreenTapGesture;
import com.leapmotion.leap.SwipeGesture;
import com.onformative.leap.LeapMotionP5;

LeapMotionP5 leap;

import javax.vecmath.Vector3f;
import peasy.*;
import bRigid.*;

PeasyCam cam;

// physics engine
BPhysics physics;

int numRots =0;

float sizeX = 35;
float sizeY = 5;
float sizeZ = 20;

public void setup() {
//size(1280, 720, P3D);
size(600, 600, P3D);
frameRate(30);

cam = new PeasyCam(this, 280);

// create a physics engine for rigid bodies
physics = new BPhysics();
// set direction of Gravity
physics.world.setGravity(new Vector3f(0, 30, 0));

// create a ground plane: 1st Vector: position, 2nd Vector: direction
BPlane ground = new BPlane(new Vector3f(0, 100, 0), new Vector3f(0, -1, 0));
physics.addPlane(ground);

for (int i = -5; i < 5; i++) { for (int j = 0; j < 30; j++) { BBox box = null; if (j % 2 == 1) { // create a rigid box BBox(PApplet, mass, position, scale) box = new BBox(this, 200, sizeX - .1f, sizeY - .1f, sizeZ - .1f); // move box box.setPosition(i * sizeX*1.15f, -j * sizeY+100, 0); } else { box = new BBox(this, 200, i * sizeX*1.15f + sizeX * .5f, -j * sizeY+100, 0, sizeX - .1f, sizeY - .1f, sizeZ - .1f); } box.rigidBody.setRestitution(.06f); box.rigidBody.setFriction(.9f); physics.addBody(box); } } textSize(17); leap = new LeapMotionP5(this); } public void draw() { background(255); lights(); physics.update(); physics.display(50,50,50); fill(0); for (Hand hand : leap.getHandList()) { PVector handPos = leap.getPosition(hand); ellipse(handPos.x, handPos.y, 20, 20); } if (leap.isEnabled(Type.TYPE_SWIPE)) { leap.disableGesture(Type.TYPE_SWIPE); } else { leap.enableGesture(Type.TYPE_SWIPE); } } /* public void swipeGestureRecognized(SwipeGesture gesture) { if (gesture.state() == State.STATE_STOP) { println("ひぐちカッター!!"); if (gesture.state() == State.STATE_STOP) { int count = 0; for (BObject box : physics.rigidBodies) { box.setRotation(new Vector3f(0, 1, 0), count*.0005f* numRots); count ++; } numRots ++; } } else if (gesture.state() == State.STATE_START) { } else if (gesture.state() == State.STATE_UPDATE) { } } */ public void swipeGestureRecognized(SwipeGesture gesture) { if (gesture.state() == State.STATE_STOP) { println("ひぐちカッター!!"); if (gesture.state() == State.STATE_STOP) { int count = 0; for (BObject box : physics.rigidBodies) { for (Hand hand : leap.getHandList()) { PVector handPos = leap.getPosition(hand); BBox box2=null; box2 = new BBox(this, 200, sizeX, sizeY + 50, sizeZ); box2.setPosition(handPos.x,handPos.y, 0); box2.rigidBody.setRestitution(.06f); box2.rigidBody.setFriction(.9f); physics.addBody(box2); } count ++; } numRots ++; } } else if (gesture.state() == State.STATE_START) { } else if (gesture.state() == State.STATE_UPDATE) { } }

コメントを残す