=== モーションキャプチャデータとサウンドの同期再生 === ARの表示にモーションキャプチャデータを使えればと言う話が出ました。 で、http://www.perfume-global.com/ で公開されているBVHデータを使えるか どうか試してみます。 まずは、公開されているキャプチャデータ(BVH)とサウンドを同期してProcessingで再生する ことを試してみます。 ===== データとサンプルコード ===== http://www.perfume-global.com/ からモーションキャプチャデータ(bvh)とサウンド(wav)データを 入手します。また、Processingのサンプルコードもダウンロードします。サンプルコードには、 processingからBVHファイルを読み込むためのライブラリが含まれています。BVHは標準ではProcessingで 読める様にはなっていないので、このライブラリは必須です。 ===== 同期再生のためのスケッチ ===== サウンドとキャプチャデータを同期再生させるために、ダウンロードしたサンプルのスケッチを以下の様に書き換えます。 {{{ #!java import ddf.minim.*; BvhParser parserA = new BvhParser(); PBvh bvh1, bvh2, bvh3; AudioPlayer player; Minim minim; public void setup() { size(1280, 720, P3D); background(0); noStroke(); frameRate(40); bvh1 = new PBvh(loadStrings("kashiyuka.bvh")); bvh2 = new PBvh(loadStrings("nocchi.bvh")); bvh3 = new PBvh(loadStrings("aachan.bvh")); minim = new Minim(this); player = minim.loadFile("Perfume_globalsite_sound.wav"); player.play(); player.loop(); } public void draw() { int currentTime = player.position(); background(color(255,255,128)); //camera float _cos = cos(currentTime / 5000.f); float _sin = sin(currentTime / 5000.f); camera(width/4.f + width/4.f * _cos +200, height/2.0f-100, 550 + 150 * _sin, width/2.0f, height/2.0f, -400, 0, 1, 0); //ground fill(color(0)); stroke(127); line(width/2.0f, height/2.0f, -30, width/2.0f, height/2.0f, 30); stroke(127); line(width/2.0f-30, height/2.0f, 0, width/2.0f + 30, height/2.0f, 0); stroke(255); pushMatrix(); translate(width/2, height/2-10, 0); rotateX(PI); sphereDetail(10); lights(); directionalLight(100, 100, 100, -1, -1, 0); //model bvh1.update(currentTime); bvh2.update(currentTime); bvh3.update(currentTime); bvh1.draw(); bvh2.draw(); bvh3.draw(); popMatrix(); } }}} これで、アニメーションとサウンドが同期して再生されます。肝は、''int currentTime = player.position(); ''で再生音の時間的なポジションを入手して、 アニメーション画像の変更をこの時間でもって指定する '' bvh1.update(currentTime);''ところです。 ==== processing version 3(beta) 対応 ==== 上記のProcessingはProcessingの現行バージョン(2)で動作することを確認しています。 次期バージョンのProcessing 3ではサウンド関係のライブラリが入れ替わっており、Minimライブラリは標準ライブラリから外れています。 代って sound ツールが導入されているようです。色々と試してみて、一応Processing 3でも同期再生ができましたので、参考までにスケッチを載せておきます。 {{{ #!java import processing.sound.*; SoundFile player; BvhParser parserA = new BvhParser(); PBvh bvh1, bvh2, bvh3; public void setup() { size( 1280, 720, P3D ); background( 0 ); noStroke(); frameRate( 40 );//not 30 but 40 bvh1 = new PBvh( loadStrings( "bvhfiles/aachan.bvh" ) ); bvh2 = new PBvh( loadStrings( "bvhfiles/kashiyuka.bvh" ) ); bvh3 = new PBvh( loadStrings( "bvhfiles/nocchi.bvh" ) ); //minim = new Minim(this); //player = minim.loadFile("Perfume_globalsite_sound.wav"); player =new SoundFile(this,"Perfume_globalsite_sound.wav"); //player.play(); player.loop(); } public void draw() { background( 0 ); //camera float _cos = cos(millis() / 5000.f); float _sin = sin(millis() / 5000.f); camera(width/4.f + width/4.f * _cos +200, height/2.0f-100, 550 + 150 * _sin,width/2.0f, height/2.0f, -400, 0, 1, 0); //ground fill( color( 255 )); stroke(127); line(width/2.0f, height/2.0f, -30, width/2.0f, height/2.0f, 30); stroke(127); line(width/2.0f-30, height/2.0f, 0, width/2.0f + 30, height/2.0f, 0); stroke(255); pushMatrix(); translate( width/2, height/2-10, 0); scale(-1, -1, -1); //model bvh1.update( millis() ); bvh2.update( millis() ); bvh3.update( millis() ); bvh1.draw(); bvh2.draw(); bvh3.draw(); popMatrix(); } void stop() { player.stop(); //minim.stop(); super.stop(); } }}}