Cpper
C/C++高级工程师 Android高级软件工程师 IT集成工程师 音频工程师 熟悉c,c++,java,c#,py,js,asp等多种语言 程序猿
常见的物理引擎有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.设置和获取仿真步迭代器个数
1void dWorldSetQuickStepNumIterations (dWorldID, int num);
2int 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, 0100);
2 dWorldSetGravity(world, 0-0.80);
的含义是
以空间y轴为重力加速度效果方向
其重力加速度大小为-0.8速度为沿y轴向下.
posted on 2010-02-26 11:04 ccsdu2009 阅读(4132) 评论(2)  编辑 收藏 引用
Comments
  • # re: ode物理引擎函数介绍(1)
    陈梓瀚(vczh)
    Posted @ 2010-02-26 11:41
    ODE是一个多少年前的博士生的毕业论文的附件,你可以去看看那篇论文。  回复  更多评论   
  • # re: ode物理引擎函数介绍(1)
    footee
    Posted @ 2010-02-26 12:42
    ode除了模拟刚体不错以外,在模拟软质物体方面还是有缺陷的。  回复  更多评论   

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理