ソケットとプラグ

\includegraphics[width=.5\hsize ]{fig/socket_plug1.eps}

(a) before connection

\includegraphics[width=.5\hsize ]{fig/socket_plug2.eps}

(b) after connection

Fig.  : Socket and plug

さて,上の例でディスクリプタに値を設定している箇所に注目してください.この部分で関節の取り付け位置を指定しています. Springheadでは,ソケットとプラグと呼ばれるローカル座標系を用いて関節の取り付け位置を表現します. ソケットとプラグとは,その名前から連想するように,連結する剛体に取り付ける金具のようなものです. CreateJointの第$1$引数の剛体にソケットがつき,第$2$引数の剛体にプラグがつきます. ソケットとプラグがそれぞれの剛体のどの位置に取り付けられるかを指定するのがディスクリプタのposeSocketposePlugです. 上の例ではソケットの位置が$(1,0,0)$,プラグの位置が$(-1,0,0)$でした(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はソケットからみたプラグの相対速度をソケット座標系で取得します. ここで第$1$引数が並進速度,第$2$引数が角速度です. GetConstraintForceはこの拘束が剛体に加えた拘束力を取得します(第$1$引数が並進力,第$2$引数がモーメント). 具体的には,ソケット側剛体に作用した拘束力をソケット座標系で表現したものが得られます. プラグ側剛体には作用反作用の法則によって逆向きの力が作用しますが,これを直接取得する関数は用意されていません.