シーンは物理シミュレーションを行う環境を表します. 複数のシーンを作成できますが,シーン同士は互いに独立しており,ユーザが直接橋渡し処理をしない限りは影響を及ぼしあうことはありません. シーンクラスは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はシーン作成後にシミュレーションした累積ステップ数です. countとtimeStepの積が経過時間を表します.
gravityは重力加速度ベクトルです.
airResistanceRateは,シミュレーションの安定性を向上するために毎ステップに各剛体の速度に掛けられる係数です. 例えばairRegistanceRateがであればステップごとに速度が%になります. このように強制的に減速をかけることで,精度を犠牲に安定性を得ることができます.
numIterationは,拘束力を計算するために内部で実行されるアルゴリズムの反復回数です. 一般に,反復回数に関して指数関数的に拘束力の精度が向上し,計算コストは比例的に増大します.