プログラムの開発
開発の準備
リンクするライブラリ
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のすべての機能をサポートしているわけではないので、現段階ではマクロで起動しないようにしています。今回のサンプルではハードウェアでも動作する範囲の命令しか使ってませんが、念のため今回はそのままではハードウェアでは動かないようにしておきます。
