tech memorandom

Webに関して調査したことや、メディアアート系(Max,Processing)で調査したことなどを書いていきます。

Perfume-Dev Hack

最初はモーションキャプチャーしたデータをサイトで動かすだけかと思いきや、どんどん進化して楽しい感じなっています。perfume-global。そしてそのコードはgithubで公開されています。

現在はVol.4までで登場していてます。Vol.1はモーションをパーティクルで表示しただけだったものが、いくつかのシリーズを得てVol.4はPerfume本人たちのダンスを3次元加工しています。最終的にはやくしまるえつこのサイトでやったように360度まわせるコントローラーでもつけたりするんじゃないかとか期待してしまいます。

PerfumeがGlobal進出するにあたり、世界共通言語であるコードを使って世界を表現し、それを公開することで、言語や文化の障壁を超え話題にしたくなるものをつくりだしたそうとした、そんな意図感じずにはいられません。

Perfume-GlobalのサイトにはPerfumeの声入りの音声は一切流れていませんし、彼女たちの顔すらだしていません。

最初は肖像権や版権の問題かとも思ったのですが、コードつかったプロモーション戦略にそういったものは、むしろないほうがメッセージがストレートに伝わるから、あえてだしてないのかもしれません。いつかはだすでしょうが、それは十分に興味をひきつけたあとになるんじゃないかと想像しています。

その時、どんな音や映像を流すのかちょっと想像できないですが、一流のクリエイター、プロモーターが市場をみて導き出した答えであることは間違いないので、その時にでてくるものと世界の反応を楽しみにしています。

で、大げさなタイトルのHackについてでですが、やったことはパーティクル人間をロボットにしただけです(´・ω・`)
あんまり時間がなかったので手軽なProcessing版でやってました。

p5f_sample.pdeはカメラのアングルとか背景の動きが書かれています。このへんは面倒くさかったので全くさわっていません。音にあわせてカメラとか動かせば楽し感じになったと思いますが、これに時間かけていると怒られるのでやめました。

パーティクルの描画を別のオブジェクトに置き換えるには、PBvh.pdeに手を入れる必要があります。

BvhParserがBVデータを読み込んでくれ、かつデータにアクセスするためのAPIを用意してくれています。
getName()というAPIがあり、これをたたくと、どの部分のBVデータかを取得することができます。
今回は頭をかえてましました。getName()がHEADだったらHeadイメージを描画しています。
BvhParserのJavaDocも公開されており、これをよむと色々できます。

できた動画はこんな感じです。

public class PBvh
{
  public BvhParser parser;
  public PImage img;
  public PImage imgHead;
  
  public PBvh(String[] data)
  {
    parser = new BvhParser();
    parser.init();
    parser.parse( data );
    img = loadImage("robo_head.png");
    imgHead = loadImage("head.png");
    
  }
  
  public void update( int ms )
  {
    parser.moveMsTo( ms );//30-sec loop 
    parser.update();
  }
  
  public void draw()
  {
    fill(color(255));
    
    for( BvhBone b : parser.getBones())
    {
      String head = "Head";
      String name = trim(b.getName());      
      pushMatrix();
      translate(b.absPos.x, b.absPos.y, b.absPos.z);
      image(img, 0, 0);
      popMatrix();
      if (head.equals(trim(b.getName())))
      {
        pushMatrix();
        translate( b.absEndPos.x, b.absEndPos.y, b.absEndPos.z);
        image(imgHead, 0, 0);
        popMatrix();
      }
        
    }
  }
}