关节运动 in ODE

来源:互联网 发布:java如何开发流程 编辑:程序博客网 时间:2024/04/27 18:35

首先是想象图



这个是用球想象出来的,实际上是capsule型, 与地面碰撞效果会有差别.

但是现阶段我没有任何添加openGL描画的打算,等到ODE结束才有可能.

简单地说 ball1 和ball3是球, 2是capsule, 1与2之间有一个看不见的link


下面先是数据

ball00.0000000.0000003.235060ball10.0000000.2000001.235060ball20.3000000.0000000.21663ball00.0000000.0000003.119420ball10.0000000.2000001.119420ball20.3000000.0000000.22369ball00.0000000.0000003.002800ball10.0000000.2000001.002800ball20.3000000.0000000.22977ball00.0000000.0000002.885200ball10.0000000.2000000.885200ball20.3000000.0000000.23487ball0-0.000254-0.0013692.784963ball1-0.0102460.2076440.786363ball20.310500-0.0062750.20090ball0-0.000435-0.0027562.683272ball1-0.0206680.2154400.686290ball20.321103-0.0126840.16668ball0-0.001590-0.0089772.682007ball1-0.0214240.2069080.688732ball20.311536-0.0056510.17330ball0-0.002784-0.0151452.678185ball1-0.0220790.1986560.691771ball20.3019640.0013850.17894ball0-0.005595-0.0204402.675371ball1-0.0235210.1910330.698514ball20.3039340.0007930.18315ball0-0.008442-0.0257882.670250ball1-0.0247590.1839240.705093ball20.3062350.0000270.18688ball0-0.011281-0.0311122.663223ball1-0.0259640.1768890.711242ball20.308729-0.0009570.19001ball0-0.014113-0.0364332.654536ball1-0.0271420.1699350.716813ball20.311364-0.0021090.19244


取了最具代表性,ball2刚着地一瞬间. 可以看到棒状物向一侧倾斜了, 然后被球压着向一侧移动

稳定时的特征更加明显

ball0-0.709618-2.2780180.199959ball1-0.829602-0.5384380.482713ball20.746051-0.1922990.19999ball0-0.715988-2.2757130.199966ball1-0.843418-0.5327400.477135ball20.748685-0.1934520.19999ball0-0.722317-2.2733660.199972ball1-0.857248-0.5270440.470613ball20.751319-0.1946040.19999ball0-0.728610-2.2709770.199977ball1-0.871091-0.5213520.463145ball20.753954-0.1957570.19999ball0-0.734868-2.2685470.199980ball1-0.884944-0.5156690.454731ball20.756588-0.1969100.19999ball0-0.741095-2.2660740.199983ball1-0.898807-0.5099960.445368ball20.759223-0.1980620.19999ball0-0.747293-2.2635570.199986ball1-0.912676-0.5043400.435056ball20.761857-0.1992150.19999ball0-0.753466-2.2609930.199987ball1-0.926552-0.4987030.423795ball20.764492-0.2003680.19999


下面是源代码


Mac-mini:ode$ cat example3.d
import std.stdio;import ode;static dWorldID world;static dSpaceID space;static dGeomID ground;static dJointGroupID contactgroup;struct obj{dBodyID b;dGeomID geom;dReal radius, length, mass;dReal x,y,z;}obj*[] ball;extern(System) void nearCallBack(void* date, dGeomID o1, dGeomID o2){const int N = 10;dContact[N] contact;int n = dCollide(o1,o2,N,&contact[0].geom,dContact.sizeof);for(int i=0;i<n;i++){with (contact[i].surface){mode = dContactBounce;mu = dInfinity;bounce = 0.;bounce_vel = 0.;}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){pos = dBodyGetPosition(b.b);write("ball",k,"\t");foreach(i;0..3) writef("%.6f\t",*(pos+i));}writeln();}void createSphere(obj* b){b.b = dBodyCreate(world);b.geom = dCreateSphere(space, b.radius);dMass m1;dMassSetZero(&m1);dMassSetSphereTotal(&m1,b.mass,b.radius);dBodySetMass(b.b,&m1);dBodySetPosition(b.b, b.x,b.y,b.z);dGeomSetBody(b.geom, b.b);}void createPole(obj* b){b.b = dBodyCreate(world);b.geom = dCreateCapsule(space, b.radius, b.length);dMass m1;dMassSetZero(&m1);dMassSetCapsuleTotal(&m1,b.mass,3, b.radius, b.length);dBodySetMass(b.b,&m1);dBodySetPosition(b.b, b.x,b.y,b.z);dGeomSetBody(b.geom, b.b);}void createLink(obj* b1, obj* b2){auto joint = dJointCreateHinge(world, null);dJointAttach(joint, b1.b, b2.b);dJointSetHingeAnchor(joint, b1.x, b1.y, b1.z - b1.radius);dJointSetHingeAxis(joint, 1,0 ,0);}void main(){dInitODE();world = dWorldCreate();space = dHashSpaceCreate(null);contactgroup = dJointGroupCreate(0);dWorldSetGravity(world, 0, 0, -9.8);ground = dCreatePlane(space, 0,0,1,0);ball ~= new obj(null,null,0.2,1,1,0,0,10);ball ~= new obj(null,null,0.2,1,1,0,0.2,8);ball ~= new obj(null,null,0.2,1,1,0.3,0,6);createSphere(ball[0]);createPole(ball[1]);createSphere(ball[2]);createLink(ball[0],ball[1]);foreach(i;0..300) simLoop();dWorldDestroy(world);dCloseODE();}


整理了下,看起来比前面好了些,不过还是不怎么样. 过一会再重写一下.

原创粉丝点击