Springhead Users Manual

7.4 剛体

剛体は物理シミュレーションの基本要素です. 剛体のクラスはPHSolidです. まず剛体を作成・管理するためのPHSceneの関数を示します.

PHSceneIf

PHSolidIf*

CreateSolid(const PHSolidDesc&)

剛体を作成する

int

NSolids()

剛体の数

PHSolidIf**

GetSolids()

剛体配列の先頭アドレス

剛体を作成するには

PHSolidIf* solid = phScene->CreateSolid();

とします.ディスクリプタを指定して作成することもできます. また,GetSolidsは作成した剛体を格納した内部配列の先頭アドレスを返します. したがって,例えば\( 0 \)番目の剛体を取得するには

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()

GetMassInvGetInertiaInvはそれぞれ質量の逆数と慣性行列の逆行列を返します. CompInertiaは,その剛体が持つ形状とそれらの密度をもとに剛体の質量,質量中心と慣性行列を計算し,設定します. dynamicalは,その剛体が物理法則に従うかどうかを指定するフラグです. もしdynamicaltrueの場合,その剛体に加わる力が計算され, ニュートンの運動法則にしたがって剛体の速度が変化します. 一方, dynamicalfalseの場合は外力による影響を受けず,設定された速度で等速運動します. これはちょうど∞の質量をもつ場合と同じです.

状態
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はグローバル座標系に関する剛体の向きを取得/設定します.

力の印加と取得

剛体に加わる力には

\( 3 \)種類があり,それぞれについて並進力とトルクがあります. ここで,重力は重力加速度と剛体の質量より決まり,拘束力は拘 束条件を満たすように内部で自動的に計算されます. 以下ではユーザが剛体に加える外力を設定・取得する方法を示します.

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));

とすると剛体の質量中心に並進力\( (0, -1, 0) \)が加わります.ただし力はグローバル座標系で表現されます. 一方

solid->AddTorque(Vec3d(1.0, 0.0, 0.0));

とすると剛体の質量中心に関してモーメント\( (1, 0, 0) \)が加わります. 作用点を任意に指定するには

solid->AddForce(Vec3d(0.0, -1.0, 0.0), Vec3d(0.0, 0.0, 1.0));

とします.この場合は並進力\( (0, -1, 0) \)が作用点\( (0, 0, 1) \)に加わります. ここで作用点の位置は剛体のローカル座標ではなくグローバル座 標で表現されることに注意してください. AddForceAddTorqueは複数回呼ぶと,それぞれで指定した外力の合力が最終的に剛体に加わる外力となります.

外力を取得するにはGetForceGetTorqueを使います. ただし,これらの関数で取得できるのは直前のシミュレーションステップで剛体に作用した外力です. したがって直前のシミュレーションステップ後にAddForceした力は取 得できません.