ジオメトリ (Geometry)

ジオメトリは形状、位置、姿勢など静的な特性を有し、衝突検出の対象となります。これに速度や加速度などの動的な特性を持たせるには、ボディを設定します。

ジオメトリの作成とパラメータ

ジオメトリの作成

ジオメトリはその種類に応じた関数で、そのジオメトリを格納するスペースとサイズのパラメータを指定して作成します。

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

凸形状 (Convex)

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
  • dReal radius (半径)
dGeomSphereGetRadius
直方体 (Box)
dCreateBox dGeomBoxSetLengths
  • dReal lx (X軸方向の長さ)
  • dReal ly (Y軸方向の長さ)
  • dReal lz (Z軸方向の長さ)
dGeomBoxGetLengths
カプセル (Capsule)
dCreateCapsule dGeomCapsuleSetParams
  • dReal radius (半径)
  • dReal length (長さ)
dGeomCapsuleGetParams
円柱 (Cylinder)
dCreateCylinder dGeomCylinderSetParams
  • dReal radius (半径)
  • dReal length (長さ)
dGeomCylinderGetParams
平面
(Plane)
dCreatePlane dGeomPlaneSetParams
  • dReal a
  • dReal b
  • dReal c
  • dReal d
( a*x + b*y + c*z ) = d
dGeomPlaneGetParams
光線
(Ray)
     
三角形メッシュ
(TriMesh)
     

ジオメトリの種類 (class)

ジオメトリの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
};

ジオメトリの破棄 (dGeomDestroy)

スペースのクリーンナップモードが有効とされている場合には、ジオメトリは、それを格納するスペースが破棄されたときに自動で破棄されます。よって通常は明示的に破棄する必要はありません。

void dGeomDestroy ( dGeomID geom );

ボディとの関連付け (dGeomSetBody)

特定のジオメトリとボディを関連付けること (associate) により、両者の位置ベクトルと回転行列は自動的に結合されます。

void dGeomSetBody ( dGeomID geom, dBodyID body );

逆にジオメトリに関連付けられているボディは、dGeomGetBody()により取得できます。

dBodyID dGeomGetBody ( dGeomID geom );

関連付けの無効化

関連付けを無効とするには、ジオメトリIDには対象とするジオメトリ、ボディIDにはゼロを指定してdGeomSetBody()を呼び出します。

位置・姿勢の設定と取得 (dGeomSetXx)

ジオメトリがボディに関連付けられている場合、ジオメトリの位置・姿勢を設定するとボディのそれも同様の値に設定されます。逆に位置・姿勢を取得すると、ボディのそれが返されます。

位置・姿勢の関数
  設定 取得
ポインタで取得※1 構造体で取得
位置 dGeomSetPosition dGeomGetPosition dGeomCopyPosition
姿勢 回転行列 dGeomSetRotation dGeomGetRotation dGeomCopyRotation
クォータニオン dGeomSetQuaternion --- dGeomGetQuaternion※2
※1 ボディと関連付けられている場合は、ボディの位置・姿勢のポインタが返されます。
※2 クォータニオン取得の関数名は、その他の命名規則と異なっている点に注意します。

おのおのの関数のはボデのそれと対応するため、ボディの関数を参照してください。

ボディとの位置・姿勢のオフセット (dGeomSetOffsetXx)

既定ではジオメトリとボディの位置・姿勢は一致しており、ボディの質量パラメータを調整していない限り、位置は重心にあります。

なおオフセットを設定するには、事前にボディと関連付けられている必要があります。

オフセットを設定する関数
  相対座標 絶対座標
位置 dGeomSetOffsetPosition dGeomSetOffsetWorldPosition
姿勢 回転行列 dGeomSetOffsetRotation dGeomSetOffsetWorldRotation
クォータニオン dGeomSetOffsetQuaternion dGeomSetOffsetWorldQuaternion
オフセットを取得する関数
  ポインタで取得 構造体で取得
位置 dGeomGetOffsetPosition dGeomCopyOffsetPosition
姿勢 回転行列 dGeomGetOffsetRotation dGeomCopyOffsetRotation
クォータニオン --- dGeomGetOffsetQuaternion※1
※1 クォータニオン取得の関数名は、その他の命名規則と異なっている点に注意します。

オフセットの削除

オフセットを削除し、ボディの位置・姿勢に一致させます。

void dGeomClearOffset( dGeomID geom );

オフセットの確認

オフセットが設定されているか確認します。オフセットされていれば1が、さもなくば0が返されます。

int dGeomIsOffset( dGeomID geom );

軸平行境界ボックス (Axis-Aligned Bounding Box:AABB)

軸平行境界ボックス (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を求めてからジオメトリを移動させなかった場合、この関数はキャッシュされた値を返すことがあります。

ジオメトリ変換 (Geometry Transform)

ジオメトリ変換では、他のジオメトリをカプセル化するオブジェクト (ジオメトリ変換オブジェクト) を作成できます。このオブジェクトには、カプセル化されているジオメリに対して任意の位置と姿勢を設定できるため、重心をオフセットさせることができます。

dGeomSetOffsetXxでオフセットを設定することでも同様に処理できるため、現在ではそちらの関数を使用すべきです。Manual: Collision Detection - ODE Wiki

ジオメトリ変換オブジェクトの作成

dCreateGeomTransform()によって作成されるジオメトリ変換オブジェクトはdGeomID型であり、そこに格納されるジオメトリであるかのように振る舞います。

dGeomID dCreateGeomTransform ( dSpaceID space );

カプセル化 (encapsulation)

格納

ジオメトリ変換オブジェクトgに、ジオメトリobjを格納 (カプセル化) します。

void dGeomTransformSetGeom ( dGeomID g, dGeomID obj );
※ここで格納するジオメトリobjは、スペースに格納されていたり、ボディと関連付けられていてはなりません。

取得

ジオメトリ変換オブジェクトgに格納されているジオメトリを取得します。

dGeomID dGeomTransformGetGeom ( dGeomID g );

クリーンナップモード (clean-up mode)

クリーンナップモードを有効にすることで、ジオメトリ変換オブジェクトが破棄されたときに、そこにカプセル化されたジオメトリも自動で破棄できます。これは既定で無効となっています。

引数modeに1を設定することで有効となり、0で無効となります。

void dGeomTransformSetCleanup ( dGeomID g, int mode );
int dGeomTransformGetCleanup ( dGeomID g );

スペースのクリーンナップモード

情報モード (information mode)

衝突検出時に作成する接触情報で返されるジオメトリを設定します。

引数modeに0を設定すると、dContactGeom構造体の接触したジオメトリを表わすg1フィールドは、カプセル化されているジオメトリとなります。一方1を設定すると、ジオメトリ変換オブジェクト自身となります。なお既定では0が設定されています。

void dGeomTransformSetInfo ( dGeomID g, int mode );
int dGeomTransformGetInfo ( dGeomID g );