BVH 形式のファイルを読んで表示するプログラム (BVH Viewer)
スケルタルアニメーションについて調べる機会があったので、ついでに習作として簡単なプログラムを書きました。
ソースコード
Xcode のプロジェクトを公開します。言語は C++ です。描画には OpenGL を使っています。Mac 向けですが、少ない修正で Windows や Linux でも動かせると思います。
zip 形式でダウンロード
追記 (2018/8/10) リンク切れになっていたので GitHub にて改めて公開しました。Xcode ではなく cmake を使うように修正しました。
GitHub - yuki-koyama/bvh-viewer: [deprecated] A viewer of BVH motion capture data
プログラムの概要
BVH ファイル形式で記述されたモーションキャプチャデータを読み込んで、棒人間を表示するプログラムです。
プログラムはできる限り簡素に書かかれています。レンダリングやインタフェースなどに余計な機能はつけていないので、何をしているかは読めば容易に理解できると思います。(ただし C++ に疎いため、ソースコードは汚いです。)
以下に、メインとなるオブジェクトのクラス定義を掲載しておきます。
class BVHObject { typedef int Index; typedef std::vector<double> Pose; public: std::vector<Joint> joints; std::vector<Channel> channels; std::vector<Pose> motion; std::map<std::string, Index> jointNameToIndex; double interval; int nFrames; // equal to motion.size() int nChannels; // equal to channels.size(); bool ready; std::string name; bool renderingJoint; bool renderingBone; void clear(); void init(std::string fileName); void render(int frameNum); BVHObject(); ~BVHObject(); private: void renderJoint(Index joint, Pose pose); void renderBone(Vector3d position0, Vector3d position1); };
スケルトンは木構造になっているので、レンダリングの際は関数の再起呼び出し (ここでは void renderJoint(Index joint, Pose pose) が再起呼び出しされる) を利用して実装してあります。
また、Pose はあるフレームにおける姿勢を表しており、各 Joint の回転角などの集合 (並び順は BVH ファイル形式に従っている) になっています。Pose をフレーム順に並べたものを motion としています。
動作例
モーキャプデータ
mocapdata.com
というサイトが無料(一部有料)でモーキャプデータを配布しています。これらのデータは自由に複製、頒布、展示、実演をすることができ、また二次的著作物を作成することもできるそうです。
http://mocapdata.com/page.cgi?p=terms_of_use
今回は上記のサイトからモーキャプデータを使わせて頂いています。
また、少し前に話題になります、Perfume のダンスのモーキャプデータが BVH ファイル形式で公開されました。このモーキャプデータを使って棒人間をダンスさせることも可能です。
Perfume Global Lab
実際に棒人間をダンスさせてみました。
参考にしたサイト
配布物に含まれるモーションキャプチャデータは、mocapdata.com, Eyes, JAPAN Co. Ltd. により「クリエイティブ・コモンズ表示 2.1 日本ライセンス」の下でライセンスされています。
使用許諾条件は、mocapdata.com, Eyes, JAPAN Co. Ltd. または http://creativecommons.org/licenses/by/2.1/jp/ にお問い合わせください。
http://mocapdata.com/
(C) Copyright Eyes, JAPAN Co. Ltd. 2008-2009