斜平面上的碰撞 in ODE with 更漂亮的可视化

添加了一个斜平面, 先来看看效果

这次不再用gnuplot了, 换了个漂亮点的


这玩意作图就是导入麻烦,没法通过代码(所想即所得), 只能拿鼠标点来点去(所见即所得), 不是我所喜欢的类型...

不过效果没的说,

模拟时平面是无限大的,所以可以看到小球跳跃前进

其他与上一篇里一样,两个盒子用joint连在一起,共同跳跃前进.


其实让它们从更高的地方下落会更漂亮:



这下有点感觉了.


Mac-mini:ode$ cat example5.d
import std.stdio;
import ode;

static dWorldID world;
static dSpaceID space;
static dGeomID ground;
static dJointGroupID contactgroup;
static dJointID fixed;
dJointFeedback* feedback;

struct obj{
	dBodyID b;
	dGeomID geom;
	dReal radius, length, mass;
	dReal x,y,z;
	dReal width, height;
}

obj*[] ball;

extern(System) void nearCallBack(void* date, dGeomID o1, dGeomID o2){
	const maxContacts = 10;
	dContact[maxContacts] contact;
	int numc = dCollide(o1, o2, maxContacts, &contact[0].geom, dContact.sizeof);
	if (numc>0) {
		for (uint i = 0; i< numc; i++) {
			with (contact[i].surface){
				mode = dContactSoftCFM | dContactSoftERP | dContactApprox1;
				mu = dInfinity;
				soft_cfm = 1e-8;
				soft_erp = 1.;
			}
			dJointID c = dJointCreateContact(world, contactgroup, &contact[i]);
			dJointAttach(c, dGeomGetBody(contact[i].geom.g1), dGeomGetBody(contact[i].geom.g2));
		}
	}
}

void simLoop(){
	dSpaceCollide(space, null ,&nearCallBack);
	dWorldStep(world, 0.01);
	dJointGroupEmpty(contactgroup);
	dReal* pos;
	foreach(k,b;ball){
		writef("ball%d\t", k);
		pos = dBodyGetPosition(b.b);
		foreach(i;0..3) writef("%.6f\t",*(pos+i));
	}
	writeln();
	//writeln(*feedback);
}

void createBox(obj* b){
	b.b = dBodyCreate(world);
	b.geom = dCreateBox(space, b.length, b.width, b.height);
	dMass m1;
	dMassSetZero(&m1);
	dMassSetBoxTotal(&m1,b.mass,b.length, b.width, b.height);
	dBodySetMass(b.b,&m1);
	dBodySetPosition(b.b, b.x,b.y,b.z);
	dGeomSetBody(b.geom, b.b);
}

void createFixedJoint(obj* b1, obj* b2){
		fixed = dJointCreateFixed(world,null);
		dJointAttach(fixed,b1.b,b2.b);
		dJointSetFixed(fixed);    
		dJointSetFeedback(fixed,feedback);
}

void main(){
	feedback = new dJointFeedback;
	dInitODE();
	world = dWorldCreate();
	space = dHashSpaceCreate(null);
	contactgroup = dJointGroupCreate(0);
	dWorldSetERP(world, 0.5);
	dWorldSetCFM(world, 1e-3);

	dWorldSetGravity(world, 0, 0, -9.8);
	ground = dCreatePlane(space, 0.5,0.5,1,0);

	ball ~= new obj(null,null,0.2,0.2,1,0,0,5.1,0.2,0.2);
	ball ~= new obj(null,null,0.2,0.2,1,0,0,5.8,0.2,0.2);
	foreach(b;ball) createBox(b);
	createFixedJoint(ball[0], ball[1]);

	foreach(i;0..300) simLoop();

	dWorldDestroy(world);
	dCloseODE();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值