約1年半前に公開された、例のPerfumeのモーションキャプチャデータを iOS アプリで動かす手順です。
データと一緒に oF のサンプルアプリが既に公開されてるので、それをiOSで動くように改修しつつ、 どんな実装になってるのかざっと把握する という感じで見ていきます。
(完成品のスクショ)

モーションキャプチャデータとサンプルをダウンロード
モーションキャプチャデータは ここ から、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();
}
完成品(動画)
知ったこと/気付いたことのメモ
BVHファイル
モーションキャプチャデータのフォーマットの一種らしい。
BVH ファイル形式とは,Biovision 社が提唱したモーションキャプチャデータファイルフォーマットです.現在,Alias Motion Builder をはじめ,3ds MAX の Character studio,Poser などの様々な商用3Dキャラクタアニメーションソフトでもサポートされています.BVH ファイルの特徴を以下にまとめます.
テキスト形式で記述
- 座標系は右手系.XYZ 各軸の扱い(どの軸が鉛直方向に対応するか等)は任意.
- 関節ノードに関する情報を記述.
- 関節回転はオイラー角形式で記述.
- 回転角度の単位は Degree
- キャラクタのスケルトン階層構造を記述するHIERARCHY部と,動作データを記述するMOTION部の2つから構成
ofBvh
- loadメソッド内で呼んでいる ofToDataPath なるメソッドがとってくるパスをデバッガで追ってみると、MacOSだと ../../../data で、iOSだとバンドル直下だった
- bvhを解釈して、再生するところまでこれでやってくれてるっぽい
- 他のアドオンやライブラリにも依存してなくて、ソースも500行程度
ofEasyCam
初めて知ったのでどういうものなのか今度調べてみる。