添加了一个斜平面, 先来看看效果
这次不再用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();
}