トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

物理時間を進める_PhysX

物理時間を進める (2006/09/20 更新)

形状(アクター)を物理空間に配置したら、次は時間を進めます。時間が進まないことには、いつまで経っても物体は不動のままです。

float dt;

// 1/60秒時間を進める
dt = 1.0f / 60.0f;
g_pScene->simulate(dt);

// ここでアクター情報を取得して描画する、
// 逆にアクターの位置や回転行列を変更する、などの
// アクションを行う
// ...

// シーン内のアクターの変更を促す
g_pScene->flushStream();
g_pScene->fetchResults(NX_RIGID_BODY_FINISHED, true);

上記のソースのように「simulate」「flushStream」「fetchResults」を呼び出すことにより、simulateで指定した時間が進みます。flushStream / fetchResultsは結果を確定する、みたいな役目でしょうか。simulateの呼び出しだけでは時間は進まない点に注意してください。

なお、元々不動(static)な物体をcreateActorで追加した場合は、そのアクター自身は動きません。動くアクターはダイナミックの指定をしたもの(NxActorDescのbodyに対してNxBodyDescを指定したもの)だけです。

もっと正確に計算させる

PhysXでの内部計算は、基本的に近似で時間を進めていると言えます。ニュートンの「x = Vo*t - 0.5*g*t^2」で調べた移動距離とPhysXの結果を比べてみると、誤差が出ていることが判断できるかと思います。1/60秒単位での誤差が少ない場合でも、これが何ミリ秒も何秒も積もり積もれば移動距離が数メートルずれていた、なんてことが起こりえます。

これの誤差をより正確に求めるには反復回数を多くすることになります。けどそれだけ計算時間がかかります。

g_pScene->setTiming((float)(1.0 / 60.0), 20);

「NxScene::setTiming」にて、指定の時間経過を何分割して計算させるか、というのを指定することができます。この場合は、1/60秒を20分割して計算させる、という指定になります。デフォルトでは1/60秒を8分割しています。

初期化処理にて、このsetTiming呼び出しで目的にあわせた適度な分割数を指定するとよいでしょう。

Future's Laboratory 技術格納庫 2004-2013 Yutaka Yoshisaka.