0% found this document useful (0 votes)
18 views

GDC2006 Catto Erin PhysicsTutorial

Uploaded by

Trung Thành
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
18 views

GDC2006 Catto Erin PhysicsTutorial

Uploaded by

Trung Thành
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 53

Fast and Simple Physics using

Sequential Impulses

Erin Catto
Crystal Dynamics
Physics Engine Checklist

 Collision and contact


 Friction: static and dynamic
 Stacking
 Joints
 Fast, simple, and robust
Box2D Demo

 It’s got collision


 It’s got friction
 It’s got stacking
 It’s got joints
 Check the code, it’s simple!
Fast and Simple Physics
 Penalty method?
 Nope
 Linear complementarity (LCP)?
 Nope
 Joint coordinates (Featherstone)?
 Nope
 Particles (Jakobsen)?
 Nope
 Impulses?
 Bingo!
Why Impulses?
 Most people don’t hate impulses
 The math is almost understandable
 Intuition often works
 Impulses can be robust

m
P
v 
P m
Making Impulses not Suck

 Impulses are good at making things bounce.


 Many attempts to use impulses leads to
bouncy simulations (aka jitter).
 Forget static friction.
 Forget stacking.
Impulses without the Bounce

 Forget bounces for a moment.


 Let’s concentrate on keeping things still.
 It’s always easy to add back in the bounce.
The 5 Step Program
(for taking the jitter out of impulses)

 Accept penetration
 Remember the past
 Apply impulses early and often
 Pursue the true impulse
 Update position last
Penetration

 Performance
 Simplicity
 Coherence
 Game logic
 Fewer cracks
Algorithm Overview

 Compute contact points


 Apply forces (gravity)
 Apply impulses
 Update position
 Loop
Contact Points

 Position, normal, and penetration


 Box-box using the SAT
 Find the axis of minimum penetration
 Find the incident face on the other box
 Clip
Box-Box SAT

 First find the separating


axis with the minimum n
penetration.
 In 2D the separating axis is 
a face normal.
Box-Box Clipping Setup

 Identify reference face


 Identify incident face n

incident

reference
Box-Box Clipping
clipping planes
 Clip incident face
against reference face
side planes (but not
the reference face). n
 Consider clip points
with positive
penetration.
Feature Flip-Flop

 Which normal is the


separating axis? n1
 Apply weightings to
prefer one axis over
another. n2
 Improved coherence.
Apply Forces

Newton’s Law mv  F
Iω  ω  Iω  T
Ignore gyroscopic term for
improved stability

v 2  v1  t m 1F
Use Euler’s rule ω 2  ω1  t I 1T
Impulses
 Impulses are applied at each contact point.
 Normal impulses to prevent penetration.
 Tangent impulses to impose friction.

Pn  0
Pt
t Pt   Pn

Pnn
Computing the Impulse

r2
2
n
P
P

1 r1
Linear Momentum
v1  v1  P / m1
The normal impulse ω1  ω1  I11r1  P
causes an instant v 2  v 2  P / m2
change in velocity.
ω 2  ω 2  I 21r2  P

We know the direction of


the normal impulse. We P  Pnn
only need it’s magnitude.
Relative Velocity

2 v  v 2  ω2  r2  v1  ω1  r1

r2 n
Along Normal:
r1
1 vn  v  n
The Normal Impulse

Want: vn  0 Pn  0

 v  n 
Get: Pn  max  ,0
 kn 

Fine Print:
v  v 2  ω2  r2  v1  ω1  r1
1 1
kn     I11  r1  n   r1  I 21  r2  n   r2   n
m1 m2
Bias Impulse

 Give the normal impulse some extra oomph.


 Proportional to the penetration.
 Allow some slop.
 Be gentle.
Bias Velocity
Slop:  slop

n
Bias Factor:    0.1, 0.3
 slop 

Bias velocity:

vbias  max  0,    slop 
t
Bias Impulse
With bias velocity, this:

 v  n 
Pn  max  ,0
 kn 

Becomes:
 v  n  vbias 
Pn  max  ,0
 kn 
Friction Impulse

Tangent Velocity: vt  v  t

Want: vt  0   Pn  Pt   Pn

v  t
Get: Pt  clamp( ,   Pn ,  Pn )
kt

Fine Print:
1 1
kt     I11  r1  t   r1  I 21  r2  t   r2   t
m1 m2
Sequential Impulses

 Apply an impulse at each contact point.


 Continue applying impulses for several
iterations.
 Terminate after:
 - fixed number of iterations
 - impulses become small
Naïve Impulses

Each impulse is computed


velocity independently, leading to
jitter.

velocity

P1 P2
Where Did We Go Wrong?

 Each contact point forgets its impulse history.


 Each contact point requires that every
impulse be positive.
 There is no way to recover from a bad
impulse.
Accumulated Impulses

Each impulse adds to


velocity the total. Increments
can be negative.

P1 P2 P1 P2
The True Impulse

 Each impulse adds to an accumulated


impulse for each contact point.
 The accumulated impulse approaches the
true impulse (hopefully).
 True impulse: an exact global solution.
Accumulated Impulse

 Clamp the accumulated impulse, not the


incremental impulses.

Accumulated impulses:

Pn Pt
Correct Clamping
Normal Clamping: temp  Pn
Pn  max  Pn  Pn , 0 
Pn  Pn  temp

Friction Clamping: temp  Pt


Pt  clamp  Pt  Pt ,   Pn ,  Pn 
Pt  Pt  temp
Position Update

 Use the new velocities to integrate the


positions.
 The time step is complete.
Extras

 Coherence
 Feature-based contact points
 Joints
 Engine layout
 Loose ends
 3D Issues
Coherence

 Apply old accumulated impulses at the


beginning of the step.
 Less iterations and greater stability.
 We need a way to match old and new
contacts.
Feature-Based Contact Points

 Each contact point is the result of clipping.


 It is the junction of two different edges.
 An edge may come from either box.
 Store the two edge numbers with each
contact point – this is the Contact ID.
Contact Point IDs
c1
e1 box 1 edge 2
2 n
box 2 edge 3
e2 e4

c1 c2
e3 c2 box 2 edge 3
1 box 2 edge 4
Joints

 Specify (constrain) part of the motion.


 Compute the impulse necessary to achieve
the constraint.
 Use an accumulator to pursue the true
impulse.
 Bias impulse to prevent separation.
Revolute Joint

 Two bodies share a


common point.
 They rotate freely
about the point.
Revolute Joint
2
 The joint knows the
local anchor point for r2
both bodies.

r1
1
Relative Velocity

 The relative velocity of the anchor points is


zero.
v  v 2  ω2  r2  v1  ω1  r1  0

 An impulse is applied to the two bodies.

P
Linear Momentum

 Apply linear momentum to the relative


velocity to get:
KP  v

 Fine Print:
 1 1  1 1
K    1  r I
1 1 1r  r2 2 r2
I
 m1 m2 
 Tilde (~) for the cross-product matrix.
K Matrix

 2-by-2 matrix in 2D, 3-by-3 in 3D.


 Symmetric positive definite.
 Think of K as the inverse mass matrix of the
constraint.

M c  K 1
Bias Impulse

 The error is the separation between the


anchor points
p  x2  r2  x1  r1

 Center of mass: x
 Bias velocity and impulse:


v bias   p
t
KP  v  v bias
Engine Layout

 The World class contains all bodies, contacts,


and joints.
 Contacts are maintained by the Arbiter class.
Arbiter

 An arbiter exists for every touching pair of


boxes.
 Provides coherence.
 Matches new and old contact points using
the Contact ID.
 Persistence of accumulated impulses.
Arbiters

2
n

Arbiter
c1
c2

1
Collision Coherence

 Use the arbiter to store the separating axis.


 Improve performance at the cost of memory.
 Use with broad-phase.
More on Arbiters

 Arbiters are stored in a set according to the


ordered body pointers.
 Use time-stamping to remove stale arbiters.
 Joints are permanent arbiters.
 Arbiters can be used for game logic.
Loose Ends

 Ground is represented with bodies whose


inverse mass is zero.
 Contact mass can be computed as a pre-step.
 Bias impulses shouldn’t affect the velocity
state (TODO).
3D Issues

 Friction requires two axes.


 Align the axes with velocity if it is non-zero.
 Identify a contact patch (manifold) and apply
friction at the center.
 This requires a twist friction.
 Big CPU savings.
Questions?
 http://www.gphysics.com
 erincatto at that domain
 Download the code there.
 Buy Tomb Raider Legend!
References
 Physics-Based Animation by Kenny Erleben et al.
 Real-Time Collision Detection by Christer Ericson.
 Collision Detection in Interactive 3D Environments by Gino van
den Bergen.
 Fast Contact Reduction for Dynamics Simulation by Adam
Moravanszky and Pierre Terdiman in Game Programming Gems
4.

You might also like