SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

物理エンジンを使ってDirect3Dアプリケーションをつくる

Direct3DアプリケーションにAGEIA PhysXエンジンを導入する

  • X ポスト
  • このエントリーをはてなブックマークに追加

プログラムの開発

開発の準備

リンクするライブラリ

リンクするライブラリ(Debugビルド向け)
dxerr.lib
dxguid.lib
d3dx9d.lib
d3d9.lib 
winmm.lib
comctl32.lib
PhysXLoader.lib
リンクするライブラリ(Releaseビルド向け)
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の関数の中でエラーが起きた場合にレポートを返す処理のためのものです。

マクロ

dxstdafx.h内に追加したマクロ
#define NOMINMAX // Inhibit the macros: min(a,b) and max(a,b)

 「dxstdafx.h」内に上記のマクロを追加しました。これは必ず、「Windows.h」をインクルードする前に記述してください。

dxstdafx.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ハードウェアを使う場合、同時に生成できるシーン数に上限があるので注意してください。

初期化

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

次のページ
各処理の作成(1/2)

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

高橋 誠史(タカハシ マサフミ)

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/719 2006/11/29 00:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング