はじめに
PCのスペックの向上によって3Dゲームでは力学(衝突処理やアニメーションで利用します)や流体(水などの液体の表現に利用します)などの物理を使った演出がよく使われるようになってきました。物理をゲームを取り入れる際に、力学や流体のモデルを元に3Dのオブジェクトの制御用のプログラムを組み込むわけですが、ゲームでは物理の処理だけにCPUなどの計算リソースを取られるわけにはいかないので、品質とパフォーマンスのバランスをとるのはなかなか手間がかかる仕事です。そこで、そうした処理を楽にしてくれるライブラリが物理エンジンになります。
物理エンジンには、今回の記事で紹介するAGEIA社のPhysXの他にオープンソースのOpen Dynamics Engine(ODE)やHavokと言ったものがあります。AGEIA PhysXが他の物理エンジンと違って特徴的なのは、PhysXハードウェアという専用のPCI接続のボードに物理の演算をさせることができる点です。物理の演算を専用のボードにやらせるメリットは、命令セットが物理演算に最適化されているため高速化が見込まれること、CPUが物理演算をしないため負荷分散できることにあります。
AGEIA PhysXがサポートする処理
PhysX SDKを利用してできる物理の処理をおおざっぱに書くと下記になります。ただし、すべての機能がハードウェアでの高速化に対応しているわけではないので、利用する機能がハードウェアの高速化に対応しているか(もしくは対応しているがどのような制約があるか)はSDKの付属のドキュメントで確認しておく必要があります。
- 剛体アニメーション
- 衝突処理(ボックス、球、カプセル、凸形状、平面、車輪、メッシュ、ハイトマップなど)
- ジョイント
- 流体(パーティクルを使ったもの)
- 布シミュレーション
対象読者
PhysX自体は物理の演算だけを担当するので描画命令は持ちません。ですので、描画にはOpenGLやDirect3Dなどの3D APIを利用します。今回のサンプルではDirect3Dで描画を行うので、Direct3Dプログラミングの基礎的なことが理解できている必要があります。
必要な環境
Visual Studio .NET 2003もしくはVisual Studio 2005、DirectX SDK(DirectX 9.0 October 2006)、AGEIA PhysX SDK 2.6.2
サンプルについて
今回のサンプルでは、下記のようにピラミッド状にボックスが積み上がった状態で、画面にある[BOX](キーボードの[B]でも可)や[SPHERE](キーボードの[S]でも可)といったボタンを押すことで、新しくボックスや球を生成してぶつけます。ボックスや球は衝突判定が行われ、当たり方によって衝突応答が行われます。
マウスの右クリックを押しながら動かすと視点が回転します。ホイールの回転で中心に対して近づいたり離れたりします。
今回のサンプルの動作には、描画にDirect3Dを利用し、物理の演算にPhysXを利用するため、DirectXのランタイムとPhysXのランタイムが必要になります(それぞれSDKがインストールしてあれば大丈夫ですが、SDKをインストールしない場合や配布先で必要になります)。ランタイムは下記からダウンロードすることができます。
PhysXのランタイムは下記のドライバをインストールしてください。ドライバという名称ですが、ソフトウェアで実行する場合でもこちらを入れます。
- AGEIA PhysXドライバ(PhysXハードウェアがない場合のランタイムも兼ねます)
上記は、ソフトウェアの動作要件ですが、ハードウェアの要件としてはDirectX 9.0のプログラマブルシェーダ1.xに対応したGPU(GeForceやRADEONなど)が必要になります。
準備
PhysX SDKはOpenGL、Direct3Dなどの3Dグラフィックス用のAPIから利用ができます。今回の記事では、Direct3Dを利用します。ベースとなっているプログラムは、DirectX SDKに付属するMicrosoftのサンプルのSimpleSampleです。
AGEIA PhysX SDKの用意
AGEIA PhysXのSDKはAGEIAのサイトで開発者登録を行うことでダウンロードができます(登録は無料)。利用に際しては、PCのソフトウェア開発の場合は、非営利・営利ともにライセンス料無料です(Xbox360やPS3といったゲーム機向けのSDKはライセンス契約が必要)。
SDKをダウンロードしたら、インストーラの指示に従ってインストールを行います。
開発環境の用意
SDKがインストールできたら、Visual Studioで使うためにライブラリやインクルードファイルのディレクトリのパスを通します。以下が、そのパスの一覧です(2.6.2のSDKをデフォルトの設定でインストールした場合)。
ライブラリ
- C:\Program Files\Ageia Technologies\AGEIA PhysX SDK\v2.6.2\SDKs\lib\win32\lib\win32\
インクルードファイル
- C:\Program Files\Ageia Technologies\AGEIA PhysX SDK\v2.6.2\SDKs\Foundation\include
- C:\Program Files\Ageia Technologies\AGEIA PhysX SDK\v2.6.2\SDKs\Physics\include
- C:\Program Files\Ageia Technologies\AGEIA PhysX SDK\v2.6.2\SDKs\PhysXLoader\include
DirectX SDKの準備
今回のサンプルでは、DirectX SDKを利用しています。今回は、October 2006のSDKを利用しています。