ジオメトリは形状、位置、姿勢など静的な特性を有し、衝突検出の対象となります。これに速度や加速度などの動的な特性を持たせるには、ボディを設定します。
ジオメトリはその種類に応じた関数で、そのジオメトリを格納するスペースとサイズのパラメータを指定して作成します。
dGeomID dCreateSphere ( dSpaceID space, dReal radius );
dGeomID dCreateBox ( dSpaceID space, dReal lx, dReal ly, dReal lz );
dGeomID dCreateCapsule ( dSpaceID space, dReal radius, dReal length );
dGeomID dCreateCylinder ( dSpaceID space, dReal radius, dReal length );
dGeomID dCreatePlane ( dSpaceID space, dReal a, dReal b, dReal c, dReal d );
#define dCreateCCylinder dCreateCapsule
ODE_API dGeomID dCreateConvex ( dSpaceID space, dReal *_planes, unsigned int _planecount, dReal *_points, unsigned int _pointcount, unsigned int *_polygons );
ODE_API void dGeomSetConvex ( dGeomID g, dReal *_planes, unsigned int _count, dReal *_points, unsigned int _pointcount, unsigned int *_polygons );
種類 | 関数 | パラメータ | |
---|---|---|---|
作成 | サイズの設定/取得 | ||
球体 (Sphere) |
dCreateSphere | dGeomSphereSetRadius |
|
dGeomSphereGetRadius | |||
直方体 (Box) |
dCreateBox | dGeomBoxSetLengths |
|
dGeomBoxGetLengths | |||
カプセル (Capsule) |
dCreateCapsule | dGeomCapsuleSetParams |
|
dGeomCapsuleGetParams | |||
円柱 (Cylinder) |
dCreateCylinder | dGeomCylinderSetParams |
|
dGeomCylinderGetParams | |||
平面 (Plane) |
dCreatePlane | dGeomPlaneSetParams |
( a*x + b*y + c*z ) = d
|
dGeomPlaneGetParams | |||
光線 (Ray) |
|||
三角形メッシュ (TriMesh) |
ジオメトリのID (dGeomID) から、そのジオメトリの種類を取得します。
int dGeomGetClass ( dGeomID geom );
ジオメトリの種類は列挙として、次のように定義されています。
enum { dSphereClass = 0, // 球 dBoxClass, // 直方体 dCapsuleClass, // カプセル dCylinderClass, // 円柱 dPlaneClass, // 平面 dRayClass, // 光線 dConvexClass, // 凸形状 dGeomTransformClass, // ジオメトリ変換オブジェクト dTriMeshClass, // 三角形メッシュ dHeightfieldClass, dFirstSpaceClass, dSimpleSpaceClass = dFirstSpaceClass, dHashSpaceClass, dSweepAndPruneSpaceClass, // SAP dQuadTreeSpaceClass, dLastSpaceClass = dQuadTreeSpaceClass, dFirstUserClass, dLastUserClass = dFirstUserClass + dMaxUserClasses - 1, dGeomNumClasses };
スペースのクリーンナップモードが有効とされている場合には、ジオメトリは、それを格納するスペースが破棄されたときに自動で破棄されます。よって通常は明示的に破棄する必要はありません。
void dGeomDestroy ( dGeomID geom );
特定のジオメトリとボディを関連付けること (associate) により、両者の位置ベクトルと回転行列は自動的に結合されます。
void dGeomSetBody ( dGeomID geom, dBodyID body );
逆にジオメトリに関連付けられているボディは、dGeomGetBody()により取得できます。
dBodyID dGeomGetBody ( dGeomID geom );
関連付けを無効とするには、ジオメトリIDには対象とするジオメトリ、ボディIDにはゼロを指定してdGeomSetBody()を呼び出します。
ジオメトリがボディに関連付けられている場合、ジオメトリの位置・姿勢を設定するとボディのそれも同様の値に設定されます。逆に位置・姿勢を取得すると、ボディのそれが返されます。
設定 | 取得 | |||
---|---|---|---|---|
ポインタで取得※1 | 構造体で取得 | |||
位置 | dGeomSetPosition | dGeomGetPosition | dGeomCopyPosition | |
姿勢 | 回転行列 | dGeomSetRotation | dGeomGetRotation | dGeomCopyRotation |
クォータニオン | dGeomSetQuaternion | --- | dGeomGetQuaternion※2 |
おのおのの関数のはボデのそれと対応するため、ボディの関数を参照してください。
既定ではジオメトリとボディの位置・姿勢は一致しており、ボディの質量パラメータを調整していない限り、位置は重心にあります。
なおオフセットを設定するには、事前にボディと関連付けられている必要があります。
相対座標 | 絶対座標 | ||
---|---|---|---|
位置 | dGeomSetOffsetPosition | dGeomSetOffsetWorldPosition | |
姿勢 | 回転行列 | dGeomSetOffsetRotation | dGeomSetOffsetWorldRotation |
クォータニオン | dGeomSetOffsetQuaternion | dGeomSetOffsetWorldQuaternion |
ポインタで取得 | 構造体で取得 | ||
---|---|---|---|
位置 | dGeomGetOffsetPosition | dGeomCopyOffsetPosition | |
姿勢 | 回転行列 | dGeomGetOffsetRotation | dGeomCopyOffsetRotation |
クォータニオン | --- | dGeomGetOffsetQuaternion※1 |
オフセットを削除し、ボディの位置・姿勢に一致させます。
void dGeomClearOffset( dGeomID geom );
オフセットが設定されているか確認します。オフセットされていれば1が、さもなくば0が返されます。
int dGeomIsOffset( dGeomID geom );
軸平行境界ボックス (AABB) とは、物体を格納する最小の直方体である境界ボックス (Bounding Box) の各辺を、座標軸に対して平行にとったものす。
dGeomGetAABB()では、指定されたジオメトリを格納できるAABBを取得できます。引数geomにスペースを与えた場合には、そのスペースに含まれるすべてのジオメトリを格納できるAABBとなります。
void dGeomGetAABB ( dGeomID geom, dReal aabb[ 6 ] );
結果は配列aabbに、
最小値 | 最大値 | |
---|---|---|
x座標 | aabb[ 0 ] | aabb[ 1 ] |
y座標 | aabb[ 2 ] | aabb[ 3 ] |
z座標 | aabb[ 4 ] | aabb[ 5 ] |
のように格納されます。
最後にAABBを求めてからジオメトリを移動させなかった場合、この関数はキャッシュされた値を返すことがあります。
ジオメトリ変換では、他のジオメトリをカプセル化するオブジェクト (ジオメトリ変換オブジェクト) を作成できます。このオブジェクトには、カプセル化されているジオメリに対して任意の位置と姿勢を設定できるため、重心をオフセットさせることができます。
dGeomSetOffsetXxでオフセットを設定することでも同様に処理できるため、現在ではそちらの関数を使用すべきです。Manual: Collision Detection - ODE Wiki
dCreateGeomTransform()によって作成されるジオメトリ変換オブジェクトはdGeomID型であり、そこに格納されるジオメトリであるかのように振る舞います。
dGeomID dCreateGeomTransform ( dSpaceID space );
ジオメトリ変換オブジェクトgに、ジオメトリobjを格納 (カプセル化) します。
void dGeomTransformSetGeom ( dGeomID g, dGeomID obj );※ここで格納するジオメトリobjは、スペースに格納されていたり、ボディと関連付けられていてはなりません。
ジオメトリ変換オブジェクトgに格納されているジオメトリを取得します。
dGeomID dGeomTransformGetGeom ( dGeomID g );
クリーンナップモードを有効にすることで、ジオメトリ変換オブジェクトが破棄されたときに、そこにカプセル化されたジオメトリも自動で破棄できます。これは既定で無効となっています。
引数modeに1を設定することで有効となり、0で無効となります。
void dGeomTransformSetCleanup ( dGeomID g, int mode );
int dGeomTransformGetCleanup ( dGeomID g );
衝突検出時に作成する接触情報で返されるジオメトリを設定します。
引数modeに0を設定すると、dContactGeom構造体の接触したジオメトリを表すg1フィールドは、カプセル化されているジオメトリとなります。一方1を設定すると、ジオメトリ変換オブジェクト自身となります。なお既定では0が設定されています。
void dGeomTransformSetInfo ( dGeomID g, int mode );
int dGeomTransformGetInfo ( dGeomID g );