|
(a) before connection |
|
(b) after connection |
さて,上の例でディスクリプタに値を設定している箇所に注目してください.この部分で関節の取り付け位置を指定しています. Springheadでは,ソケットとプラグと呼ばれるローカル座標系を用いて関節の取り付け位置を表現します. ソケットとプラグとは,その名前から連想するように,連結する剛体に取り付ける金具のようなものです. CreateJointの第引数の剛体にソケットがつき,第引数の剛体にプラグがつきます. ソケットとプラグがそれぞれの剛体のどの位置に取り付けられるかを指定するのがディスクリプタのposeSocketとposePlugです. 上の例ではソケットの位置が,プラグの位置がでした(Fig. #.#.#(a)). この場合はFig. #.#.#(b)のように剛体が連結されます. 後述するように,ヒンジはソケットとプラグのz軸を一致させる拘束です. したがって連結された剛体同士はソケットとプラグのz軸を回転軸として相対的に回転することができます.
ソケットとプラグに関するディスクリプタとインタフェースを紹介します.
PHConstraintDesc |
||
Posed |
poseSocket |
ソケットの位置と向き |
Posed |
posePlug |
プラグの位置と向き |
PHConstraintIf |
||
PHSolidIf* |
GetSocketSolid() |
ソケット側の剛体 |
PHSolidIf* |
GetPlugSolid() |
プラグ側の剛体 |
void |
GetSocketPose(Posed&) |
|
void |
SetSocketPose(const Posed&) |
|
void |
GetPlugPose(Posed&) |
|
void |
SetPlugPose(const Posed&) |
|
void |
GetRelativePose(Posed&) |
相対的な位置と向き |
void |
GetRelativeVelocity(Vec3d&, Vec3d&) |
相対速度 |
void |
GetConstraintForce(Vec3d&, Vec3d&) |
拘束力 |
GetRelativePoseはソケット座標系から見たプラグ座標系の相対的な位置と向きを取得します. 同様に,GetRelativeVelocityはソケットからみたプラグの相対速度をソケット座標系で取得します. ここで第引数が並進速度,第引数が角速度です. GetConstraintForceはこの拘束が剛体に加えた拘束力を取得します(第引数が並進力,第引数がモーメント). 具体的には,ソケット側剛体に作用した拘束力をソケット座標系で表現したものが得られます. プラグ側剛体には作用反作用の法則によって逆向きの力が作用しますが,これを直接取得する関数は用意されていません.