Direct3DアプリケーションにAGEIA PhysXエンジンを導入する
高橋 誠史 [著] 2006/11/29 00:00
このエントリーをはてなブックマークに追加

ソースコード 480.55 KB
バイナリファイル 158.19 KB
1 2 3 4 →

CPUやGPUの進歩で3Dゲームの演出は年々リッチになってきています。演出のリッチ化は単純に画質追求だけでなく、物理やAIなどのゲームのバックグラウンドで動く処理に関しても起きています。本記事では、力学や流体などの物理の処理を3Dのゲームに取り入れやすいように整備された物理エンジンの導入方法を解説します。物理エンジンはさまざまなものがありますが、ここではAGEIAのPhysXを使い、簡単なサンプルを紹介します。

はじめに

 PCのスペックの向上によって3Dゲームでは力学(衝突処理やアニメーションで利用します)や流体(水などの液体の表現に利用します)などの物理を使った演出がよく使われるようになってきました。物理をゲームを取り入れる際に、力学や流体のモデルを元に3Dのオブジェクトの制御用のプログラムを組み込むわけですが、ゲームでは物理の処理だけにCPUなどの計算リソースを取られるわけにはいかないので、品質とパフォーマンスのバランスをとるのはなかなか手間がかかる仕事です。そこで、そうした処理を楽にしてくれるライブラリが物理エンジンになります。

 物理エンジンには、今回の記事で紹介するAGEIA社のPhysXの他にオープンソースのOpen Dynamics Engine(ODE)やHavokと言ったものがあります。AGEIA PhysXが他の物理エンジンと違って特徴的なのは、PhysXハードウェアという専用のPCI接続のボードに物理の演算をさせることができる点です。物理の演算を専用のボードにやらせるメリットは、命令セットが物理演算に最適化されているため高速化が見込まれること、CPUが物理演算をしないため負荷分散できることにあります。

PhysXハードウェアの写真
PhysXハードウェアの写真

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のランタイムは下記のドライバをインストールしてください。ドライバという名称ですが、ソフトウェアで実行する場合でもこちらを入れます。

 上記は、ソフトウェアの動作要件ですが、ハードウェアの要件としては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を利用しています。


1 2 3 4
→
INDEX
物理エンジンを使ってDirect3Dアプリケーションをつくる
Page1
はじめに
AGEIA PhysXがサポートする処理
対象読者
必要な環境
サンプルについて
準備
プログラムの開発
各処理の作成(1/2)
各処理の作成(2/2)
おわりに
こちらの関連記事もおすすめです

プロフィール
高橋 誠史 タカハシ マサフミ

僻地の大学院生です。

GPUプログラミングとそのニュースを集めたサイトShader.jpを開いています。


記事へのコメント・トラックバック機能は2011年6月に廃止させていただきました。記事に対する反響はTwitterやFacebook、ソーシャルブックマークサービスのコメントなどでぜひお寄せください。