当前位置:   article > 正文

ODE(Open Dynamics Engine)学习笔记_ode模型是什么

ode模型是什么

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;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/105161
推荐阅读
相关标签
  

闽ICP备14008679号