|
|
| GxWorld (void) |
| デフォルトコンストラクタ
|
|
| ~GxWorld (void) override |
| デストラクタ
|
|
|
virtual b32 | alloc (u32 meshCount, const GxVector3 &worldAabbMin, const GxVector3 &worldAabbMax, u16 maxHandles, u32 stackAllocatorSize=DYNAMICS_DEFAULT_STACK_ALLOCATOR_SIZE, u32 maxPersistentManifoldPoolSize=DYNAMICS_DEFAULT_MAX_PERSISTENT_MANIFOLD_POOL_SIZE, u32 maxCollisionAlgorithmPoolSize=DYNAMICS_DEFAULT_MAX_COLLISION_ALGORITHM_POOL_SIZE) |
| ワールドのメモリ確保
|
|
virtual void | free (void) |
| ワールドのメモリ解放
|
|
virtual void | prepareCheck (void) |
| 当たり判定チェック前準備
|
|
virtual void | check (void) |
|
virtual void | preUpdate (void) |
| 更新前処理
|
|
virtual void | update (void) |
| 更新処理
|
|
virtual void | postUpdate (void) |
| 更新後処理
|
|
virtual GX_FORCE_INLINE void | registerObject (GxDynamics::GxObject *) |
| ワールドにオブジェクトを登録
|
|
virtual GX_FORCE_INLINE void | banObject (GxDynamics::GxObject *) |
| ワールドからオブジェクトを登録解除
|
|
virtual GX_FORCE_INLINE void | registerConstraint (GxDynamics::GxConstraint *, b32) |
| ワールドに拘束クラスを登録
|
|
virtual GX_FORCE_INLINE void | banConstraint (GxDynamics::GxConstraint *) |
| ワールドから拘束クラスを登録解除
|
|
void | addClass (u32 threadIndex, GxDynamics *pDynamics) |
| クラス登録
|
|
void | detachClass (GxDynamics *pDynamics) |
| クラス削除
|
|
GX_FORCE_INLINE void | setActive (b32 active) |
| アクティブ設定
|
|
GX_FORCE_INLINE b32 | isActive (void) const |
| アクティブ判定
|
|
virtual GX_FORCE_INLINE void | reset (void) |
| ワールドの状態をリセットする
|
|
virtual void | setGravity (const GxVector3 &gravity=GxDynamics::GxWorld::DYNAMICS_GRAVITY) |
| 重力を設定(ワールドに登録されている剛体全てに設定)
|
|
virtual GX_FORCE_INLINE void | setGravity (const f32, const f32, const f32) |
| 重力を設定(ワールドに登録されている剛体全てに設定)
|
|
void | setMaxTimeStep (f32 timeStep=1.0f/60.f, u32 maxIteration=8) |
|
GX_FORCE_INLINE void | setEnableMaxTimeStep (b32 enable) |
| ワールド更新間隔設定を反映可能にする(デフォルト無効)
|
|
virtual GX_FORCE_INLINE void | detachObjectFromWorld (GxObject *) |
| ワールドからオブジェクトをデタッチ
|
|
b32 | setMeshCount (u32 count) |
| メッシュ登録個数設定
|
|
void | freeMesh (void) |
| メッシュリストの解放
|
|
b32 | addMesh (u32 index, GxDynamics::GxObject *pMesh) |
| メッシュをリストに追加
|
|
b32 | eraseMesh (GxDynamics::GxObject *pMesh) |
| メッシュをリストから削除(アドレス指定版)
|
|
GxDynamics::GxObject * | getMesh (u32 index) |
| メッシュアドレスの取得
|
|
constexpr u32 | getMeshCount (void) const |
| メッシュオブジェクト個数の取得
|
|
u32 | getActiveMeshCount (void) |
| アクティブな個数の取得
|
|
u32 | getFreeMeshIndex (void) |
| 空いているメッシュインデックスを取得
|
|
virtual b32 | checkRayClosestVsWorld (GxDynamics::GxRayResult *, const GxVector3 &, const GxVector3 &, GxConditionInformation *=nullptr) |
|
virtual b32 | checkRayClosestVsSingle (GxDynamics::GxRayResult *, GxObject *, const GxVector3 &, const GxVector3 &, GxConditionInformation *=nullptr) |
| 指定オブジェクトとのレイチェック
|
|
constexpr u32 | getListClassCount (void) const |
| リスト個数取得
|
|
b32 | setListClassCount (u32 count) |
| リスト個数設定
|
|
GxArrayClassBase * | getListClass (u32 index) |
| リストの取得
|
|
|
- Note
- 衝突判定の早期回避のためのNxの仕組みです。
内部的には(0x01<<value)として保存されるため
有効な値は 0<= value <32 です。
isNeedCheck()より先に行われ、
GxWorld::setGroupCollision()で設定した結果に基づき詳細計算を省きます。
checkFlagよりも早期に計算を打ち切ることが出来るため、なるべくグループを利用するようにしてください。
デフォルトのグループは0です。
初期状態では全グループが衝突します。
例:
pWorld->setGroupCollision( 1, 2, true );
pWorld->setGroupCollision( 1, 3, false );
pObjectBox->setGroup( 1 );
pObjectSphere->setGroup( 2 );
pObjectCapsule->setGroup( 3 );
とすると、
pObjectBox と pObjectSphere は衝突する
pObjectBox と pObjectCapsule は衝突しない
pObjectSphere と pObjectCapsule は衝突する(特に設定していないので)
|
void | setGroupCollision (u16 group1, u16 group2, b32 isColide) |
| グループの衝突判定を行うか設定
|
|
GX_FORCE_INLINE void | getPropertyList (void *const pValue, u32 index) |
| 再生クラスアドレスの取得
|
|
constexpr void | setPropertyList (const void *const, u32) |
| 再生クラスアドレスの設定
|
|
GX_FORCE_INLINE void | setPropListClassCount (u32 count) |
| リスト個数設定
|
|
void GxDynamics::GxWorld::setMaxTimeStep |
( |
f32 | timeStep = 1.0f / 60.f, |
|
|
u32 | maxIteration = 8 ) |
ワールド更新間隔の最大時間設定
- Note
- 物理計算タイムステップの最大時間と最大繰り返し回数を設定します。 デフォルト値は1.f/60.f[sec]で、getDeltaTime()の戻り値はこの値以上である必要があります。 小さくすると、より細かく計算されるため、挙動は正確になりますが、 計算回数が増えるため重くなります。
設定値を1.f/60.f[sec]、getDeltaTime()の戻り値が2.5f/60.f[sec]だった場合、 物理状態を1.f/60.f[sec]進める計算が2回行われ、 2.f/60.f[sec]進んだ状態になり、残りの0.5f/60.f[sec]は次回に持ち越されます。 このフレームでは特に問題は起こりません。
次のフレームのgetDeltaTime()の戻り値が4.2f/60.f[sec]だった場合、 前のフレームで持ち越された0.5f/60.f[sec]を加え、全部で4.7f/60.f[sec]分のシミュレーションを行いたいのですが、 maxIteration = 3 で設定されていた場合、1.f/60.f[sec]のシミュレーションが3回行われ1.7f/60.f[sec]が次回に持ち越されます。
瞬間的にフレームレートが落ちた場合は、徐々に持ち越し分を消費できるため、問題ありませんが、 継続してフレームレートが落ちている場合は、誤差が積み重なってシミュレーションが破綻するようです。 そのため、timeStep * maxIterationが、なるべくdeltaTimeを下回らないような値に設定してください。
- Parameters
-
timeStep | [in] 最大時間 |
maxIteration | [in] 最大繰り返し回数 |