ODEDynamics: Newton Ball Experiment

Author:Alex Dumitrache (alex@cimr.pub.ro)
Date:2010/05/05

In this tutorial you will create a simplified version of Newton’s Cradle.

You will also learn how to apply forces to objects in the scene.

Initializing

Let’s set some contact properties and simulation parameters:

defaultContactProps = ODEContactProperties(bounce = 1, mu = 1, soft_erp=0.5, soft_cfm=1E-10)
odeSim = ODEDynamics(gravity=9.81, substeps=100, defaultcontactproperties = defaultContactProps, use_quick_step = False)

We would also like some colorful balls:

matRed = GLMaterial(name="Red", diffuse=(1,0,0))
matGreen = GLMaterial(name="Green", diffuse=(0,1,0))

Now let’s create a ground plane, one red ball and 3 green balls:

p = Plane(lx=2.5, ly=1)
s  = Sphere(radius = 0.1, pos = ( -1, 0, 0.1), mass = 1, material = matRed)
s1 = Sphere(radius = 0.1, pos = (  0, 0, 0.1), mass = 1, material = matGreen)
s2 = Sphere(radius = 0.1, pos = (0.2, 0, 0.1), mass = 1, material = matGreen)
s3 = Sphere(radius = 0.1, pos = (0.4, 0, 0.1), mass = 1, material = matGreen)
odeSim.add(list(worldroot.iterChilds()))

Save all these 3 snippets as newton-ball.py and run the code. You should see this:

_images/newton-ball.png

Ready to hit the red ball?

To apply a force or an impulse to an object, you should use its ODEBodyManipulator, which is available using obj.manip.

We will use addForce method, like this:

obj.manip.addForce((fx,fy,fz))

If you call addForce once, it will behave like an impulse! The force will be applied in a single time step (of course, during all its substeps).

To specify a continuous force, e.g. similar to gravity, you have to call addForce in the STEP_FRAME event handler. You will see this in the ODEDynamics: Falling Boxes tutorial.

For our red ball, the impulse is OK. We will define a keyboard event handler, to handle these keys:

  • H = hit the red ball
  • R = reset the simulation
def onKeyPress(K):
    if K.key.lower() == 'h':
        s.manip.addForce((100,0,0))
    if K.key.lower() == 'r':
        eventmanager.event(RESET)

eventmanager.connect(KEY_PRESS, onKeyPress)

print """
Press H to hit the balls
Press R to restart the simulation
"""

Add this last snippet to newton-ball.py and run it again. Press H and enjoy!

_images/newton-ball-hit.png

You may also download the complete script newton-ball.py.

Exercises

  • Try setting mu to 0, to 1000, and then to ode.Infinity to see what happens!
  • Try setting substeps to 1, 5, 1000 and 5000. Also try to switch between quickStep and step.

Next steps

  • Try a more realistic example of the Newton’s Cradle, and play with the simulation parameters.
  • Try to simulate the opening break shot in a billiard game. If the result is nice, please send it to us :)
  • Read the next tutorial: ODEDynamics: Falling Boxes.

Table Of Contents

Previous topic

ODEDynamics: Bouncing Sphere

Next topic

ODEDynamics: Falling Boxes

This Page