Vimeo.ご無沙汰してます、Takepepeです。世間は梅雨、ついにクーラーをかけながらデモムービーを撮る季節に突入しました。月1更新になってしまった今日このごろ。反省しないと!さて、今日は動画のとおり、Leapを使ってお絵描きするインスタレーションをProcessingで作成しました。今回のキモはLeapSDKをラップしているライブラリから提供される標準のジェスチャーや座標を、意図した値に変換するところです。https://github.com/mrzl/LeapMotionP5コードはEclipseで書いていますので、このままProcessingのIDEにはっつけても動かないのでご注意を。OPENGLの恩恵を受けていないコードですが、レンダリングモードをOPENGLにしています。EclipseでProcessingを書く場合、OPENGLの使用にはcore.jarだけではなく他にも入れないといけない.jarがありますので適当にググってください。いつもの様に、順をおって解説していきます。LeapPointerP5の作成Box2Dの初期設定LeapPointerP5の座標をBox2Dに落とし込む両手の状態で描画判定1.LeapPointerP5の作成P001っていうのはPAppletを継承したやつです。コンストラクタに引数として渡して保持しておけば、Processingの便利APIを外からでも使用できます。update()は、そのP001からdraw()内で呼ばれるループ関数です。このクラスは、冒頭で述べたキモにあたる部分を担っています。前回解説したとおり、LeapはFrameオブジェクトからpointable(指か棒)を取得できますが、これらをロストした時のカバーを自分でやらなければいけません。今回のインスタレーションでは、ポインターを1つに限定しています。getPointable()でそのポインターを固定する処理をして、ポインターが属する手と反対側の手が「グー」なら「つかんでいる」状態というのをpublicなisGrabbed()から参照出来るようになっています。前のフレームで取得したPointableがある場合、前フレームで取得したPointableを返す。無ければ新しいPointableを返す。pointableの手を格納。描画している手と反対側の手が存在しつつ、その手がグーの時trueを返す。res;}}2.Box2Dの初期設定ここからはPAppletのコードです。Box2Dはあんまり新しくはなく、日本語のドキュメントがかなり少ないため苦戦しました。Physicsという、ProcessingでBox2Dを使用するためのインスタンスを生成し、それに対して、jbox2dのクラス群を利用していく感じになります。createPointerBody()ではLeapPointerP5で定義した座標をBox2D上に落とし込むためのインスタンスを生成しています。LeapPointerP5の座標を用いたpointerBodyを生成。physics.getSensor();pointerBody.createShape(pointerCircleDef);pointerBody.setMassFromShapes();updatePointerBody();}3.LeapPointerP5の座標をBox2Dに落とし込む以下のupdatePointerBody()はdraw()内でコールされている関数です。getColor()は、フレームにあわせて虹色を返してくれる関数です。描画中は描画が始まった段階のpalletColorを使用。描画中でない時は随時描画色を更新。Box2Dの座標系に変換しつつpointerBodyを移動。Vec2(x,y));}4.両手の状態で描画判定LeapPointerP5で反対の手が「グー」と判定された場合、描画中になります。描画が終了し、verticesを使用したCircleが新しいbodyとして追加されます。描画中であれば、ProcessingのAPIでラインを描く。描画が開始した時の処理。