Programming physics games with Python and OpenGL

Embed Size (px)

Citation preview

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)

PyBox2Dhttp://pybox2d.googlecode.com

http://www.pymunk.org

PyODEhttp://pyode.sourceforge.net/

PyNewthttp://code.google.com/p/pynewt/

PyBullethttps://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/

Panda3Dhttp://www.panda3d.org/

Python-Ogrehttp://www.python-ogre.org/

PyCrystalhttp://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

LinearAngular

Mass/InertiaMoment of Inertia

ForceMoment/Torque

PositionAngle

VelocityAngular Velocity

AccelerationAngular Acceleration

MomentumAngular Momentum

ImpulseAngular Impulse

Approximately

net_force = sum(forces)acceleration = force / mass velocity += acceleration * dtposition += velocity * dtforces = [GRAVITY * mass]

+ rotational equivalents

Time step

Collisions

Detect when two shapes intersectBroad phase (O(n log n)?, approximate)

Narrow phase (O(n))

Exchange momentum

Move them apart, keep them apart

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

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 massCompute 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 demoheli 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 constraintsPhysical constraintsThing in the way

Thing not in the right place

How to overcome gravity

Wrong physical behaviour unless...

Non-physical constraintsPlayer 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

Click to edit the outline text formatSecond Outline LevelThird Outline LevelFourth Outline LevelFifth Outline LevelSixth Outline LevelSeventh Outline Level