[ODE] Falling object
Jon Watte (ODE)
hplus-ode at mindcontrol.org
Thu Oct 11 08:25:19 MST 2007
You have some bugs there. For example:
pos = (ic3dPos_t *) dBodyGetPosition( ball.bId );
memcpy( pos , &ball.pos , sizeof( icBody_t ) );
Pretty sure you want sizeof(ic3dPos).
dGeomSetData(ball.gId,(void*)"Falling Box");
You haven't actually created a geom at this point.
dQFromAxisAndAngle( a , 1 , 0 , 0 , planeRotation );
I believe axis/angle are set in radians, not degrees.
#define planeRotation 33
dBodySetGravityMode( floor1.bId , 0 );
If you want the ground to stand still, create a geom without a body, instead of turning off gravity. Else anything that collides with it will make it move.
Joao Pereira wrote:
> I have a problem my falling object passes through another box without
> stoping....
>
> this is my code:
>
> typedef struct ic3dPos{
> dReal x;
> dReal y;
> dReal z;
> }ic3dPos_t;
>
> typedef struct icBody{
> dBodyID bId;
> dGeomID gId;
> ic3dPos_t pos;
> dMass mass;
> }icBody_t;
>
>
> static dWorldID world;
> static dSpaceID space;
> icBody_t ball;
> icBody_t floor1,floor2;
> static dJointGroupID contactgroup;
>
> //With this parameters we simulate 1 secs
> #define nCicles 100
> #define stepSize 0.015
>
> #define sphereMass 1
> #define sphereRadius 1
>
> #define planeRotation 33
>
>
>
> static void nearCallback (void *data, dGeomID o1, dGeomID o2)
> {
> assert(o1);
> assert(o2);
>
> if (dGeomIsSpace(o1) || dGeomIsSpace(o2))
> {
> fprintf(stderr,"testing space %p %p\n", o1,o2);
> // colliding a space with something
> dSpaceCollide2(o1,o2,data,&nearCallback);
> // Note we do not want to test intersections within a space,
> // only between spaces.
> return;
> }
>
>
> const int N = 32;
> dContact contact[N];
> int n = dCollide (o1,o2,N,&(contact[0].geom),sizeof(dContact));
> if (n > 0)
> {
> printf("colliding in %d points\n",n);
> //fprintf(stderr,"testing geoms %p %p\n", o1, o2);
>
> for (int i=0; i<n; i++)
> {
> contact[i].surface.slip1 = 0.7;
> contact[i].surface.slip2 = 0.7;
> contact[i].surface.mode = dContactSoftERP | dContactSoftCFM |
> dContactApprox1 | dContactSlip1 | dContactSlip2;
> contact[i].surface.mu = 50.0; // was: dInfinity
> contact[i].surface.soft_erp = 0.96;
> contact[i].surface.soft_cfm = 0.04;
> dJointID c = dJointCreateContact (world,contactgroup,&contact[i]);
> dJointAttach (c,
> dGeomGetBody(contact[i].geom.g1),
> dGeomGetBody(contact[i].geom.g2));
>
> //printf("**contact(%d)(%f,%f,%f)**",i,contact[i].geom.pos[0],contact[i].geom.pos[1],contact[i].geom.pos[2]);
> //printf("**%s collide with %s
> **",(char*)dGeomGetData(contact[i].geom.g1),(char*)dGeomGetData(contact[i].geom.g2));
> }
> printf("\n");
> }
> }
>
> int main()
> {
> ic3dPos_t * pos;
> dMass bodyMass;
> //Creation of the world
> world = dWorldCreate();
> space = dSimpleSpaceCreate( 0 );
> contactgroup = dJointGroupCreate(0);
>
>
> //Gravity
> dWorldSetGravity( world , 0 , 0 , -9.81 );
>
> //Ball
> ball.bId = dBodyCreate( world );
> pos = (ic3dPos_t *) dBodyGetPosition( ball.bId );
> memcpy( pos , &ball.pos , sizeof( icBody_t ) );
> ball.gId = dCreateBox( 0 , 3 , 3 , 3 );
> dGeomSetData(ball.gId,(void*)"Falling Box");
>
>
> ball.pos.x = 0;
> ball.pos.y = 0;
> ball.pos.z = 10;
>
> dBodySetPosition( ball.bId , ball.pos.x , ball.pos.y , ball.pos.z );
>
> //set's the mass parameters
> dMassSetBoxTotal( &ball.mass , 5 , 3 , 3 , 3 );
> dBodySetMass( ball.bId , &ball.mass );
>
> dSpaceAdd (space, ball.gId );
> //floor
>
> floor1.bId = dBodyCreate( world );
> pos = (ic3dPos_t *) dBodyGetPosition( floor1.bId );
> memcpy( pos , &floor1.pos , sizeof( icBody_t ) );
> floor1.gId = dCreateBox( 0 , 10 , 10 ,1 );
> dGeomSetData(floor1.gId,(void*)"Plane Box");
>
> //set's the mass parameters
> dMassSetBoxTotal( &floor1.mass , 7.0 , 10 , 10 , 1 );
> dMassAdjust(&floor1.mass,sphereMass*10);
> dBodySetMass( floor1.bId , &floor1.mass );
>
> dQuaternion a;
> dQSetIdentity( a );
> dQFromAxisAndAngle( a , 1 , 0 , 0 , planeRotation );
>
> dGeomSetBody( floor1.gId , floor1.bId );
> dGeomSetPosition( floor1.gId , 0 , 0 , 1 );
>
> dBodySetGravityMode( floor1.bId , 0 );
>
> dSpaceAdd (space, floor1.gId );
>
>
> dBodyID pl = dBodyCreate( world );
>
> dGeomID plane;
> dTriMeshDataID triMesh;
> // Plane geometry
> const int indexes[6] = {2, 1, 0, 3, 2, 0};
> const dVector3 triVert[4] = {
> { 10.0, 10.0, 0},
> {-10.0, 10.0, 0},
> {-10.0, -10.0, 0},
> { 10.0, -10.0, 0}
> };
>
> triMesh = dGeomTriMeshDataCreate();
> dGeomTriMeshDataBuildSimple(triMesh, (dReal*)triVert, 4, indexes, 6);
> plane = dCreateTriMesh(space, triMesh, NULL, NULL, NULL);
> dGeomTriMeshEnableTC( plane , dBoxClass , 1 );
> dGeomSetData(plane, (void*)"Plane");
> dGeomSetPosition(plane, 0, 0, 0);
> dGeomSetBody( plane , pl );
> dBodySetGravityMode( pl , 0 );
>
> for( int i = 0 ; i < nCicles ; i++ )
> {
>
> const dReal *pos1;
> dVector3 size1,size2;
> pos1 = dBodyGetPosition( ball.bId );
> dGeomBoxGetLengths( ball.gId , size1 );
> ball.pos.x = pos1[0] - size1[0]/2;
> ball.pos.y = pos1[1] - size1[1]/2;
> ball.pos.z = pos1[2] - size1[2]/2;
> pos1 = dGeomGetPosition( floor1.gId );
> dGeomBoxGetLengths( floor1.gId , size2 );
> floor1.pos.x = pos1[0] - size2[0]/2;
> floor1.pos.y = pos1[1] - size2[1]/2;
> floor1.pos.z = pos1[2] + size2[2]/2;
> printf("%d:ball is in(%f,%f,%f)||floor(%f,%f,%f)\n",i ,
> ball.pos.x,ball.pos.y,ball.pos.z , floor1.pos.x,floor1.pos.y,floor1.pos.z);
> dSpaceCollide( space, NULL , &nearCallback );
> dWorldStep( world , stepSize );
> cicle = false;
> dJointGroupEmpty(contactgroup);
> }
>
> dBodyDestroy( floor1.bId );
> dBodyDestroy( ball.bId );
> dWorldDestroy( world );
>
> return 0;
> }
>
> Thnx for the help
>
> João Pereira
> _______________________________________________
> ODE mailing list
> ODE at ode.org
> http://ode.org/mailman/listinfo/ode
>
>
>
More information about the ODE
mailing list