シーン

シーンは物理シミュレーションを行う環境を表します. 複数のシーンを作成できますが,シーン同士は互いに独立しており,ユーザが直接橋渡し処理をしない限りは影響を及ぼしあうことはありません. シーンクラスはPHSceneで,PHSceneオブジェクトはPHSdkにより管理されます.

PHSdkIf

PHSceneIf*

CreateScene(const PHSceneDesc& desc)

シーンを作成

int

NScene()

シーンの数

PHSceneIf*

GetScene(int i)

シーンを取得

void

MergeScene(PHSceneIf* scene0, PHSceneIf* scene1)

シーンを統合

シーンを作成するには以下のようにします.

PHSceneIf* phScene = phSdk->CreateScene();

引数にディスクリプタを指定することもできます. MergeSceneは,scene1が保有するオブジェクトをすべてscene0に移動した後にscene1を削除します.

シーンは剛体や関節などの様々な構成要素の管理を行うほか,物理シミュレーションに関する設定を行う機能を提供します. 各構成要素の作成についてはそれぞれの節で説明しますので,以下ではシミュレーション設定機能について述べます.

PHSceneDesc

double

timeStep

時間ステップ幅

unsigned

count

シミュレーションしたステップ数

Vec3d

gravity

重力加速度

double

airResistanceRate

空気抵抗係数

int

numIteration

LCPの反復回数

PHSceneIf

double

GetTimeStep()

 

void

SetTimeStep(double)

 

unsigned

GetCount()

 

void

SetCount(unsigned)

 

void

SetGravity(const Vec3d&)

 

Vec3d

GetGravity()

 

void

SetAirResistanceRate(double)

 

double

GetAirResistanceRate()

 

int

GetNumIteration()

 

void

SetNumIteration()

 

timeStepは一度のシミュレーションステップで進める時間幅です. 小さいほどシミュレーションの精度は上がりますが,同じ時間シミュレーションを進めるのにかかる計算コストは増大します.

countはシーン作成後にシミュレーションした累積ステップ数です. counttimeStepの積が経過時間を表します.

gravityは重力加速度ベクトルです.

airResistanceRateは,シミュレーションの安定性を向上するために毎ステップに各剛体の速度に掛けられる係数です. 例えばairRegistanceRate$0.95$であればステップごとに速度が$95$%になります. このように強制的に減速をかけることで,精度を犠牲に安定性を得ることができます.

numIterationは,拘束力を計算するために内部で実行されるアルゴリズムの反復回数です. 一般に,反復回数に関して指数関数的に拘束力の精度が向上し,計算コストは比例的に増大します.