【C++】DirectXにおける3Dアニメーションプログラミングを分析する~その2

前回、PMDファイルからモデルを、VMDファイルからモーションを読み込んで、自作のウィンドウプログラム上でアニメーションさせるまでやった。

しかし、前回の3Dアニメーションには、致命的な欠点があった。

手足が、衣服のメッシュを突き抜けてしまうのだ。

今回は、物理演算のエンジンを組み込んで、スカートや袖の動きをシミュレートさせてみた。

まずは、動画がこちら。

モデル以外に、物理演算で設定している箱までレンダリングされてしまっているが、それはおいおい修正していくものとして今回は見えないものとしてください。

手足が衣装を突き抜けなくなり、ちゃんと布地のような挙動をするようになった。

それでは、前回のプロジェクトに物理演算エンジンを組み込むまでの手順を整理しておくことにする。

今回も技術的な情報は全て、ニコニコ動画のうp主、mはげさんの動画とサイトを参考にさせていただいた。

mはげ さんの公開マイリスト
うp主のmはげさんのサイト

結構ながい道のりとなったので、概略から述べるとこうなる。

1.物理演算エンジン「Bullet physics library」のソースをゲット。
2.CMakeツールで1のソースからVisualStudio(以下、VS)の「Bullet physics library」ビルド用ソリューションを作成。
3.ソースを若干修正して上記ソリューションをビルドしライブラリを作成。
4.前回のプロジェクトにライブラリとヘッダファイルを追加。
5.前回のプロジェクトの構成を調整して、物理演算部分のソースのコメントをはずしてビルドして完成。

【物理演算エンジン「Bullet physics library」のソースをゲット】
ソースは下記のサイトからダウンロードして展開する。

http://bulletphysics.org/wordpress/

【CMakeツールで「Bullet physics library」ビルド用ソリューションを作成】
落としてきたソースにはVS用のソリューションファイルは添付されていない。(旧バージョンではあったらしい)

日本語のユーザーサイトによると、現行版はCMakeという外部ツールを使って、VSのソリューションファイルを生成してから、ビルドするそうだ。

下記のサイトからCMakeをゲットしてインストール。

http://www.cmake.org/

CMakeの操作はこんな感じ。

CMAKE

①に展開したBulletソースのルートフォルダを指定する。
②にVSプロジェクトを出力する先を指定する。
③の「Configure」をクリックすると、ウィンドウの情報がいろいろ変化するが、男は黙って「Generate」をクリックする。

【ソースを若干修正してBulletライブラリを作成】
実は、俺の環境では生成されたVSプロジェクトはそのままだとビルドエラーが発生した。

なので、エラーが出た箇所を修正してビルド。

修正箇所は以下(あくまで俺の環境ではの話だと思って聞いてください)
■ MiniCLプロジェクト内
 cl_MiniCL_Defs.h
 363行目あたり

関数が二重定義されているみたいなのでコメントアウト

// [WWW.GOGOGOGO.JP] DEL START
/*
static float fmax(float a, float b)
{
	return (a >= b) ? a : b;
}

static float fmin(float a, float b) 
{
	return (a <= b) ? a : b;
}
*/
// &#91;WWW.GOGOGOGO.JP&#93; DEL END
&#91;/csharp&#93;

■ HACDプロジェクト内
hacdICHull.h

std::max<double>(...)が未定義というビルドエラーが出るので、ヘッダファイルに下記を追加
[csharp]
#include <algorithm>

以上、無事ビルドに成功した。

ちなみに、ReleaseビルドとDebugビルドの二回行って、リリース用ライブラリとデバッグ用ライブラリを作成すること。

【前回のプロジェクトにライブラリとヘッダファイルを追加】
前回のプロジェクトのソースフォルダにビルドしたライブラリを全部配置する。
あと、ヘッダファイルも必要なので、こちらは先に展開したBulletのソースフォルダからとってくる。

とってくるヘッダファイルは下記のとおり。

BulletCollisionフォルダごと
BulletDynamicsフォルダごと
BulletMultiThreadedフォルダごと
BulletSoftBodyフォルダごと
LinearMathフォルダごと
MiniCLフォルダごと
vectormathフォルダごと
Bullet-C-Api.h
btBulletCollisionCommon.h
btBulletDynamicsCommon.h

あとは、前回ビルドする際にコメントアウトした物理演算用のコードのコメントをはずしてビルドすれば完了…かと思いきや問題が発生。

リリースビルドは成功するものの、デバッグビルドすると大量のエラーが発生した。

【前回のプロジェクトの構成を調整】
おそらく、Bulletのビルドの際、デバッグビルドの構成が何かしら、組み込み先のビルド構成と異なるので問題が発生しているらしい。

正確な原因は不明だが、とにかくBulletのプロジェクト設定を見ながら、設定の違う部分を探してみた。

CMakeで作ったBulletのデバッグ構成の[C/C++]→[コード生成]が下図のようになっていた。

BULLET_SETTING_DEBUG

ちなみに組み込み先のプロジェクトのデバッグ構成は下図だ。(たぶんデフォルトのままのはず)

MY_SETTING_DEBUG

いくつか異なる点があり、どうも怪しい。

ということで、これらを全部、Bulletのデバッグ構成にあわせてみたところ、見事にビルド成功となった。

ただし、リリース構成もBulletと自分のとで設定は異なるんだけれども、こちらは特に変更なしでもビルドが通っている点が解せない。

これはあくまで俺の推測だけれども、リリース構成ではスタンドアローンで動くようにランタイムオブジェクトも全て抽出されるのに対して、デバッグ構成ではそれがプロジェクト依存になっているのではなかろうかと。

原因は結局よくわからない。誰かわかる人いたら教えてください。

ともあれ、長い道のりだったけれども、一応3Dアニメーションに必要なものが一通りそろったサンプルになったと思う。

これからじっくりソースを解析していこうと思う。

さあ、妖怪ウォッチ2本家でもやるか!(結局買ったんかい)

4年前

コメントを残す

メールアドレスが公開されることはありません。