赞
踩
https://tech.hqew.com/fangan_788777
此外,在ODE仿真环境中,可通过两种方式来模拟弹簧-阻尼系统: (1)通过设置ERP(Error Reduction Parameter)和CFM(Constraint Force Mixing)两个参数来实现,ERP为每一仿真循环中的修正误差,取值范围为00.8,默认取值为0.2;CFM代表物理引擎的全局混合约束力,它反映物体表面的柔软程度,其取值范围为10e-91;(2)利用动力学方程来求解,即胡克定律:
(3)物体碰撞检测
本文将与物理引擎有关的操作函数封装成动态链接库,通过使用动态链接库技术,软件可以实现模块化,即由相对独立的组件来组成整个软件。这简化了软件项目的管理,而且能够节省内存,也有助于资源共享和代码更新移植。
ODE 的碰撞检测引擎需要给定两个物体的形状信息。在每一仿真循环中,调用dSpaceCollide函数获取可能发生接触的物体,再由该函数指定的碰撞回调函数nearCallback将接触点信息传给用户。由此,用户可根据自身需要建立物体间的碰撞连接点,每个连接点都有相应的dContactGeom 结构,该结构保存着碰撞点的位置和两个物体互相进入对方的深度。为了提高仿真速度,软件使用较少的关节和较少的接触面,如果条件允许,也可以使用无摩擦或者粘性接触面。下面给出碰撞回调函数中关于接触面的参数设置:
surface。mu=3.0; //库仑摩擦力系数
surface。mu2=0.0; //库仑摩擦力系数2
surface.slip1=0.05; //摩擦力1方向的滑动摩擦力
surface.slip2=0.05; //摩擦力2方向的滑动摩擦力
surface.bounce=0.9; //反弹系数
surface.bounce_vel=1.0; //反弹所需要的最小碰撞速度
surface.soft_erp=0.2; //接触点法线方向“柔软”参数
surface.soft_cfm=1e-4; //接触点法线方向"柔软"参数
http://www.cppblog.com/gaimor/archive/2010/02/26/108477.html
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的旋转矩阵
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);
注意这是刚体受力和扭矩设置,获取函数
这对于清空刚体受力或者扭矩很有作用
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轴向下
https://blog.csdn.net/hcx25909/article/details/8759021
ODE手册(6)关节类型和相关函数
https://blog.csdn.net/guojiangtao51/article/details/16825563
static void setBody(bodyStr *b, char k, char c, double l, double w, double h, double r, double x, double y, double z, int ge, double ma) { //引数: ボディの種類 色 長さ 幅 高さ 半径 前後位置 左右位置 上下位置 ジオメト 重量 //车身的种类颜色长度宽度高度半径前后位置左右位置上下位置几何 dMass m; //スケール調整 l /= 1000; w /= 1000; h /= 1000; r /= 1000; x /= 1000; y /= 1000; z /= 1000; //構造体に記録する b->k = k; //ボディの種類を記録 b->c = c; //ボディの色の種類を記録 b->l = l; //ボディの長さを記録 b->w = w; //ボディの幅さを記録 b->h = h; //ボディの高さを記録 b->r = r; //ボディの半径を記録 b->ge = ge; //ジオメトリ設定 有/無 b->e = 1; //ボディ有効設定 x += 2; //2m手前に置いて地面障害物を避ける body[bodyCount] = b; //構造体のアドレスを格納する ++bodyCount; //ボディ数カウントアップ //ボディとジオメトリの生成と、質量、位置、関連性を設定 switch (b->k) { case 'b': //箱型 b->b = dBodyCreate(world); // 物体の存在を生成(ボディID設定) dMassSetZero(&m); // 質量パラメータ初期化 dMassSetBoxTotal(&m, ma, b->l, b->w, b->h); // 物体の重量設定 dBodySetMass(b->b, &m); // 物体の重量分布設定 dBodySetPosition(b->b, x, y, (z)); // 物体の初期位置 if (ge > 0) { b->g = dCreateBox(space, b->l, b->w, b->h); // 物体の幾何情報を生成(ジオメトリID設定) dGeomSetBody(b->g, b->b); // 物体の『存在』と『幾何情報』の一致 } break; case 's': //球形 b->b = dBodyCreate(world); // 物体の存在を生成(ボディID設定) dMassSetZero(&m); // 質量パラメータ初期化 dMassSetSphereTotal(&m, ma, b->r); // 物体の重量設定 dBodySetMass(b->b, &m); // 物体の重量分布設定 dBodySetPosition(b->b, x, y, z); // 物体の初期位置 if (ge > 0) { b->g = dCreateSphere(space, b->r); // 物体の幾何情報を生成(ジオメトリID設定) dGeomSetBody(b->g, b->b); // 物体の『存在』と『幾何情報』の一致 } break; case 'c': //カプセル形 b->b = dBodyCreate(world); // 物体の存在を生成(ボディID設定) dMassSetZero(&m); // 質量パラメータ初期化 dMassSetCapsuleTotal(&m, ma, 3, b->r, b->l); // 物体の重量設定 dBodySetMass(b->b, &m); // 物体の重量分布設定 dBodySetPosition(b->b, x, y, (b->l / 2 + z)); // 物体の初期位置 if (ge > 0) { b->g = dCreateCapsule(space, b->r, b->l); // 物体の幾何情報を生成(ジオメトリID設定) dGeomSetBody(b->g, b->b); // 物体の『存在』と『幾何情報』の一致 } break; case 'y': //円柱形 b->b = dBodyCreate(world); // 物体の存在を生成(ボディID設定) dMassSetZero(&m); // 質量パラメータ初期化 dMassSetCylinderTotal(&m, ma, 3, b->r, b->l); // 物体の重量設定 dBodySetMass(b->b, &m); // 物体の重量分布設定 dBodySetPosition(b->b, x, y, (z)); // 物体の初期位置 if (ge > 0) { b->g = dCreateCylinder(space, b->r, b->l); // 物体の幾何情報を生成(ジオメトリID設定) dGeomSetBody(b->g, b->b); // 物体の『存在』と『幾何情報』の一致 } break; default: break; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。