形状の作成

衝突判定形状は次の手順で作成・登録します.

  1. 形状を作成する

  2. 剛体へ形状を追加する

  3. 形状の位置を設定する

以下に順を追って説明します.

まず形状を作成するには次のようにします.

// given PHSdkIf* phSdk

CDBoxDesc desc;
desc.boxsize = Vec3d(1.0, 1.0, 1.0);

CDBoxIf* box = phSdk->CreateShape(desc)->Cast();

衝突判定形状のオブジェクトはPhysicsモジュールが管理します. このため,形状を作成するにはPHSdkクラスのCreateShape関数を使います. PHSdkについては#.#.#章を参照してください. 形状を作成するには,まず種類に応じたディスクリプタを作成し,寸法などのパラメータを設定します. この例では直方体クラスCDBoxのディスクリプタを作成して一辺が$1.0$の立方体を作成します. ディスクリプタを指定してCreateShapeを呼び出すと,対応する種類の形状が作成され, そのインタフェースが返されます. ただし戻り値は形状の基底クラスであるCDShapeのインタフェースですので,派生クラス(ここではCDBox)のインタフェースを得るには 上のようにCast関数で動的キャストする必要があります.

形状を作成したら,次にその形状を与えたい剛体に登録します.

// given PHSolidIf* solid

solid->AddShape(box);         // first box

剛体クラスPHSolidについては#.#.#章を参照してください. ここで重要なことは,一度作成した形状は1つの剛体にいくつでも登録でき,また異なる複数の剛体にも登録できるということです. つまり,同じ形状を複数の剛体間で共有することで,形状の作成コストやメモリ消費を抑えることができます.

AddShape関数で登録した直後の形状は,剛体のローカル座標系の原点に位置しています. これを変更したい場合はSetShapePose関数を使います.

solid->AddShape(box);         // second box
solid->AddShape(box);         // third box 

// move first shape 1.0 in x-direction
solid->SetShapePose(0, Posed(Vec3d(1.0, 0.0, 0.0), Quaterniond());

// rotate second shape 30 degrees along y-axis
solid->SetShapePose(1, Posed(Vec3d(),
                    Quaterniond::Rot(Rad(30.0), 'y')));

SetShapePoseの第1引数は操作する形状の番号です.最初にAddShapeした形状の番号が$0$で,AddShapeするたびに$1$増加します. 形状の位置や向きは剛体のローカル座標系で指定します. また,形状の位置・向きを取得するにはGetShapePose関数を使います.

以下ではSpringheadでサポートされている形状を種類別に解説します.