API of ODE

注:ODEの単位系は統一が取れていれば何でもかまいません.ただし,角度はradianとなります.このサイトやODE本では標準的なSI単位系を使っています.なお、drawstuffのAPIであるdsSetViewpoint(float xyz[3], float hpr[3])の視線方向の角度を設定する配列hprの単位だけは度となります。

Open Dynamics EngineのAPI集です.2年前にODE本に付録で掲載しようとしましたがページ数の制約で断念しました.少し古く完全なAPI集ではありませんが,参考になることを願って掲載します.また,利便性のためにdrawstuffのAPIも入れています.drawstuffのAPIは小文字のdsで始まり,Sの項に入れています.時間を見つけてブラッシュアップしていきたいと思っています.


A

  • int dAllocateODEDataForThread(unsigned AllocateFlags);

ODEを使う全てのスレッドから呼び出さなければならない.AllocateFlagsは0またはdAllocateFlagCollisinDateである.

  • int dAreConnected (dBodyID body1, dBodyID body2);

ボディbody1とbody2がジョイントで結合されていたら1 を返し,それ以外は0を返す.

  • int dAreConnectedExcluding (dBodyID body1, dBodyID body2, int joint_type);

ボディ1とボディ2がjoint_typeを持たないジョイントで結合されていたら1 を返し,それ以外は0 をす.joint_typeはdJointTypeXXX定数である.この定数はdJointGetType()を参照.これは2 つのボディに接触ジョイントを追加するかどうか決めるときに役立つ.もし,すでに接触ジョイント以外のジョイントで結合されている場合に接触ジョイントを追加することは適切ではないが,接触ジョイントで結合されている場合に接触ジョイントを追加することは問題ない.

B

  • void dBodyAddForce(dBodyID, dReal fx, dReal fy, dReal fz);
  • void dBodyAddTorque(dBodyID, dReal fx, dReal fy, dReal fz);
  • void dBodyAddRelForce(dBodyID, dReal fx, dReal fy, dReal fz);
  • void dBodyAddRelTorque(dBodyID, dReal fx, dReal fy, dReal fz);
  • void dBodyAddForceAtPos(dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz);
  • void dBodyAddForceAtRelPos(dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz);
  • void dBodyAddRelForceAtPos(dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz);
  • void dBodyAddRelForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz, dReal px, dReal py, dReal pz);

力をボディに絶対座標系または相対座標系で与える.力は各ボディに蓄積されるが,各時間ステップ毎に0 に初期化される.***RelForceと***RelTorque は物体の相対座標系での位置(x, y, z) に力またはトルクを作用する関数で,***ForceAtPos と***ForceAtRelPos は指定した位置ベクトルに力を作用する関数である.

  • dBodyID dBodyCreate(dWorldID);

与えられたワールドにボディを絶対座標系での位置(0,0,0) に生成し,そのID 番号を返す.

  • void dBodyDestroy(dBodyID);

dBodyID で指定されたボディを破壊する.ボディに接続されていたジョイントは機能しなくなるが破壊はされない.

  • const dReal *dBodyGetForce(dBodyID);
  • const dReal *dBodyGetTorque(dBodyID);

ボディに加えられている力、トルクを取得する.関節で結合されている複数のボディの力,トルクを取得したい場合は,dJointGetFeedback()を使うこと.

  • void dBodyGetPointVel (dBodyID b, dReal px, dReal py, dReal pz,   dVector3 result)
絶対座標系で表されている位置(px, py, pz)の速度を絶対座標系で取得する。
  • const dReal *dBodyGetPosition(dBodyID);

ボディの位置を取得する.要素数3個の配列であるボディの位置(x, y, z) へのconst ポインタを返す.

  • void dBodyGetPosRelPoint (dBodyID b, dReal px, dReal py, dReal pz, dVector3 result)


絶対座標系の位置(px, py, pz)を相対座標系に変換する。dBodyGetRelPointPosの反対。


  • void dBodyGetRelPointVel (dBodyID b, dReal px, dReal py, dReal pz, dVector3 result)
ボディ座標系で表されている位置(px, py, pz)の速度を絶対座標系で取得する。
  • void dBodyGetRelPointPos (dBodyID b, dReal px, dReal py, dReal pz, dVector3 result)
相対座標系の位置(px, py, pz)を絶対座標系に変換する。
  • const dReal *dBodyGetRotation(dBodyID);

ボディの位置し,dBodyGetRotation は回転行列(4行3列)へのconstポインタを返す.

  • const dReal * dBodyGetTorque(dBodyID);

ボディに加えられているトルクを取得する.

  • void dBodySetMass(dBodyID, const dMass *mass);

質量パラメータをボディにセットする.

  • void dBodySetPosition(dBodyID, dReal x, dReal y, dReal z);

dBodyID 番号のついたボディの位置を絶対座標系(x,y,z) に設定する.

  • dBodySetQuaternion(dBodyID body, const dQuaternion q);

body にクオータニオンq を設定する.

  • void dBodySetRotation(dBodyID, const dMatrix3 R);

ボディの姿勢を回転行列R に設定する.

  • void dBodyVectorToWorld(dBodyID body,  dReal px, dReal py, dReal pz, dVector3 result);

bodyの座標系(相対座標系)のベクトル(px, py, pz)を世界座標系(絶対座標系)へ変換し,結果をresultに格納する.

  • void dBodyVectorFromWorld(dBodyID body,   dReal px, dReal py, dReal pz, dVector3 result);

世界座標系(絶対座標系)のベクトル(px, py, pz)をbodyの座標系(相対座標系)へ変換し,結果をresultに格納する.


C

  • void dCleanupODEAllDataForThread();

ライブラリがdInitFlagManualThreadCleanupで初期化されたときだけ,ライブラリをクリーンアップするため(終了させる前のお掃除)に利用する.

  • void dCloseODE();

ライブラリを終了する.dInitODE2()またはdInitODE()が先に呼び出されていなければいけない.ODEをシングルスレッドから使う場合のみ使用すること.

  • int dCollide(dGeomID o1, dGeomID o2, int flags, dContactGeom *contact, int skip);

与えられた2つのジオメトリo1 とo2 が交差する可能性があるときに,それらの接触情報を生成する.引数flags は現在のところジオメトリが接触した際の最大接触点数を指定する整数である.それが0 に設定された場合は, 接触点が1個あるものとして計算される.

引数contact はdContactGeom 構造体配列へのポインタである.この構造体は少なくとも接触点の最大数分の情報を保持できなければならない.dContactGeom 構造体はある配列の中に大きな構造体として埋め込まれている.

引数skip は配列中のあるdContactGeom 構造体から次のそれへのバイトオフセットである.skip のサイズがsizeof(dContact)ならば通常(C 言語スタイル)の配列であり,それより小さい場合はエラーとなる.もし,ジオメトリが交差したら(接触配列を更新して)接触点数を返す.交差しない場合は0 を返す.

この関数はo1 とo2 が同じスペースだろうが違うスペースに所属してもかまわずに計算する.

struct dContact {
    dSurfaceParameters <strong>surface</strong>;
    dContactGeom <strong>geom</strong>;
    dVector3 <strong>fdir1</strong>;
};

struct dSurfaceParameters {
    int <strong>mode</strong>; // 接触フラグ.以下の表を参照
    dReal <strong>mu</strong>; // 摩擦係数.これは必ず設定しなければならない.
    // 以下のメンバを使うために対応するflagをmodeで設定しなければならない
    dReal <strong>mu2</strong>; // muが摩擦方向1,mu2は摩擦方向2, mu2が設定されない場合はmuが両方向に適用
    dReal <strong>bounce</strong>; // 反発係数
    dReal <strong>bounce_vel</strong>; // 跳ね返るための最低速度.bounceを設定した場合これも設定しなければならない.
    dReal <strong>soft_erp</strong>; // 接触点の法線方向のerp
    dReal <strong>soft_cfm</strong>;  // 接触点の法線方向のcfm
    dReal <strong>motion1</strong>, <strong>motion2</strong>, <strong>motionN</strong>; // 摩擦方向1,2,法線方向の表面速度
    dReal <strong>slip1</strong>, <strong>slip2</strong>; // 摩擦方向1,2のスリップ(force-dependent slip)
};

modeの表

dContactMu2 設定されない場合はmuが両方向の摩擦係数に適用.設定された場合はmuが摩擦方向1,mu2は摩擦方向2
dContactFDir1 設定された場合はfdir1が摩擦方向1となり,それ以外は接触点の法線方向と垂直になるように摩擦方向1が計算される.
dContactBounce 設定された接触表面が反発性を持つ.反発係数はbounceで設定する.
dContactSoftERP 設定された場合,接触点の接線方向にerpを設定する.表面をやわらかくする効果を持つ.
dContactSoftCFM 設定された場合,接触点の接線方向にcfmを設定する.表面をやわらかくする効果を持つ.
ContactMotion1 設定された場合,摩擦表面はボディの運動に無関係に移動する.ベルトコンベアが摩擦表面にあることを想像して欲しい.このフラグはmotion1を摩擦方向1に設定する.
dContactMotion2 同上.ただし,摩擦方向2
dContactMotionN 同上.ただし,法線方向
dContactSlip1 摩擦方向1の力依存性スリップ(Force-dependent-slip,FDS)
dContactSlip2 摩擦方向2のFDS
dContactApprox1_1 設定された場合は摩擦方向1に摩擦四角錐モデルを適用する.設定されない場合は力限界定数近似(constant-force-limit)が用いられる.この場合は,muは摩擦力の限界値となる.
dContactApprox1_2 設定された場合は摩擦方向2に摩擦四角錐モデルを適用する.設定されない場合は力限界定数近似(constant-force-limit)が用いられる.この場合は,muは摩擦力の限界値となる.
dContactApprox1 設定された場合は,摩擦方向1と2に摩擦四角錐モデルを適用する.

  • dGeomID dCreateBox (dSpaceID space, dReal lx, dReal ly, dReal lz);

space で指定されたスペースにx,y,z 軸に沿った長さlx,ly,lz の直方体ジオメトリを生成し,そのID 番号を返す.直方体ジオメトリの参照点はその重心である.

  • dGeomID dCreateCapsule(dSpaceID space, dReal r, dReal l);

space で指定されたスペースに半径r,長さl のカプセルジオメトリを生成し,そのID 番号を返す.カプセルは普通の円柱の両端に半球を被せたようなものである.この特徴は衝突検出の内部コードを拘束かつ正確にすることができる.引数l には半球のキャップを入れない.キャップの半径は円柱の半径r と同じである.


  • dGeomID dCreateCylinder(dSpaceID space, dReal r, dReal l);

スペースspaceに半径r,長さl の円柱ジオメトリを生成し,そのID 番号を返す.‘

  • dGeomID dCreateGeomTransform(dSpaceID space);

スペースspaceにジオメトリトランスフォームを生成し,そのID 番号を返す.

  • dGeomID dCreateRay(dSpaceID space, dReal l);

スペースspace に,長さlの光線ジオメトリを作成し,そのID 番号を返す.

  • dGeomID dCreateSphere(dSpaceID space, dReal r);

半径rの球ジオメトリを生成し,そのID 番号を返す.

  • dGeomID dCreatePlane(dSpaceID space, dReal a, dReal b, dReal c, dReal d);

平面ジオメトリを与えられた引数により生成し,そのID 番号を返す.引数space が0 でなければ,そのspace に平面ジオメトリを挿入する.引数a,b,c,d は平面の方程式 ax+by+cz = d のパラメータである.平面の法線ベクトルは(a,b,c) であり長さは1でなければならない.平面ジオメトリは設置不可能(non-placeable),つまり位置や姿勢を定義できない特別なジオメトリで常に絶対座標系で定義しなければならない.つまり,平面オブジェクトは常に静的な環境の一部として使われることを仮定している.

  • dGeomID dCreateTriMesh(dSpaceID space, dTriMeshDataID Data, dTriCallback *Callback,dTriArrayCallback * ArrayCallback, dTriRayCallback* RayCallback);

三角メッシュジオメトリを生成し,そのID 番号を返す.

  • void dCROSS(a,op,b,c)

外積の計算。a op b × cを計算する。ここで、opは=,  +=, または-=となり、 a, b, cは3次元ベクトル。

D

  • void dGeomTriMeshDataBuild (dTriMeshDataID g, const void* Vertices, int VertexStride, int VertexCount,const void* Indices, int IndexCount, int TriStride, const void* Normals);

dTriMeshData オブジェクトをデータで詰めるのに使われる.ここでは,データはコピーされないので,この関数を通過するポインターは有効でなければいけない.

E

F

G

  • dBodyID dGeomGetBody(dGeomID geom);

ジオメトリgeomに対応するボディID を取得する.

  • void dGeomDestroy(dGeomID geom);

ジオメトリgeomを破壊しスペースから削除する.

  • void dGeomDisable (dGeomID geom);
  • void dGeomEnable (dGeomID geom);

ジオメトリgeomを無効または有効にする.無効にされたジオメトリはスペースには属しているがdSpaceCollide() とdSpaceCollide2() に無視される.

  • int dGeomIsEnabled(dGeomID geom);

ジオメトリgeomが無効なら0 を返し,有効なら1 を返す.新しいジオメトリは有効な状態で作成される.

  • int dGeomGetClass(dGeomID);

ジオメトリgeomのクラス番号を返す.クラスは以下のとおりである.

  • dSphereClass: 球
  • dBoxClass: 直方体
  • dCapsuleClass: カプセル
  • dCylinderClass: シリンダ
  • dPlaneClass: 平面
  • dGeomTransformClass: ジオメトリトランスフォーム(Geometry transform)
  • dRayClass: 光線(Ray)
  • dTriMeshClass: 三角メッシュ(Triangle mesh)
  • dSimpleSpaceClass: 単純スペース
  • dHashSpaceClass: ハッシュ表ベースのスペース
  • const dReal *dGeomGetPosition(dGeomID geom);
  • ジオメトリgeomの絶対座標系での位置へのポインタを返す.ジオメトリがボディに設定された場合は,ボディの位置へのポインタを返す.つまり,dBodyGetPosition() と同じである.

  • void dGeomGetQuaternion(dGeomID geom, dQuaternion result);

ジオメトリgeomのクオータニオンを第2 引数のresultへコピーする.ジオメトリがボディに設定された場合は,dBodyGetQuaternion() と同じである.

  • const dReal *dGeomGetRotation(dGeomID);

dGeomID で指定されたジオメトリの回転行列へのポインタを返す.ジオメトリがボディに設定された場合は,dBodyGetRotation() と同じである.

  • dSpaceID dGeomGetSpace (dGeomID geom);

ジオメトリgeomを格納しているスペースID を返す.もし,どのスペースにも属していなければ0 を返す.

  • void dGeomSetBody(dGeomID, dBodyID);

この関数はジオメトリとボディを関連付ける.ジオメトリにボディを設定することにより両者の位置ベクトルと回転行列は自動的に結び付けられる.つまり,位置と姿勢はボディかジオメトリだけに設定すればよい.ただし,設置不可能な平面ジオメトリは動力学計算の対象にならないのでこの関数を呼び出すとエラーが発生する.

  • void dGeomTriMeshDataBuild (dTriMeshDataID g, const void* Vertices, int VertexStride, int VertexCount, const void* Indices, int IndexCount, int TriStride, const void* Normals);

三角メッシュオブジェクトをデータで埋める.ここではデータはコピーされない.ポインタがこの関数に渡される.

  • void dGeomSetData (dGeomID, void *);
  • void *dGeomGetData (dGeomID);

ユーザ定義データのポインタをジオメトリに設定あるいは取得する.

  • void dGeomSetOffsetPosition (dGeomID, dReal x, dReal y, dReal z);
  • void dGeomSetOffsetRotation (dGeomID, const dMatrix3 R);
  • void dGeomSetOffsetQuaternion (dGeomID, const dQuaternion);

位置ベクトル,回転行列,クオータニオンのオフセットを相対座標系で設定する.予めジオメトリはボディと関連付けられていなければならない.


  • void dGeomSetPosition (dGeomID, dReal x, dReal y, dReal z);
  • void dGeomSetRotation (dGeomID, const dMatrix3 R);
  • void dGeomSetQuaternion (dGeomID, const dQuaternion);

位置ベクトル,回転行列,クオータニオンを設定する.ジオメトリがボディに設定された場は,dBodySetPosition(), dBodySetRotation(), dBodySetQuaternion() と同一となる

  • void dGeomTriMeshDataBuildSimple (dTriMeshDataID g, const dVector3*Vertices, int VertexCount, const int* Indices,int IndexCount);

三角メッシュのデータを簡単に作成する関数.

H

  • dSpaceID dHashSpaceCreate (dSpaceID space);

高速に計算可能なハッシュテーブルを備えた衝突検出計算用スペースの生成し,そのID 番号を返す.

I

  • void dInitODE();

ODEを初期化する.これを使う場合はdInitODE2()を呼び出す必要はない.内部でdInitODE2()を呼び出している.

  • int dInitODE2(unsigned InitFlags);

ライブラリを初めて使う場合にこれを呼び出さなければならない.InitFlagsは0またはdInitFlagManualThreadCleanupである.dCloseODE()が呼び出されるまで1度だけ呼び出さなければならない.

J

  • void dJointAttach(dJointID, dBodyID body1, dBodyID body2);

ジョイントを新しいボディに取り付ける.すでにそのジョイントが取り付けられていたら,まず古いボディから取り外される.ジョイントをボディ1個だけに取り付けるためには,引数body1 かbody2 を0 に設定する.ID 番号0 のボディは静的な環境を指す.両方のボディを0 に設定するとシミュレーション上では何の効果も持たない.

  • dJointID dJointCreateBall(dWorldID, dJointGroupID);
  • dJointID dJointCreateHinge(dWorldID, dJointGroupID);
  • dJointID dJointCreateSlider(dWorldID, dJointGroupID);
  • dJointID dJointCreateContact(dWorldID,dJointGroupID,const dContact*);
  • dJointID dJointCreateUniversal(dWorldID, dJointGroupID);
  • dJointID dJointCreateHinge2(dWorldID, dJointGroupID);
  • dJointID dJointCreateFixed(dWorldID, dJointGroupID);
  • dJointID dJointCreateAMotor(dWorldID, dJointGroupID);

指定されたタイプの新しいジョイントを生成する.ボディにジョイントが結合されない限り,シミュレーションに効果を及ぼさない.dJointGroupID には通常0 を設定する.

  • dJointID dJointCreateContact(dWorldID, dJointGroupID,const dContact *);

新しいジョイントを生成し,そのID 番号を返す.引数dJointGroupIDは通常は0 を設定する.それが0 でない場合は,すでに存在するジョイントグループに割り当てられる.接触ジョイントは既に作成されているdContact 構造体で初期化される.

  • void dJointDestroy(dJointID);

ジョイントを破壊する.結合されているボディからそのジョイントを取り外し,ワールドからも削除する.

  • void dJointGetHingeAnchor(dJointID, dVector3 result);

ヒンジジョイントの回転中心点を絶対座標で取得する.これはボディ1上の点を返す.ジョイントが完全な場合はボディ2 上の点と一致する.

  • void dJointGetHingeAnchor2(dJointID, dVector3 result);

ヒンジジョイントの回転中心点を絶対座標で取得する.これはボディ2上の点を返す.ジョイントが完全な場合はボディ1 上の点と一致し,不完全な場合はずれがある.これを使いジョイントのずれを調べることができる.

  • dReal dJointGetHingeAngle(dJointID);

ヒンジジョイントの角度[rad] を取得する.

  • dReal dJointGetHingeAngleRate (dJointID);

ヒンジジョイントの角速度[rad/s] を取得する.

  • void dJointGetHingeAxis (dJointID, dVector3 result);

ヒンジジョイントの回転軸ベクトルを取得する.

  • dReal dJointGetHingeParam(dJointID, int parameter);

ヒンジジョイントのパラメータを取得する.

  • dReal dJointGetHinge2Param(dJointID, int parameter);

ヒンジ2 ジョイントのパラメータを取得する.

  • dReal dJointGetSliderParam(dJointID, int parameter);

スライダージョイントのパラメータを取得する.

  • int dJointGetType(dJointID);
ジョイントのタイプを取得する.以下のいずれかのタイプが返る.
dJointTypeBall ボールジョイント
dJointTypeHinge ヒンジジョイント
dJointTypeSlider スライダージョイント
dJointTypeContact 接触ジョイント
dJointTypeUniversal ユニバーサルジョイント
dJointTypeHinge2 ヒンジ2ジョイント
dJointTypeFixed 固定ジョイント
dJointTypeAMotor 角度モータジョイント
dJointTypeLMotor リニアモータジョイント
dJointTypePlane2D 2次元平面ジョイント.
dJointTypePR 直動-Rotoide ジョイント
dJointTypePU 直動-ユニバーサルジョイント
dJointTypePiston ピストンジョイント
  • void dJointGetUniversalAnchor(dJointID, dVector3 result);

ユニバーサルジョイントの回転中心点を取得する.これはボディ1 上の点を返す.ジョイントが完全な場合はボディ2 上の点と一致する.

  • void dJointGetUniversalAnchor2 (dJointID, dVector3 result);

ユニバーサルジョイントの回転中心点を絶対座標で取得する.これはボディ2 上の点を返す.ジョイントが完全な場合はボディ1 上の点と一致し,不完全な場合はずれがある.これを使いジョイントのずれを調べることができる.

  • void dJointGetUniversalAxis1(dJointID, dVector3 result);

ユニバーサルジョイントの回転軸1 のベクトルを取得する.

  • void dJointGetUniversalAxis2 (dJointID, dVector3 result);

ユニバーサルジョイントの回転軸2 のベクトルを取得する.

  • dReal dJointGetUniversalAngle1(dJointID);

ユニバーサルジョイントの回転軸1 の角度[rad] を取得する.

  • dReal dJointGetUniversalAngle2(dJointID);

ユニバーサルジョイントの回転軸2 の角度[rad] を取得する.

  • dReal dJointGetUniversalAngle1Rate(dJointID);

ユニバーサルジョイントの回転軸1 の角速度[rad/s] を取得する.

  • dReal dJointGetUniversalAngle2Rate(dJointID);

ユニバーサルジョイントの回転軸2 の角速度[rad/s] を取得する.

  • dReal dJointGetUniversalParam(dJointID, int parameter);

ユニバーサルジョイントのパラメータを取得する.

  • dJointGroupID dJointGroupCreate(0);

ジョイントグループの生成し,そのID 番号を返す.以前のバージョンでは確保する領域の大きさを確保していたが現在は使われておらず互換性を保つため0 を設定する.

  • void dJointGroupDestroy (dJointGroupID);

ジョイントグループを破壊する.ジョイントグループ中の全てのジョイントは破壊される.

  • void dJointGroupEmpty(dJointGroupID);

ジョイントグループを空にする.ジョイントグループ内の全てのジョイ
ントは破壊されるが,ジョイントグループそのものは破壊されない.

  • dReal dJointGetAMotorParam(dJointID, int parameter);

A モータのパラメータを取得する.

  • void dJointSetFixed(dJointID joint);

ジョイントjointを固定ジョイントに設定する.

  • void dJointSetHingeAnchor(dJointID joint, dReal x, dReal y, dReal z);

ジョイントjointの中心点(anchor) の座標(x; y; z) を設定する.

  • void dJointSetHingeAxis(dJointID joint, dReal x, dReal y, dReal z);

ジョイントjointの回転軸ベクトル(x; y; z) を設定する.

  • void dJointSetHinge2Anchor(dJointID, dReal x, dReal y, dReal z);

指定されたジョイントの中心点(anchor) の座標(x; y; z) を設定する.

  • void dJointSetHinge2Axis1(dJointID, dReal x, dReal y, dReal z);

ジョイントの回転軸1 のベクトル(x; y; z) を設定する.

  • void dJointSetHinge2Axis2(dJointID, dReal x, dReal y, dReal z);

ジョイントの回転軸2 のベクトル(x; y; z) を設定する.

  • void dJointSetHingeParam(dJointID, int parameter, dReal value);

ヒンジジョイントのパラメータを設定する.

  • void dJointSetHinge2Param(dJointID, int parameter, dReal value);

ヒンジ2ジョイントのパラメータを設定する.

  • void dJointSetSliderAxis(dJointID, dReal x, dReal y, dReal z);

スライダジョイントの軸ベクトル(x, y, z)を設定する.

  • void dJointSetSliderParam(dJointID, int parameter, dReal value);

スライダジョイントのパラメータを設定する.

  • void dJointSetUniversalParam(dJointID, int parameter, dReal value);

ユニバーサルジョイントのパラメータを設定する.

ジョイントパラメータの種類

dParamLoStop ジョイントの可動域の下限値.デフォルト値は-dInfinityとなっており下限がない.回転ジョイントの場合は-πより大きくなければ有効にならない.
dParamHiStop ジョイントの可動域の上限値.デフォルト値はdInfinity となっており上限がない.回転ジョイントの場合はπより小さくなければ有効にならない.
dParamVel モータの目標速度(回転式ジョイントは角速度,スライダーは速度)
dParamFMax モータが目標速度に達成するために与える最大力(回転式はトルク,スライダーは力)
dParamFudgeFactor 現在のジョイントの停止とモータの実装には若干問題がある.ジョイントが停止している時に,モータがそれを動かそうとすると非常に大きな力がかかってしまい.ジャンプする挙動が発生する.Fudge factor はこの過度な力を加減します.この値は0以上1以下であり,1がデフォルト値です.ジャンプする挙動が見られる場合はこの値を小さくすると良い.ただし,この値を小さくするとモータが動かなくなる
dParamBounce 反発係数.値は0 から1.0 は全く反発せず,1 は最大反発.
dParamCFM 停止しないときに使用される拘束力混合パラメータ(CFM).停止時はdParamStopCFM
dParamStopERP 停止時に使用される誤差削減パラメータ(ERP).
dParamStopCFM 停止時に使用される拘束力混合パラメータ(CFM).ERP と同時に使用するとスポンジのようなソフトな停止を実現できる.これはパワーが供給されていないジョイントに対して有効であることに注意.パワーのあるジョイントでは効果的に機能しない.
dParamSuspensionERP サスペンションERP パラメータ.現在,ヒンジ2にのみ実装している.
dParamSuspensionCFM サスペンションCFM パラメータ.現在,ヒンジ2にのみ実装している.

K

L

M

  • void dMassAdd(dMass *a, const dMass *b);

質量パラメータb を質量パラメータ a に加える.

  • void dMassAdjust(dMass *, dReal newmass);

ある物体の質量パラメータが与えられたとき,全質量がnewmass になるように調整する.

  • void dMassRotate(dMass *, const dMatrix3 R);

ある物体の質量パラメータが与えられたとき,物体の相対座標系でR回転したときの質量パラメータに調整する.

  • void dMassSetBoxTotal(dMass *mass,dReal total_mass,dReal lx, dReal ly, dReal lz);

構造体mass に直方体の質量パラメータを設定

  • void dMassSetCappedCylinder(dMass *mass,dReal density, int direction, dReal radius, dReal length);

構造体mass にキャップ付円柱の質量パラメータ(密度density,方向direction(x=1,y=2,z=3),半径radius,長さlength)を設定する.

  • void dMassSetCapsuleTotal(dMass *mass,dReal total_mass, int direction, dReal r, dReal l);

構造体mass にカプセルの質量パラメータ(全質量total_mass,方向direction(x=1,y=2,z=3),半径r,長さl)を設定

  • void dMassSetCylinder(dMass *mass,dReal density, int direction, dReal radius, dReal length);

構造体mass に円柱の質量パラメータ(密度density,方向direction(x=1,y=2,z=3),半径radius,長さlength)を設定する.

  • void dMassSetCylinderTotal(dMass *mass,dReal total_mass, int direction, dReal r, dReal l);

構造体mass に円柱の質量パラメータ(全質量total_mass,方向direction(x=1,y=2,z=3),半径r,長さl)を設定

  • void dMassSetSpherel(dMass *, dReal density, dReal radius);

与えられた半径radius と全質量total_mass に対する質量パラメータ(密度density, 半径radius) を設定する.このとき,重心はオブジェクトに対して(0,0,0)の位置となる.

  • void dMassSetSphereTotal(dMass *, dReal total_mass, dReal r);

与えられた半径radius と全質量total_mass に対する質量パラメータ(全質量total_mass, 半径r) を設定する.このとき,重心はオブジェクトに対して(0,0,0)の位置となる.

  • void dMassSetZero(dMass *);

全ての質量パラメータ0 に設定する.

  • void dMassTranslate(dMass *, dReal x, dReal y, dReal z);

ある物体の質量パラメータが与えられたとき,物体の相対座標系での位置(x, y, z) に質量パラメータを調整する.重心を移動する場合などに使われる.


  • void dMultiply0_331 (dReal *A, const dReal *B, const dReal *C);
  • void dMultiply1_331 (dReal *A, const dReal *B, const dReal *C);
  • void dMultiply1_331 (dReal *A, const dReal *B, const dReal *C);



行列の掛け算。 dMultiply*の*は0, 1, 2の値であり次の意味を持つ。

*   0:   A = B  * C  
*   1:   A = B’ * C  
*   2:  A = B *  C’

ここで、’は転置の意味。 Aは3行1列、Bは3行3列、Cは3行1列の行列。


N

  • typedef void dNearCallback (void *data, dGeomID o1, dGeomID o2);

引数data はdSpaceCollide からdNearCallback へそのまま渡される.その意味はユーザにより定義される.引数o1 とo2 は近接しているジオメトリである.このコールバック関数はo1 とo2 に対して各ペア間の接触点を算出するためにdCollide() を呼び出すことができ,これらの接触点は接触ジョイントとしてシミュレーションに付け加えられる.

dSpaceCollide() は全ての交差するジオメトリペアを通過させることを保障するが,交差しないジオメトリペアを誤って通過させる可能性もある.間違える数はスペースによって使われる内部のアルゴリズムに依存する.従って,dCollide が全てのペアについて接触点を返す保障はない.


O


P


Q

  • void dQFromAxisAndAngle(dQuaternion q, dReal ax, dReal ay, dReal az,dReal angle);

回転軸ベクトル(ax; ay; az) を中心にangle 回転したときのクオータニオンq を取得する.

  • void dQtoR(dQuaternion q, dMatrix3 R);

クオータニオンq を回転行列R に変換する.


R

  • dRFromAxisAndAngle(dMatrix3 R, dReal ax, dReal ay, dReal az, dReal angle);

回転軸ベクトル(ax, ay, az) を中心にangle 回転したときの回転行列Rを取得する.

S

  • void dsDrawBox(const float pos[3], const float R[12], const float sides[3]);

位置pos[3], 回転行列R[12], x,y,z 軸に沿った長さがそれぞれsides[0],sides[1],sides[2] のボックスを描画する.

  • void dsDrawSphere(const float pos[3], const float R[12], float r);

位置pos[3], 回転行列R[12],  半径r の球を描画する.

  • void dsDrawTriangle(const float pos[3], const float R[12], const float *v0, const float *v1, const float *v2, int solid);

頂点座標(v0,v1,v2) の三角形を描画する.solid が0 の場合は三角形の線(ワイヤーフレーム)だけを表示, 1 の場合は三角形の面を表示する.

  • void dsDrawCylinder(const float pos[3], const float R[12], float l, float r);

z 軸に沿った長さl(エル),半径r の円柱を描画する.

  • void dsDrawCapsule(const float pos[3], const float R[12], float l, float r);

z 軸に沿った長さl,半径r のカプセルを描画します.

  • void dsDrawLine(const float pos1[3], const float pos2[3]);

点1(pos1[0],pos1[1],pos1[2]) と点2(pos2[0],pos2[1],pos2[2]) を結ぶ線を描画します.

  • void dsDrawBoxD(const double pos[3], const double R[12],const double sides[3]);

dsDrawBox の倍精度版

  • void dsDrawSphereD(const double pos[3], const double R[12],const float r);

dsDrawSphere の倍精度版

  • void dsDrawTriangleD(const double pos[3], const double R[12], const double *v0, const double *v1, const double *v2, int solid);

dsDrawTriangle の倍精度版

  • void dsDrawCylinderD(const double pos[3], const double R[12], float l, float r);

dsDrawCylinder の倍精度版

  • void dsDrawCapsuleD(const double pos[3], const double R[12], float l, float r);

dsDrawCappedCylinder の倍精度版

  • void dsDrawLineD(const double pos1[3], const double pos2[3]);

dsDrawLine の倍精度版

  • void dsGetViewPoint(float xyz[3], float hpr[3]);

カメラの位置と視線を取得する.xyz はカメラの位置(x,y,z), hpr はカメラの視線heading(yow に相当), pitch, roll を表し単位は度である.heading=0 はx 軸に沿った方向,pitch=0 は水平線の方向,roll=0 はロールなし.

  • void dsStop();

シミュレーションループを停止する.dsSimulationLoop() の内部でこのAPI を呼び出すとexit し呼び出し側に戻り,exit コマンドを使うのと同じである.ループの外でこのAPI を呼び出しても効果はない.

  • void dsSetColor(float red, float green, float blue);

オブジェクトの色を設定する.red(赤), green(緑), blue(青) は0 から1まで値である.

  • void dsSetColorAlpha(float red, float green, float blue, float alpha);

オブジェクトの色と透明度を設定する.red, gree, blue, alpha(透明度)は0 から1 まで値である.

  • void dsSetSphereQuality(int n);

球の描画の質を設定する.大きな値になるほど質は向上するが速度は遅くなる.デフォール値の1 の場合は正20 面体(頂点数12, 正三角形の面数20) となり,n の値が大きくなると多角形を構成する3 角形を再帰的に分割する.

  • dsSetCappedCylinderQuality(int n);

円柱の描画の質を設定する.大きな値になるほど質は向上するが速度は遅くなる.円柱の断面は4n 多角形となる.デフォール値の3 は12 角形となる.

  • void dsSetTexture(int texture_number);

オブジェクトのテクスチャを設定する.texture_number はDS_WOOD(木目) やDS_NONE(テクスチャなし) などのテクスチャ定数でなければいけない.現在のテクスチャは現在の色で塗られる.

  • void dsSetViewPoint(float xyz[3], float hpr[3]);

カメラの位置と視線を設定する.xyz はカメラの位置(x,y,z), hpr はカメラの視線heading(yow に相当), pitch, roll を表し単位は[°]である.ODEのAPIは全て角度をradianで表すが,このdrawstuffのAPIは角度を[°]で表すので注意.heading=0 はx 軸に沿った方向,pitch=0 は水平線の方向,roll=0 はロールなし.


  • dSpaceID dSimpleSpaceCreate(dSpaceID space);

単純な衝突検出計算用スペースを生成し,そのID 番号を返す..

  • void dSpaceCollide(dSpaceID space, void *data, dNearCallback *callback);

この関数は衝突しような2つのジオメトリペアの集団を探し,各ペアに3 番目の引数で指定するコールバック関数を呼び出す.そのコールバック関数はdNearCallback 型で次のように定義されている.

  • void dSpaceDestroy(dSpaceID);

スペースを破壊する.クリーンアップモードが1 の場合(デフォールト),スペースの中のジオメトリは自動的に破壊される.

  • void dSpaceCollide2(dGeomID o1, dGeomID o2, void *data, dNearCallback *callback);

あるスペースのジオメトリが別のスペースのジオメトリと衝突する可能性があるペアを計算しコールバック関数をよぶ.これは衝突検出を拘束にするためにスペースを階層状に構築している場合に役立つ.dSpaceCollide との違いはo1,o2 の2 つの引数をとることであり,コールバック関数を衝突する可能性のある全てのペアを呼ぶ.




T

  • dTriMeshDataID dGeomTriMeshDataCreate();

メッシュデータを保存するdTriMeshData オブジェクトを生成する.


U

V

W

  • WorldID dWorldCreate();

新しい動力学計算用ワールドを生成し,そのID 番号を返す.

  • void dWorldDestroy(dWorldID);

ワールドとその中にある全てを破壊する.これには,全てのボディとジョイントグループに含まれていない全ての関節が含まれる.ジョイントグループに含まれる全ての関節は例えば,dJointGroupEmpty などの関数呼び出しによって破壊される.


  • dReal dWorldGetCFM (dWorldID);
拘束力混合パラメータCFM (constraint force mixing) を取得する.
  • dReal dWorldGetERP (dWorldID);

関節誤差修正パラメータERP を取得する.

  • void dWorldGetGravity(dWorldID, dVector3 gravity);

world の重力ベクトルを取得する.地球の重力ベクトルはz 軸の向きを上にとると(0,0,-9.81) となる.デフォルト値は無重力(0,0,0) となる.


  • void dWorldSetGravity(dWorldID, dReal x, dReal y, dReal z);

ワールドの重力ベクトルを設定する.標準は(0,0,0) である.

  • void dWorldQuickStep(dWorldID, dReal stepsize);

ワールドを引数stepsize [s] だけ1ステップ進める.これは反復計算による方法であるためdWorldStep()より高速であるが,精度は高くない.計算量はO(mN),mは制約の行数,Nは繰り返し回数である.なお,Nのデフォルト値は20である.この値はdWorldSetQuickStepNumIteration()で設定する.


  • void dWorldSetQuickStepNumIteration(dWorldID, int num);
dWorldQuickStep()の繰り返し計算の回数を設定する.numの値を大きくすると精度は高くなるが速度は遅くなる.これを呼び出さない場合,つまりnumのデフォルト値は20である.
  • void dWorldStep(dWorldID, dReal stepsize);

ワールドを引数stepsize [s] だけ1ステップ進める.これは大きな行列を方法なので計算量はO(m3),メモリはO(m2) 必要になる.ここで,m は制約の行数である.大きなシステムではメモリが非常に多く必要になりとても遅くなるが,現在最も正確な方法である.

  • void dWorldSetGravity(dWorldID, dReal x, dReal y, dReal z);
world の重力ベクトルを設定する.地球の重力ベクトルはz 軸の向きを上にとると(0,0,-9.81) となる.デフォルト値は無重力(0,0,0) となる.
  • void dWorldSetCFM(dWorldID, dReal cfm);

拘束力混合パラメータCFM (constraint force mixing) の設定及び取得する.典型的な値は10