[ODE] Bowling physics
samira S.
samila_1 at hotmail.com
Thu May 10 03:58:00 MST 2007
Hello
I need to get some realistic Bowling-Physics by using ODE.
Actually this should not be too hard, but I am new to physics engines and I
have the following problems:
I created two boxes which should approximate my BowlingPins. However when I
tried to let a sphere push them over, they just slipped away on the ground
(approximated by a plane)
I tried to change several Parameters, like friction (surface.mu,
surface.mu2), mass, the spheres velocity and initial force, but the boxes
were never pushed over, they only slide away.
Then I tried the following:
Box1 is standing on the plane and Box2 is on top of it, but horizontal, in
such a way that it should fall down (see picture). In addition I let a
sphere fall on Box2 so that the Box should really fall down. However, this
didn´t happen. The sphere just stayed on Box2.
O Sphere
------------- Box2 is horizontal
l
l
l
l
l Box1 is vertical
Please, can anyone tell me what I am doing wrong in my implementation, or
which parameter could be wrong or missing?
I am using Visual Studio C# and the Tao-Framework-bindings for ODE. But
anyone who knows ODE should understand my Code as well:
private void main()
{
world = Ode.dWorldCreate();
Ode.dWorldSetGravity(world, 0,0,-9.81f);
space = Ode.dSimpleSpaceCreate(System.IntPtr.Zero);
contactgroup = Ode.dJointGroupCreate(0);
floorGeom = Ode.dCreatePlane(space,0,0,1.0f,0);
sphere_body = Ode.dBodyCreate(world);
sphere_geom = Ode.dCreateSphere(space,10);
pin1_body = Ode.dBodyCreate(world);
pin1_geom = Ode.dCreateBox(space,10,10,100);
pin2_body = Ode.dBodyCreate(world);
pin2_geom = Ode.dCreateBox(space,10,100,10);
Ode.dGeomSetBody(sphere_geom,sphere_body);
Ode.dGeomSetBody(pin1_geom,pin1_body);
Ode.dGeomSetBody(pin2_geom,pin2_body);
Ode.dMass sphere_mass = new Ode.dMass();
Ode.dMassSetSphere(ref mass, 2500, 10);
Ode.dMass pin1_mass = new Ode.dMass();
Ode.dMassSetBox(ref pin1_mass,2500,10,10,100);
Ode.dMass pin2_mass = new Ode.dMass();
Ode.dMassSetBox(ref pin2_mass,2500,10,100,10);
sphere_mass.mass = 100;
pin1_mass.mass = 15;
pin2_mass.mass = 15;
Ode.dBodySetMass(sphere_body, ref sphere_mass);
Ode.dBodySetMass(pin1_body,ref pin1_mass);
Ode.dBodySetMass(pin2_body,ref pin2_mass);
Ode.dBodySetPosition(sphere_body,0,10,190);
Ode.dBodySetPosition(pin1_body,0,80,50);
Ode.dBodySetPosition(pin2_body,0,50,105);
Ode.dBodySetLinearVel(sphere_body,0,0,-2000);
float time = 0;
float deltaTime = 0.04f;
while(time < 2)
{
//Get the bodies position
Ode.dVector3 position = Ode.dBodyGetPosition(sphere_body);
Ode.dVector3 pin1_position = Ode.dBodyGetPosition(pin1_body);
Ode.dVector3 pin2_position = Ode.dBodyGetPosition(pin2_body);
//Get the bodies velocity
Ode.dVector3 velocity = Ode.dBodyGetLinearVel(sphere_body);
Ode.dVector3 pin1_velocity = Ode.dBodyGetLinearVel(pin1_body);
Ode.dVector3 pin2_velocity = Ode.dBodyGetLinearVel(pin2_body);
//Get the bodies Rotation
// convert the quaternion to an axis angle so we can put the rotation
Ode.dQuaternion rotation = new Ode.dQuaternion();
Ode.dGeomGetQuaternion(pin2_geom,ref rotation);
float cos_a = rotation.W;
float angle = (float)(Math.Acos(cos_a) * 2.0f);
float sin_a = (float)(Math.Sqrt(1.0f - cos_a * cos_a));
if (Math.Abs(sin_a) < 0.0005f)
sin_a = 1.0f;
sin_a = 1.0f / sin_a;
float x_axis = rotation.X * sin_a;
float y_axis = rotation.Y * sin_a;
float z_axis = rotation.Z * sin_a;
// Print out the 'time', the body's position, rotation and its velocity
Console.WriteLine("{0} sec: rot_angel={1} rot_axis=({2}, {3}, {4}))",
time,angle,x_axis,y_axis,z_axis);
Console.WriteLine("{0:0.00} sec: pos=({1:0.00}, {2:0.00},
{3:0.00}) vel=({4:0.00}, {5:0.00}, {6:0.00})",
time, position[0], position[1], position[2], velocity[0],
velocity[1], velocity[2]);
Ode.dSpaceCollide(space,(IntPtr)1, new Ode.dNearCallback(cbTest));
Ode.dWorldStep(world, deltaTime);
Ode.dJointGroupEmpty(contactgroup);
time += deltaTime;
}
}//end main
// nearCallback:
static void cbTest(IntPtr data, IntPtr o1, IntPtr o2)
{
IntPtr b1 = Ode.dGeomGetBody(o1);
IntPtr b2 = Ode.dGeomGetBody(o2);
int MAX_COLLISIONS = 128;
Ode.dContactGeom[] contactGeoms = new
Ode.dContactGeom[MAX_COLLISIONS];
int numc = Ode.dCollide(o1,o2,MAX_COLLISIONS,contactGeoms,sizeOf());
Ode.dContact[] contact = new Tao.Ode.Ode.dContact[numc];
for(int i=0; i<numc; i++)
{
contact[i].surface.mode =
(int)Ode.dContactFlags.dContactBounce |
(int)Ode.dContactFlags.dContactSoftCFM;
contact[i].surface.mu = 5;
contact[i].surface.mu2 = 5;
contact[i].surface.bounce = 0.1f;
contact[i].surface.bounce_vel = 0.1f;
contact[i].surface.soft_cfm = 0;
contact[i].geom = contactGeoms[i];
IntPtr joint =
Ode.dJointCreateContact(world,contactgroup,ref contact[i]);
Ode.dJointAttach(joint,b1,b2);
}
}
Regards,
Samira
_________________________________________________________________
Sie suchen E-Mails, Dokumente oder Fotos? Die neue MSN Suche Toolbar mit
Windows-Desktopsuche liefert in sekundenschnelle Ergebnisse. Jetzt neu!
http://desktop.msn.de/ Jetzt gratis downloaden!
More information about the ODE
mailing list