[ODE] Sphere vs trimesh problem again :(
Peter Libič
peter.libic at seznam.cz
Thu Apr 27 00:27:22 MST 2006
Hi,
I'm trying to write something like test_buggy on the trimesh terrain.
So I copied most of code that creates buggy in the test and tried to
drop it on trimesh terrain.
But the "wheels" are fallin down through terrain.
Small viedo is here (122K) : http://www.ptus.sk/petko/tst.avi
The small cubes in corners are wheels - their geom is sphere, i only
don't have something to draw asphere yet.
If I change the spheres to boxes, everything seems to be OK.
I'm using dWorldQuickStep with time 0.01s, but dWorldStep results in
same behaviour.
Normals of the trimesh are pointing up.
Compiled with ODE from svn trunk with vs2005 and double precision.
Here's body creation code:
dBodyID bID= dBodyCreate( sim->mODEWorld );
GLVector3d pos = we->getPosition();
dBodySetPosition( bID, pos.x, pos.y, pos.z );
GLQuaterniond rot = we->getOrientation();
dQuaternion quat;
quat[0] = rot.getW();
quat[1] = rot.getV().x;
quat[2] = rot.getV().y;
quat[3] = rot.getV().z;
dBodySetQuaternion( bID, quat );
dMass m;
dMassSetBox (&m,1,len,wid,hei);
dMassAdjust (&m, 1); dBodySetMass (bID,&m);
dGeomID gID = dCreateBox( sim->mODEOtherSpace, len, wid, hei );
dGeomSetBody (gID,bID);
// wheel bodies
dBodyID wheel[4];
dGeomID wgeom[4];
for ( int i=0; i<4; i++ )
{
wheel[i] = dBodyCreate( sim->mODEWorld );
dMass mass;
dBodySetQuaternion (wheel[i],quat);
dMassSetSphere (&mass,1,WHEEL_RADIUS);
dMassAdjust (&mass,1);
dBodySetMass (wheel[i],&mass);
wgeom[i] = dCreateSphere ( sim->mODEOtherSpace, WHEEL_RADIUS );
//wgeom[i] = dCreateBox( sim->mODEOtherSpace, 2,2,2 );
dGeomSetBody( wgeom[i],wheel[i] );
}
dBodySetPosition( wheel[0], pos.x + len / 2 , pos.y + wid / 2,
pos.z - hei / 2 );
dBodySetPosition( wheel[1], pos.x + len / 2 , pos.y - wid / 2,
pos.z - hei / 2 );
dBodySetPosition( wheel[2], pos.x - len / 2 , pos.y + wid / 2,
pos.z - hei / 2 );
dBodySetPosition( wheel[3], pos.x - len / 2 , pos.y - wid / 2,
pos.z - hei / 2 );
//wheel hinges
dJointID joint[4];
for ( int i=0; i<4; i++ )
{
joint[i] = dJointCreateHinge2( sim->mODEWorld, 0 );
dJointAttach (joint[i], bID, wheel[i] );
const dReal *a = dBodyGetPosition ( wheel[i] );
dJointSetHinge2Anchor(joint[i],a[0],a[1],a[2]);
GLVector3d rot_axis = we->getOrientation().rotateVector(
GLVector3d( 0, 1, 0 ) );
GLVector3d susp_axis = we->getOrientation().rotateVector(
GLVector3d( 0, 0, 1 ) );
/*
dJointSetHinge2Axis1(joint[i],0,0,1);
dJointSetHinge2Axis2(joint[i],0,1,0);
*/
dJointSetHinge2Axis1( joint[i], susp_axis.x, susp_axis.y,
susp_axis.z );
dJointSetHinge2Axis2( joint[i], rot_axis.x, rot_axis.y,
rot_axis.z );
}
// set joint suspension - if uncommented this, nothing improves
/*
for (int i=0; i<4; i++)
{
dJointSetHinge2Param (joint[i],dParamSuspensionERP,0.4);
dJointSetHinge2Param (joint[i],dParamSuspensionCFM,0.8);
}
*/
// lock wheels along the steering axis
for (int i=0; i<4; i++)
{
// set stops to make sure wheels always stay in alignment
dJointSetHinge2Param (joint[i],dParamLoStop,0);
dJointSetHinge2Param (joint[i],dParamHiStop,0);
}
And here is contact creation code:
contact[i].surface.mode = /*dContactBounce |*/
dContactSoftCFM; //uncomenting bounce doesn't help
contact[i].surface.mu = 0005;
contact[i].surface.mu2 = 0;
contact[i].surface.bounce = 0.5;
contact[i].surface.bounce_vel = 0.0;
contact[i].surface.soft_cfm = 0.01;
dJointID c =
dJointCreateContact(sim->mODEWorld,sim->mODEContacts, &contact[i]);
dJointAttach
(
c,
dGeomGetBody(contact[i].geom.g1),dGeomGetBody(contact[i].geom.g2)
);
Anyone any suggestions?
Tahnks a lot,
Petko
More information about the ODE
mailing list