Programming Physics Games with OpenGL
Daniel Pope ~ @lordmauve
Code samples are available at
https://bitbucket.org/lordmauve/physicsgames
Outline
• Introduction to OpenGL
• Introduction to physics engines
• Connecting the two
• A bit more about physics engines
• Tips on writing games
What is OpenGL?
• Low-level 2D and 3D graphics library
• Usually hardware accelerated
• Can only draw points, lines, triangles
• But triangles can be textured
• GPUs can evaluate a short program for each vertex or
fragment in a high-level language
What is a physics engine?
Given a model of the world at time t
Apply physical laws to compute a model of the world at
time t + ∆t
(for small ∆t)
(demo 1)
PyBox2D
http://pybox2d.googlecode.com
http://www.pymunk.org
PyODE
http://pyode.sourceforge.net/
PyNewt
http://code.google.com/p/pynewt/
PyBullet
https://launchpad.net/pybullet
OpenGL wrapper/scenegraph
• Higher level API
• Window Creation
• Texture Loading
• Sprites/Texture Atlases
• Model Loading/Rendering/Animation
• PVS – Potentially Visible Set calculation
• Graphics Algorithms
pyglet
cocos2d
kivy
http://www.pyglet.org/
http://cocos2d.org/
http://kivy.org/
Panda3D
http://www.panda3d.org/
Python-Ogre
http://www.python-ogre.org/
PyCrystal
http://www.crystalspace3d.org/main/PyCrystal
apt-get install python-box2d
apt-get install python-pyglet
(pyBox2D == 2.0.2ish)
What a game does
while True:
dt = wait_one_frame()
process_input()
update_world(dt)
draw_world()
(demo 2)
A physics simulation
• Newton's Laws
• Collisions
• Constraints (eg. Joints)
Newtonian Quantities
Mass/Inertia
Force
Position
Velocity
Acceleration
Momentum
Impulse
Rotational Equivalents
Linear Angular
Mass/Inertia Moment of Inertia
Force Moment/Torque
Position Angle
Velocity Angular Velocity
Acceleration Angular Acceleration
Momentum Angular Momentum
Impulse Angular Impulse
Approximately
net_force = sum(forces)
acceleration = force / mass
velocity += acceleration * dt
position += velocity * dt
forces = [GRAVITY * mass]
+ rotational equivalents
Time step
Collisions
• Detect when two shapes intersect
• Broad phase (O(n log n)?, approximate)
• Narrow phase (O(n²))
• Exchange momentum
• Move them apart, keep them apart
Shapes are convex polygons/polyhedra
✔✗ ✔
Separating Axis Theorem
Given two convex shapes,
it is possible to draw a straight
line between them if and only
if the two do not intersect.
Bodies
Collections of shapes
Compute centre of mass
Compute moment of inertia
Creating bodies
Linking physical objects with OpenGL
• Draw sprites
• Create physical models corresponding to sprites
• Instantiate objects into physics simulation
Each frame:
• Step time
• Read position + angle of body
• Draw OpenGL quads/sprites at position + angle
(0, 1)
(0, 0) (1, 0)
(1, 1)
(0, 1)
(0, 0)
(1, 0)
(1, 1)
Texture Coordinates
Drawing textured quads
(demo 3)
Collision Callbacks
What happens in game when shapes collide?
Register a callback to take action
• Destroy/change the object
• Create a joint
• Play a sound
tanks demo
Joints
• pin joint – bodies attached at a point, can rotate
• prismatic joint – keep bodies aligned, like a piston or
a train on a rail
• distance joint – keep points on the two bodies at the
same distance from one another, like a tow-bar or
crank shaft
• pulley joint – the position of a body along one axis is
linked to the position of another body along another
axis
Pin Joint
Joint motors/limits
• Motors apply torques or forces between the bodies
• Joints can have limits – your knees do not bend
backwards
truck demo
heli demo
Features I've not yet mentioned
• Collision groups/masks
• Sensors
• Non-rotating bodies/Infinite moment of inertia
• Introspecting the world
• Sleeping
Complications I've skipped over
• Constraint solving
• Overconstraint
• Stability
Graphics and Sound
• Cute and colourful is attractive
• Simple shapes and outlines are much easier than
other styles
• Free/CC game art resources available
The art of tuning a physics engine
• Tuning magic numbers:
• Forces
• Torques
• Density/Friction/Restitution
• Re-shaping bodies/redrawing sprites
• At which point does a force act?
• Joints/joint limits/joint motors
• Collision groups/filters
“To every action there is
always an equal and
opposite reaction: or the
forces of two bodies on each
other are always equal and
are directed in opposite
directions.”
- Archimedes
Compound effects
• Buoyancy
• Lift
• Explosions
• Soft bodies
• Drag effects
• Joints or objects 'snapping'
Physics Games
• Intuitive for players
• The game is mastering the physics
• Constrain degrees of freedom to balance
difficulty/reward/punishment
Physics Puzzles
Overlapping constraints
• Physical constraints
• Thing in the way
• Thing not in the right place
• How to overcome gravity
• Wrong physical behaviour unless...
• Non-physical constraints
• Player can't breathe underwater
• Only x can pass through this barrier
Reasons to use a physics engine
• Tons of maths for free
• Cool effects/cheap animations
• Game world responds to player; player is
empowered/immersed
• Extra layer of complexity/interest for the player
• Intuitive puzzles
Reasons not to use a physics engine
• Extra dependency/pain to install
• Time consuming to tune
• Too many degrees of freedom may make some
mechanics difficult or impossible to work in
Daniel Pope
@lordmauve
Code samples are available at
https://bitbucket.org/lordmauve/physicsgames

Programming physics games with Python and OpenGL

Editor's Notes

  • #28 Very fast moving objects (eg. bullets) may have passed completely through each other in a single time step – compute time of first intersection