剛体は物理シミュレーションの基本要素です. 剛体のクラスはPHSolidです. まず剛体を作成・管理するためのPHSceneの関数を示します.
PHSceneIf | ||
PHSolidIf* |
CreateSolid(const PHSolidDesc&) |
剛体を作成する |
int |
NSolids() |
剛体の数 |
PHSolidIf** |
GetSolids() |
剛体配列の先頭アドレス |
剛体を作成するには
PHSolidIf* solid = phScene->CreateSolid();
とします.ディスクリプタを指定して作成することもできます. また,GetSolidsは作成した剛体を格納した内部配列の先頭アドレスを返します. したがって,例えば番目の剛体を取得するには
PHSolidIf* solid = phScene->GetSolids()[0]; // get 0-th solid
とします.
つぎに剛体自身の機能を説明します.
PHSolidDesc | ||
double |
mass |
質量 |
Matrix3d |
inertia |
慣性行列 |
Vec3d |
center |
質量中心 |
bool |
dynamical |
物理法則にしたがうか |
PHSolidIf | ||
double |
GetMass() |
|
double |
GetMassInv() |
|
void |
SetMass(double) |
|
Vec3d |
GetCenterOfMass() |
|
void |
SetCenterOfMass(const Vec3d&) |
|
Matrix3d |
GetInertia() |
|
Matrix3d |
GetInertiaInv() |
|
void |
SetInertia(const Matrix3d&) |
|
void |
CompInertia() |
|
void |
SetDynamical(bool) |
|
bool |
IsDynamical() |
|
GetMassInvとGetInertiaInvはそれぞれ質量の逆数と慣性行列の逆行列を返します. CompInertiaは,その剛体が持つ形状とそれらの密度をもとに剛体の質量,質量中心と慣性行列を計算し,設定します. dynamicalは,その剛体が物理法則に従うかどうかを指定するフラグです. もしdynamicalがtrueの場合,その剛体に加わる力が計算され, ニュートンの運動法則にしたがって剛体の速度が変化します. 一方, dynamicalがfalseの場合は外力による影響を受けず,設定された速度で等速運動します. これはちょうど∞の質量をもつ場合と同じです.
PHSolidDesc | ||
Vec3d |
velocity |
速度 |
Vec3d |
angVelocity |
角速度 |
Posed |
pose |
位置と向き |
PHSolidIf | ||
Vec3d |
GetVelocity() |
|
void |
SetVelocity(const Vec3d&) |
|
Vec3d |
GetAngularVelocity() |
|
void |
SetAngularVelocity(const Vec3d&) |
|
Posed |
GetPose() |
|
void |
SetPose(const Posed&) |
|
Vec3d |
GetFramePosition() |
|
void |
SetFramePosition(const Vec3d&) |
|
Vec3d |
GetCenterPosition() |
|
void |
SetCenterPosition(const Vec3d&) |
|
Quaterniond |
GetOrientation() |
|
void |
SetOrientation(const Quaterniond&) |
|
velocity, angVelocity, poseはそれぞれグローバル座標系に関する剛体の速度,角速度,位置および向きを表します. [Get|Set]FramePositionはグローバル座標系に関する剛体の位置を取得/設定します. これに対し て[Get|Set]CenterPositionは剛体の質量中心の位置を取得/設定します. 偏心している剛体はローカル座標原点と質量中心が一致しないことに注意してください. [Get|Set]Orientationはグローバル座標系に関する剛体の向きを取得/設定します.
剛体に加わる力には
• ユーザが設定する外力
• 重力
• 関節や接触から加わる拘束力
の種類があり,それぞれについて並進力とトルクがあります. ここで,重力は重力加速度と剛体の質量より決まり,拘束力は拘
束条件を満たすように内部で自動的に計算されます. 以下ではユーザが剛体に加える外力を設定・取得する方法を示します.
PHSolidIf | ||
void |
AddForce(Vec3d) |
|
void |
AddTorque(Vec3d) |
|
void |
AddForce(Vec3d, Vec3d) |
|
Vec3d |
GetForce() |
|
Vec3d |
GetTorque() |
|
並進力を加えるにはAddForceを使います.
solid->AddForce(Vec3d(0.0, -1.0, 0.0));
とすると剛体の質量中心に並進力が加わります.ただし力はグローバル座標系で表現されます. 一方
solid->AddTorque(Vec3d(1.0, 0.0, 0.0));
とすると剛体の質量中心に関してモーメントが加わります. 作用点を任意に指定するには
solid->AddForce(Vec3d(0.0, -1.0, 0.0), Vec3d(0.0, 0.0, 1.0));
とします.この場合は並進力が作用点
に加わります. ここで作用点の位置は剛体のローカル座標ではなくグローバル座
標で表現されることに注意してください. AddForceやAddTorqueは複数回呼ぶと,それぞれで指定した外力の合力が最終的に剛体に加わる外力となります.
外力を取得するにはGetForce,GetTorqueを使います. ただし,これらの関数で取得できるのは直前のシミュレーションステップで剛体に作用した外力です. したがって直前のシミュレーションステップ後にAddForceした力は取 得できません.