OROCHI
 
Loading...
Searching...
No Matches
GxDynamics::GxWorld Class Reference

GxDynamics 基本ワールドクラス More...

#include <GxDynamics.h>

Inheritance diagram for GxDynamics::GxWorld:
Collaboration diagram for GxDynamics::GxWorld:

Public Member Functions

初期化
 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::GxObjectgetMesh (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)
 リスト個数設定
 
GxArrayClassBasegetListClass (u32 index)
 リストの取得
 

定義

static const GxVector3 DYNAMICS_GRAVITY
 重力
 
 GX_RTTI_CLASS (GxDynamics::GxWorld, gx::core::GxClassBase)
 
 GX_OPERATOR_NEW_DELETE (GxAllocatorList::ALLOCATOR_TYPE::PHYSICS)
 
 GX_PROHIBIT_CLASS_BASE (GxWorld)
 

メンバ変数

GxArrayClassBase _dynamicsList
 GxDynamicsクラスを記憶するリスト
 
b32 _enableMaxTimeStep
 外部からシミュレーション設定を有効にする

 
f32 _timeStep
 タイムステップの最大時間
 
u32 _maxIteration
 最大繰り返し回数
 
u32 _groupCollide [32]
 ワールドに設定された、グループ同士の衝突判定の有無を保持する。
 

グループ関連

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)
 リスト個数設定
 

Detailed Description

GxDynamics 基本ワールドクラス

Member Function Documentation

◆ addClass()

void GxDynamics::GxWorld::addClass ( u32 threadIndex,
GxDynamics * pDynamics )

クラス登録

Parameters
threadIndex[in] スレッドインデックス
pDynamics[in] 登録する物理オブジェクト
container[in] 登録するノード
Here is the caller graph for this function:

◆ addMesh()

b32 GxDynamics::GxWorld::addMesh ( u32 index,
GxDynamics::GxObject * pMesh )

メッシュをリストに追加

Parameters
index[in] 登録したいリストのインデックス番号
pMesh[in] リストに登録する背景当たり
Returns
成功ならtrue
Here is the call graph for this function:
Here is the caller graph for this function:

◆ alloc()

b32 GxDynamics::GxWorld::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

ワールドのメモリ確保

Parameters
meshCount[in] 背景当たり最大登録個数
worldAabbMin[in] ワールドの広さ(最小値)
worldAabbMax[in] ワールドの広さ(最大値)
maxHandles[in] 当たり判定オブジェクト個数
stackAllocatorSize[in] スタックアロケーターサイズ
maxPersistentManifoldPoolSize[in] 汎用的な最大プールサイズ
maxCollisionAlgorithmPoolSize[in] コリジョンアルゴリズム用最大プールサイズ
Returns
成功ならtrue

◆ check()

void GxDynamics::GxWorld::check ( void )
virtual

当たり判定チェック

Note
preUpdate() -> update() -> postUpdate()
Here is the call graph for this function:

◆ checkRayClosestVsWorld()

virtual b32 GxDynamics::GxWorld::checkRayClosestVsWorld ( GxDynamics::GxRayResult * ,
const GxVector3 & ,
const GxVector3 & ,
GxConditionInformation * = nullptr )
inlinevirtual

登録されている全オブジェクトとのレイチェック(最も近い交差点)

Note
Nxには3種類のレイチェックが存在し、軽い順に 1.当たるかどうかだけみる。 raycastAnyShape() 2.一番近いヒット結果を得る。 raycastClosestShape() 3.貫通する全てのヒット結果を見る。 raycastAllShapes()

この関数は、GxConditionInformationに_checkFlagを指定していない場合は2を利用します。 特定の形状とのみチェックしたい場合は_groupFlagを指定してください。

GxConditionInformationに_checkFlagを指定した場合は3を利用します。 指定しない場合より動作は遅くなりますが、より柔軟にチェックの有無を決定できます。 メッシュ形状に対するレイチェックで、特定の三角形にをパスしたい、等の場合は オブジェクト単位で指定する_groupFlagでは対応できないので、_checkFlagを利用してください。

◆ detachClass()

void GxDynamics::GxWorld::detachClass ( GxDynamics * pDynamics)

クラス削除

Parameters
pDynamics[in] 削除する物理オブジェクト
Here is the call graph for this function:
Here is the caller graph for this function:

◆ eraseMesh()

b32 GxDynamics::GxWorld::eraseMesh ( GxDynamics::GxObject * pMesh)

メッシュをリストから削除(アドレス指定版)

Parameters
pMesh[in] リストから削除したい背景当たりのアドレス
Returns
成功ならtrue
Here is the call graph for this function:

◆ getActiveMeshCount()

u32 GxDynamics::GxWorld::getActiveMeshCount ( void )

アクティブな個数の取得

Returns
メッシュオブジェクトの個数

◆ getFreeMeshIndex()

u32 GxDynamics::GxWorld::getFreeMeshIndex ( void )

空いているメッシュインデックスを取得

Returns
メッシュインデックス

◆ getListClass()

GxArrayClassBase * GxDynamics::GxWorld::getListClass ( u32 index)

リストの取得

Parameters
index[in] インデックス
Returns
リスト
Here is the caller graph for this function:

◆ getMesh()

GxDynamics::GxObject * GxDynamics::GxWorld::getMesh ( u32 index)

メッシュアドレスの取得

Parameters
index[in] 取得したい背景当たりのインデックス
Returns
登録されている背景当たり

◆ postUpdate()

void GxDynamics::GxWorld::postUpdate ( void )
virtual

更新後処理

Note
物理演算のワールド更新を行った後に呼ばれる。 物理演算の計算結果を、ユニットに渡す。

◆ preUpdate()

void GxDynamics::GxWorld::preUpdate ( void )
virtual

更新前処理

Note
物理演算のワールド更新を行う前に呼ばれる。 ポジション、クォータニオン、スケールをユニットから受け取って物理演算用剛体に反映させる。
Here is the call graph for this function:

◆ setGravity()

void GxDynamics::GxWorld::setGravity ( const GxVector3 & gravity = GxDynamics::GxWorld::DYNAMICS_GRAVITY)
virtual

重力を設定(ワールドに登録されている剛体全てに設定)

Parameters
gravity[in] 重力

◆ setGroupCollision()

void GxDynamics::GxWorld::setGroupCollision ( u16 group1,
u16 group2,
b32 isCollide )

グループの衝突判定を行うか設定

Parameters
group1[in] グループ。有効値は 0 <= group < 32。
group2[in] グループ。有効値は 0 <= group < 32。
isCollide[in] falseにすると、group1とgroup2のオブジェクトの判定は行われない

◆ setListClassCount()

b32 GxDynamics::GxWorld::setListClassCount ( u32 count)

リスト個数設定

Parameters
count[in] リスト個数
Returns
成功ならtrue
Here is the caller graph for this function:

◆ setMaxTimeStep()

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] 最大繰り返し回数

◆ setMeshCount()

b32 GxDynamics::GxWorld::setMeshCount ( u32 count)

メッシュ登録個数設定

Parameters
count[in] 背景当たりの個数
Returns
成功ならtrue

The documentation for this class was generated from the following files: