プログラムの開発
開発の準備
リンクするライブラリ
dxerr.lib dxguid.lib d3dx9d.lib d3d9.lib winmm.lib comctl32.lib PhysXLoader.lib
dxerr.lib dxguid.lib d3dx9.lib d3d9.lib winmm.lib comctl32.lib PhysXLoader.lib
今回のサンプルでは以上のライブラリをリンクしています。「PhysXLoader.lib」というライブラリがPhysX SDKに含まれているライブラリになります。
インクルードファイル
#include <NxPhysics.h> #include "ErrorStream.h"
今回の記事で追加したのがこの2つです。
「NxPhysics.h」は、PhysXの処理の基本的な関数やクラスを呼び出すためのヘッダーファイルです。
「ErrorStream.h」は、PhysXの関数の中でエラーが起きた場合にレポートを返す処理のためのものです。
マクロ
#define NOMINMAX // Inhibit the macros: min(a,b) and max(a,b)
「dxstdafx.h」内に上記のマクロを追加しました。これは必ず、「Windows.h」をインクルードする前に記述してください。
#undef random
グローバルでの記述
// PhysX関連 NxPhysicsSDK *g_pPhysicsSDK = NULL; // PhysX NxScene *g_pScene = NULL; // シーン NxVec3 g_vGravity( 0.0f, -9.81f, 0.0f ); // 重力 ErrorStream g_errorStream; // エラー処理 BOOL g_bHW = TRUE; // ハードウェアがささってるかどうか BOOL g_bPause = FALSE; // シミュレーションのON、OFF INT g_iActor = 0; // アクター数
今回のサンプルで追加した記述です。
Nx~ではじまるクラスや構造体はPhysXのクラスや構造体です(PhysXはNovodeXという名称だった時代があるのですが、その時の名残です)。
NxPhysicsSDK
がPhysXのランタイムの確認やシーンの生成などに使うクラスです。Direct3Dでいえば、IDirect3D9のようなもので、初期化時にインスタンスを取得し、シーン生成などに使います。
NxScene
はシーンクラスです。シーンとは物理処理が行われる仮想的な空間だと思ってください。シーンは、複数生成することができますので、ゲームならステージごとにシーンを切り替えることなどができます。PhysXハードウェアを使う場合、同時に生成できるシーン数に上限があるので注意してください。
初期化
HRESULT InitPhysX() { HRESULT hr = S_OK; HINSTANCE hInst; // PhysXの初期化 g_pPhysicsSDK = NxCreatePhysicsSDK( NX_PHYSICS_SDK_VERSION, 0, &g_errorStream ); if( !g_pPhysicsSDK ) return E_FAIL; // ハードウェアバージョンの取得 NxHWVersion HWVersion = g_pPhysicsSDK->getHWVersion(); // ハードウェアが見つからない if(HWVersion==NX_HW_VERSION_NONE) g_bHW = FALSE; // g_pPhysicsSDK->setParameter(NX_MIN_SEPARATION_FOR_PENALTY, -0.1f); // シーンの作成 NxSceneDesc sceneDesc; sceneDesc.gravity = g_vGravity; // ハードウェアがあるならハードウェアでシミュレーション #ifdef USE_HARDWARE if(g_bHW) { sceneDesc.simType = NX_SIMULATION_HW; sceneDesc.hwSceneType = NX_HW_SCENE_TYPE_RB; } #endif g_pScene = g_pPhysicsSDK->createScene( sceneDesc ); return hr; }
この関数でPhysXの初期化処理を行っています。
まずは、NxCreatePhysicsSDK
でPhysXのランタイムがあるかどうかチェックしてSDK
クラスのインスタンスを得ます。
次にPhysXハードウェアがささっているかチェックしています。ハードウェアが見つからない場合、g_bHW
がFALSEになります。
続いて、シーンの生成ですが、sceneDesc
は今回は重力だけセットして、後は初期値を使います。g_pPhysicsSDK->createScene
で生成ができます。
#ifdef USE_HARDWARE
でハードウェアを使うかどうかをチェックしているところがあります。通常なら、g_bHW
でチェックした時点でハードウェアで起動するかどうかを決めればいいのですが、PhysXハードウェアは必ずしもSDKのすべての機能をサポートしているわけではないので、現段階ではマクロで起動しないようにしています。今回のサンプルではハードウェアでも動作する範囲の命令しか使ってませんが、念のため今回はそのままではハードウェアでは動かないようにしておきます。