衝突判定形状は次の手順で作成・登録します.
形状を作成する
剛体へ形状を追加する
形状の位置を設定する
以下に順を追って説明します.
まず形状を作成するには次のようにします.
// 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のディスクリプタを作成して一辺がの立方体を作成します. ディスクリプタを指定して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した形状の番号がで,AddShapeするたびに増加します. 形状の位置や向きは剛体のローカル座標系で指定します. また,形状の位置・向きを取得するにはGetShapePose関数を使います.
以下ではSpringheadでサポートされている形状を種類別に解説します.