先日うちの会社にもやってきました。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 件のコメント:
コメントを投稿