2013/12/16

oF vol.3 ofxAlembicでperfumeの.abcデータを読んでみた


ひさびさのoF記事です。
2011年後半あたりから順次浸透しているalembicですが、
oFにも、alembicを読み書きするためのアドオン、
ofxAlembic」があります。

開発したのは perfume-dev-teamということで、以前にはperfumeの踊りを .bvh で配布していた、あのチームです。

「ofxAlembic」の配布とともに、perfumeのalembicデータも配布されているので、今回はそれをいじいじしてみたいとおもいます。


ちなみにalembicってなに?っていう部分ですが、
ルーカスフィルムとソニーピクチャーズが開発・公開している
3Dシーンデータをやりとりするためのフォーマットです。
つまり映画系出身の技術ですね。
最近では、メジャーなDCCツールではほぼ読み書きがサポートされている気がします。
拡張子「.abc」はAlemBiCの略だとか、AlemBic Cache の略だとか誰かが言っていた気がします(←
詳細は > 【alembic 公式サイト】

さて、oF用のアドオンはこちらから
https://github.com/perfume-dev/ofxAlembic

DLしてaddonフォルダに置いてあげましょう。
中を見てみると、サンプルが4種類用意されているのがわかります。
「objseq」「read」「shader」「write」
objseq以外は、bin/data以下に関連データも用意されています。
ここでは「read」を取り上げてみます。
example-read の /bin/data まで開いたところ
このアドオンに用意されているサンプルは、
もとはaddonフォルダに置かれたまま実行するように作られているので、
appフォルダで作業できないのがちょっと居心地悪い気がします。

oFの projectGenerator をつかって、ofxAlembicを読み込んだ新規プロジェクトを作成します。


名前はabcTestとしました。で、 src と bin/data をexample-readからコピーしてきます。

なにはともあれ、ビルド。
ビルドしたところ
どのabcファイルを読んでいるかは、testApp.cppの16行目に書かれています。
string path = "sample.abc";
bin/data においてある sample.abc が読まれています。

同じフォルダに alembic_test.abc というのも置いてあるので、
そちらを読み込むように書き換えてみましょう。

string path = "alembic_test.abc";
ビルドしてみると……

なにも映りません。

よくソースを見てみると、draw()関数のなかで、abcを取得してofMashに流し込む部分(50行目)がありますが、
そこで、abcファイルの中のパスを指定していることが分かります。
アレンビックキャッシュはジオメトリ等のデータを階層構造をもった状態で保持できます。先ほどのビルドで映るものが無くなったのは、読むファイルを変えたために読みにいく階層が不明になってしまったからですね。

abcファイル内のどのオブジェクトを見るかというpathに関しては、22行目に書かれています。
// show all drawable names
abc.dumpNames();
これによって、abcファイル内のオブジェクトのリストが、Xcodeのデバッグエリアにプリントされます。
sample.abc を読んでいるときはこんな感じ。


これを、alembic_test.abc を読むように書き換えた場合↓

/test っていうオブジェクトがあるだけです。
これにならって、さっきのofMeshに読み込む部分(50行目)を書き換えます。
こんな感じ

abc.get("/test", mesh);
映りました。
こういう感じで、「読み込むファイルのパス」と「ファイルの中のオブジェクトのパス」を指定することで
読みたいabcファイルを換えることが出来ます。

ではやっと本題、
この要領で、配布されているperfumeのalembicファイルを読み込んでみましょう。
http://www.perfume-global.com
なにげにフルフラッシュの恐ろしいサイトです。
(個人的にははやく脱フラッシュが成就してほしい気もしますが…そこはそれ)


早速 /bin/data にファイルを配置し、まずは読むファイルを指定している箇所を書き換えましょう。
例によってこれだけではなにも映りませんが、デバッグエリアにこのファイルのオブジェクトが一覧されます。

/Aa-CHAN
/KASHIYUKA
/NOCCHi

を見つけることができるので、
ofMeshの部分もそれっぽく書き換えます。

書き換え前:
{
ofMesh mesh;
abc.get("/test", mesh);

ofSetColor(255, 0, 0);
mesh.draw();
}

書き換え後:
{
ofMesh A_mesh;
ofMesh K_mesh;
ofMesh N_mesh;
abc.get("/Aa-CHAN", A_mesh);
abc.get("/KASHIYUKA", K_mesh);
abc.get("/NOCCHi", N_mesh);

ofSetColor(255, 0, 0);
A_mesh.draw();
ofSetColor(0, 255, 0);
K_mesh.draw();
ofSetColor(0, 0, 255);
N_mesh.draw();
}

結果:
perfume 映ったよ
尺は約2.4秒ほど、perfumeの三人がちょっと踊って挨拶なさいます。
非常にぽりぽりしておられて「なるほど!?」という感じ。

ofMesh化しているので、あとはof内の3D系のサンプルを見ながら同様にいじっていけばいいのかなとおもいます。
ソースを見ると、ofMesh以外にもポイント(パーティクル)やカーブの描画の仕方もちょっと分かります。
そういえばこのサンプルの最初の .abc ファイルだと、メッシュもポイントもラインも出てましたね。
(ちなみに、そのオブジェクトとは異なった型で受け取ろうとすると、キャスト(型変換)エラーを吐きまくります。)

このあとMographで盛り盛りに出力したジオメトリなんかを読み込んでみようとおもったのですが、
それはまた今度……



0 件のコメント:

コメントを投稿