その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

PerfumeのモーションキャプチャデータをiOSアプリ内で動かしてみる

話題に遅れること1年半、例のPerfumeのモーションキャプチャデータを動かすことをやってみようと思います。


といっても、データと一緒に oF のサンプルアプリが既に公開されてるようなので、それを試しつつ、iOSで動くように改修しつつ、 どんな実装になってるのかざっと把握する という感じで見ていきます。


(完成品のスクショ)


ちなみに、openFrameworks Advent Calendar 2013 - Qiita の13日目の記事になります。

モーションキャプチャデータとサンプルをダウンロード

モーションキャプチャデータはこっちから、oFサンプルはここからダウンロードできます。

サンプルアプリのビルド

適当なサンプルプロジェクトを開いて、Base SDKをlatestに変更したのちビルドしてみると、'tr1/memory' file not found エラーが出る。


で、 [header search path] に

/usr/local/Cellar/boost/1.49.0/include

をrecursiveで追加してみると、さらにコアっぽいところからのエラーが大量に湧き出してくる。


何となくこっちに突っ込んでいくと時間を不毛に浪費してしまう気がしたので、方針変更、emptyExampleから自分でサンプルアプリを構築することにしました。

サンプルアプリをつくり直す

emptyExampleからのつくりなおす手順です。せっかくなので、iOS向けにつくります。

1. ofxBvhアドオンの導入
  • ofxBvhフォルダをaddons配下にコピーする
  • ofxBvhをプロジェクトのaddonsグループに追加する
  • ダウンロードしてきた3つのbvhファイルをプロジェクトに追加する
2. testApp.h
  • ofxBvhのヘッダをinclude
#include "ofxBvh.h"
  • メンバ変数追加
vector<ofxBvh> bvh;
ofEasyCam cam;
3. testApp.mm

もとのexample-bvhからコピーします。そんなに長くないので、すぐコピーできるはず。bvh[x].load("xxxx.bvh")のところだけ、ファイル名に合わせて変更します。

void testApp::setup(){	

    ofSetFrameRate(60);
    ofSetVerticalSync(true);
    
    ofBackground(0);
    
    bvh.resize(3);
    
    // setup bvh
    bvh[0].load("aachan.bvh");
    bvh[1].load("kashiyuka.bvh");
    bvh[2].load("nocchi.bvh");
    
    for (int i = 0; i < bvh.size(); i++)
    {
        bvh[i].play();
        bvh[i].setLoop(true);
    }
}

void testApp::update(){

    for (int i = 0; i < bvh.size(); i++)
    {
        bvh[i].update();
    }
}

void testApp::draw(){
	
    glEnable(GL_DEPTH_TEST);
    
    ofEnableBlendMode(OF_BLENDMODE_ALPHA);
    
    cam.begin();
    
    for (int i = 0; i < bvh.size(); i++)
    {
        bvh[i].draw();
    }
    
    cam.end();
}

完成品(動画)

vimeoで見る

実装してて知ったこと/気付いたことのメモ

BVHファイル

モーションキャプチャデータのフォーマットの一種らしい。

BVH ファイル形式とは,Biovision 社が提唱したモーションキャプチャデータファイルフォーマットです.現在,Alias Motion Builder をはじめ,3ds MAX の Character studio,Poser などの様々な商用3Dキャラクタアニメーションソフトでもサポートされています.BVH ファイルの特徴を以下にまとめます.


テキスト形式で記述

  • 座標系は右手系.XYZ 各軸の扱い(どの軸が鉛直方向に対応するか等)は任意.
  • 関節ノードに関する情報を記述.
  • 関節回転はオイラー角形式で記述.
  • 回転角度の単位は Degree
  • キャラクタのスケルトン階層構造を記述するHIERARCHY部と,動作データを記述するMOTION部の2つから構成

tmps.org - このウェブサイトは販売用です! -&nbspTmps リソースおよび情報より)

ofBvh
  • loadメソッド内で呼んでいる ofToDataPath なるメソッドがとってくるパスをデバッガで追ってみると、MacOSだと ../../../data で、iOSだとバンドル直下だった
  • bvhを解釈して、再生するところまでこれでやってくれてるっぽい
  • 他のアドオンやライブラリにも依存してなくて、ソースも500行程度
ofEasyCam

初めて知ったのでどういうものなのか今度調べてみる。