先日うちの会社にもやってきました。LeapMotion
leapjs (http://js.leapmotion.com/) を読み込むことでブラウザJSでも使えます。
サンプルもいくつか出てます。↓
http://js.leapmotion.com/examples
ということで、js物理演算ライブラリのbox2dWeb に reap motion を繋いでみます。
指二本で動かします。
ということで要点だけ
参考サイト
box2dwebとleapのjsファイルを読み込む
<script type="text/javascript" src="js/libs/Box2dWeb-2.1.a.3.min.js"></script> <script type="text/javascript" src="js/libs/leapjs/leap.js"></script>
box2dwebの初期化
var world = new this.b2World(
 new this.b2Vec2(0, 20)    //gravity
 ,true                 //allow sleep
);
this.world = world;
 
 //setup debug draw
var b2DebugDraw = Box2D.Dynamics.b2DebugDraw;
var debugDraw = new b2DebugDraw();
debugDraw.SetSprite(document.getElementById("canvas").getContext("2d"));
debugDraw.SetDrawScale(30.0);
debugDraw.SetFillAlpha(0.5);
debugDraw.SetLineThickness(1.0);
debugDraw.SetFlags(b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit);
world.SetDebugDraw(debugDraw);
 
var self = this;
window.setInterval(function(){
 self._update();
}, 1000 / 60);
適当に円をつくる
setInterval(function(){
 self.createCircle();
}, 500);
LeapApp.prototype.createCircle = function(data){
 var fixDef = new this.b2FixtureDef;
 fixDef.density = 1.0;
 fixDef.friction = 0.5;
 fixDef.restitution = 0.2;
 var bodyDef = new this.b2BodyDef;
 bodyDef.type = this.b2Body.b2_dynamicBody;
 fixDef.shape = new this.b2CircleShape(
  Math.random() + 0.1 //radius
 );
 bodyDef.position.x = Math.random() * 20;
 bodyDef.position.y = Math.random() * 5;
 var body = this.world.CreateBody(bodyDef);
 body.CreateFixture(fixDef);
 var ImpulseVec = new this.b2Vec2(10-(Math.random() * 20), - (Math.random() * 10));
 var point = body.GetPosition();
 body.ApplyImpulse(ImpulseVec, point);
 this.circleList.push(body);
};
leapのイベントを拾う
leap.jsをよみこむと Leapがいるのでそいつにコールバックを登録します。
Leap.loop({enableGestures: false}, function(frame){
 self._leapLoop(frame);
});
二本指検出
ここにはいってくる「frame」オブジェクトの解説は
KRAY -JavaScriptでLeapMotionアプリを作る方法-
が分かりやすい。KRAYさんありがとう!
LeapApp.prototype._leapLoop = function(frame){
 // pointable filter 
    var pointables = frame.pointables;
    var pointablesCount = pointables.length;
    if(pointablesCount < 2){
     this.world.DestroyBody(this.fingerLine);
     this.rightFinger.SetActive(false);
     this.leftFinger.SetActive(false);
     return;
 }
    var leftPoint, rightPoint;
    if(pointables[0].tipPosition[0] < pointables[1].tipPosition[0]){
     leftPoint = pointables[0].tipPosition;
     rightPoint = pointables[1].tipPosition;
    }else{
     rightPoint = pointables[0].tipPosition;
     leftPoint = pointables[1].tipPosition;
    }
     this._reloadLine(leftPoint, rightPoint); // ↓
};
leapから取り出した指位置情報をbox2dwebに表示する
LeapApp.prototype._reloadLine = function(leftPoint, rightPoint){
 var rate = 10;
 var baseX = 100;
 var baseY = 250;
 // left
 var leftX = leftPoint[0];
 var leftY = leftPoint[1];
 var leftFinger = this.leftFinger;
 var leftPos = leftFinger.GetPosition();
 leftPos.x = (leftX+baseX) / rate;
 leftPos.y = (30-(leftY - baseY)) / rate;
 leftFinger.SetPosition(leftPos);
 leftFinger.SetActive(true);
 // right
 var rightX = rightPoint[0];
 var rightY = rightPoint[1];
 var rightFinger = this.rightFinger;
 var rightPos = rightFinger.GetPosition();
 rightPos.x = (rightX+baseX) / rate;
 rightPos.y = (30-(rightY - baseY)) /rate;
 rightFinger.SetPosition(rightPos);
 rightFinger.SetActive(true);
 // line
 var lenX = rightPos.x-leftPos.x;
 var lenY = rightPos.y-leftPos.y;
 var lineLen = Math.sqrt(Math.pow(lenX, 2) + Math.pow(lenY, 2));
 var rad = Math.atan2(lenY, lenX);
 var fingerLine = this.fingerLine;
 var linePos = fingerLine.GetPosition();
 this.world.DestroyBody(fingerLine);
 var fixDef = new this.b2FixtureDef;
 var bodyDef = new this.b2BodyDef;
 var shape = new this.b2PolygonShape;
 fixDef.shape = shape;
 shape.SetAsBox(lenX/2, 0.2);
 var fingerLine = this.world.CreateBody(bodyDef);
 fingerLine.SetPosition(linePos);
 fingerLine.CreateFixture(fixDef);
 this.fingerLine = fingerLine;
 var linePos = fingerLine.GetPosition();
 linePos.x = leftPos.x + lenX/2;
 linePos.y = leftPos.y + lenY/2;
 fingerLine.SetPositionAndAngle(linePos, rad);
};
以上です。
まとめ
良いと思います。
今回はbox2dWebの実装がちょっと長くなってしまいましたが、LeapMotion のところだけで見ると
leap.jsを読み込んで Leap.loop(op, func); でコールバックを登録するだけで指情報が取得できます。
デバイスが必要になるので一般のwebサイトで使用する機会はあまりないかもしれませんが、キャンペーンページみたいなものでちょっと変わったことしたい、ってときには使えるんじゃないでしょうか。
ネイティブアプリのSDKにもjavascriptを選択できるようです。
LEAP Developer -documentation-
やっぱりこーなるとiphoneアプリとつなげたいですね。
appleさん頑張ってー、使えるようにしてー。
もうleap を買収しちゃえ
jsの開発環境はクロムが最強な気がします。何よりも手軽。
こないだ書いた cocos2dx javascript Bindings みたいなのも出てるし
クロムで開発してそのままネイティブへ移行
的なフローが早く確立しますように。
そんなLeapMotionに興味のある(なくてもOK)デザイナー募集中!
現在スバコラボではデザイナーを【爆裂】で【激求】しています。
お気軽にご応募ください
ご応募はこちらから
 
 
 
0 件のコメント:
コメントを投稿