[ODE] Bowling physics

samira S. samila_1 at hotmail.com
Thu May 10 03:57:43 MST 2007


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                         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.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);



         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}))",
            	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);


            	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   

		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 | 

               		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]);


Haben Spinnen Ohren? Finden Sie es heraus – mit dem MSN Suche Superquiz via  
http://www.msn-superquiz.de  Jetzt mitmachen und gewinnen!

More information about the ODE mailing list