常見的物理引擎有ode,newtow,phycisX,Havok以及子彈引擎等等
本文介紹ode物理引擎中常用的函數:
1.獲取物理引擎世界,大部分程序我們僅僅需要一個world(返回值為世界句柄)
dWorldID dWorldCreate();
2.銷毀給定的物理引擎世界和包含的所有物體和不包含在關節組中的所有關節
1 dWorldDestroy (dWorldID);
3.設置和獲取物理世界中的重力加速度
1 void dWorldSetGravity (dWorldID, dReal x, dReal y, dReal z);
2 void dWorldGetGravity (dWorldID, dVector3 gravity);
其單位是m/s^2,假定z軸向上的話,那么地球重力加速度是(0,0,-9.81)
在ode中默認的重力加速度是(0,0,0)
4.設置和獲取引擎仿真步修正誤差
1 void dWorldSetERP (dWorldID, dReal erp);
2 dReal dWorldGetERP (dWorldID);
典型的取值為(0.-0.8),默認取值為0.2
5.設置引擎全局混合約束力(constraint force mixing)
1 void dWorldSetCFM (dWorldID, dReal cfm);
2 dReal dWorldGetCFM (dWorldID);
典型取值為(10e-9,1)之間,
默認值為單精度時為10e-5,雙精度時為10e-10
6.物理世界的更新操作
1 void dWorldStep (dWorldID, dReal stepsize);
2 void dWorldQuickStep (dWorldID, dReal stepsize);
stepsize為步進大小一般可取為0.5f
可簡單描述為dWorldStep:精度高但是速度低
dWorldQuickStep:精度低但是速度快
7.設置和獲取仿真步迭代器個數
1
void dWorldSetQuickStepNumIterations (dWorldID, int num);
2
int dWorldGetQuickStepNumIterations (dWorldID);
默認的迭代器個數為20.迭代器越多則結果越精確但是速度會變慢
8.設置和獲取對象接觸修正速度
void dWorldSetContactMaxCorrectionVel (dWorldID, dReal vel);
dReal dWorldGetContactMaxCorrectingVel (dWorldID);
其默認值是沒有限制的
簡言之該函數決定了對象碰撞之后對象的速度變化上限
9.設置對象表面接觸深度
1 void dWorldSetContactSurfaceLayer (dWorldID, dReal depth);
2 dReal dWorldGetContactSurfaceLayer (dWorldID);
默認的大小是0也就是對象不會透過對象
給定一個極小值比如0.01可以預防振動問題
接下來是一些剛體函數:
10.獲取和銷毀給定空間中的剛體對象
1 dBodyID dBodyCreate (dWorldID);
2 void dBodyDestroy (dBodyID);
新生成的剛體質量為默認值,其位置在0點
銷毀一個剛體其附加的關節點并不會消除也就是說不會影響仿真
11.剛體的位置和旋轉操作
1 void dBodySetPosition (dBodyID, dReal x, dReal y, dReal z);
2 void dBodySetRotation (dBodyID, const dMatrix3 R);
3 void dBodySetQuaternion (dBodyID, const dQuaternion q);
4 void dBodySetLinearVel (dBodyID, dReal x, dReal y, dReal z);
5 void dBodySetAngularVel (dBodyID, dReal x, dReal y, dReal z);
6 const dReal * dBodyGetPosition (dBodyID);
7 const dReal * dBodyGetRotation (dBodyID);
8 const dReal * dBodyGetQuaternion (dBodyID);
9 const dReal * dBodyGetLinearVel (dBodyID);
10 const dReal * dBodyGetAngularVel (dBodyID);
這些函數含義很明顯,需要注意的就是
dBodyGetRotation返回的是一個4*3的旋轉矩陣
12.設置,獲取剛體質量
1 void dBodySetMass (dBodyID, const dMass *mass);
2 void dBodyGetMass (dBodyID, dMass *mass);
13.剛體受力
1 void dBodyAddForce (dBodyID, dReal fx, dReal fy, dReal fz);
2 void dBodyAddTorque (dBodyID, dReal fx, dReal fy, dReal fz);
3 void dBodyAddRelForce (dBodyID, dReal fx, dReal fy, dReal fz);
4 void dBodyAddRelTorque (dBodyID, dReal fx, dReal fy, dReal fz);
5 void dBodyAddForceAtPos (dBodyID, dReal fx, dReal fy, dReal fz,
6 dReal px, dReal py, dReal pz);
7 void dBodyAddForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz,
8 dReal px, dReal py, dReal pz);
9 void dBodyAddRelForceAtPos (dBodyID, dReal fx, dReal fy, dReal fz,
10 dReal px, dReal py, dReal pz);
11 void dBodyAddRelForceAtRelPos (dBodyID, dReal fx, dReal fy, dReal fz,
12 dReal px, dReal py, dReal pz);
四個參數的函數表明受力點為剛體質心
7個參數的函數表明受力點位剛體給定點位置
1 const dReal * dBodyGetForce (dBodyID);
2 const dReal * dBodyGetTorque (dBodyID);
3 void dBodySetForce (dBodyID b, dReal x, dReal y, dReal z);
4 void dBodySetTorque (dBodyID b, dReal x, dReal y, dReal z);
注意這是剛體受力和扭矩設置,獲取函數
這對于清空剛體受力或者扭矩很有作用
最后是幾個ode空間函數
14.空間的構造和析構
1 dSpaceID dSimpleSpaceCreate (dSpaceID space);
2 dSpaceID dHashSpaceCreate (dSpaceID space);
3 dSpaceID dQuadTreeSpaceCreate (dSpaceID space, dVector3 Center, dVector3 Extents, int Depth);
4 void dSpaceDestroy (dSpaceID);
15.空間平面坐標系設定
dCreatePlane(space, a, b, c, d);
參數a,b,c,d滿足以下函數關系
ax+by+cz = d;
那么
1 dCreatePlane(space, 0, 1, 0, 0);
2 dWorldSetGravity(world, 0, -0.8, 0);
的含義是
以空間y軸為重力加速度效果方向
其重力加速度大小為-0.8速度為沿y軸向下.