Thread: DirectPhysics
View Single Post
Old Feb 27th, 2006, 11:40 AM   #56
Jacob Roman
Banned
 
Jacob Roman's Avatar
 
Join Date: Aug 04
Location: Cocoa Beach, FL Chit Chat Posts: 500+
Posts: 4,371
Jacob Roman is a jewel in the rough (200+)Jacob Roman is a jewel in the rough (200+)Jacob Roman is a jewel in the rough (200+)
Re: DirectPhysics

The most important thing that is gonna be in our physics engine is the Integration class, which should be easy to code. It's gonna allow the user to choose an integration method, and will have a function to execute it. Some methods will be inaccurate and unstable, while others have their own pros and cons. It all depends on what you do. Like for example, Runge Kutta 4 would be perfect for spring simulations. While Runge Kutta methods (especially the higher order ones) are the most accurate and stable yet computationally expensive, Euler is the easiest to implement, yet is inaccurate and can easily become unstable. For future reference just incase I seem like I'm jumping the gun, here are some, which happen to be the most popular choices of integration methods:


x - Position
v - Velocity
a - Acceleration
dt - Delta Time Step Size


Euler
Aliases: Forward Euler, Explicit Euler
----------------------------------------
x = x + v * dt
v = v + a * dt

2nd Order Euler
----------------------------------------
x = x + v * dt + 0.5 * a * dt * dt
v = v + a * dt

Verlet
Aliases: Velocity-less Verlet
----------------------------------------
v = x - old_x + a * dt * dt
x = x + v
old_x = x

Time Corrected Velocity-less Verlet
----------------------------------------
v = (x - old_x) * (dt / old_dt) + a * dt * dt
x = x + v
old_x = x
old_dt = dt

Prescaled Euler
Aliases: Newton Stomer Verlet Variant
----------------------------------------
v = v + a * dt * dt
x = x + v

Re-ordered traditional Euler
Aliases: Semi-Implicit Euler, Newton Stormer Verlet, Backwards Euler
----------------------------------------
v = v + a * dt
x = x + v * dt

Velocity Verlet
----------------------------------------
x = x + v * dt + 0.5 * Old_A * dt * dt
v = v + 0.5 * (Old_A + a) * dt
Old_A = a

2nd Order Runge Kutta,
Aliases: Midpoint Method, RK2
----------------------------------------
k1 = dt * v
l1 = dt * a

k2 = dt * (v + k1 / 2)
l2 = dt * a

x = x + k2
v = v + l2

3rd Order Runge Kutta
Aliases: RK3
----------------------------------------
k1 = dt * v
l1 = dt * a

k2 = dt * (v + k1 / 2)
l2 = dt * a

k3 = dt * (v - k1 + 2 * k2)
l3 = dt * a

x = x + k1 * 1 / 6 + k2 * 2 / 3 + k3 * 1 / 6
v = v + l1 * 1 / 6 + l2 * 2 / 3 + l3 * 1 / 6

4th Order Runge Kutta
Aliases: RK4
----------------------------------------
k1 = dt * v
l1 = dt * a

k2 = dt * (v + k1 / 2)
l2 = dt * a

k3 = dt * (v + k2 / 2)
l3 = dt * a

k4 = dt * (v + k3)
l4 = dt * a

x = x + k1 / 6 + k2 / 3 + k3 / 3 + k4 / 6
v = v + l1 / 6 + l2 / 3 + l3 / 3 + l4 / 6






And here's some code examples, which show the results of each of them:

VB Code:
  1. Option Explicit
  2. Private Sub Form_Activate()
  3.    
  4.     Dim k1 As Single, k2 As Single, k3 As Single, k4 As Single
  5.     Dim l1 As Single, l2 As Single, l3 As Single, l4 As Single
  6.     Dim x As Single, v As Single, a As Single
  7.     Dim dt As Single, dt2 As Single
  8.     Dim f As Single, m As Single
  9.     Dim old_x As Single, old_a As Single, old_dt As Single
  10.     Dim i As Long
  11.     a = 9.8
  12.     dt = 1 / 100
  13.    
  14.     'List1.AddItem ""
  15.     List1.AddItem "Euler Integration"
  16.     List1.AddItem "---------------------"
  17.     x = 0
  18.     v = 0
  19.    
  20.     For i = 0 To 99
  21.    
  22.         x = x + v * dt
  23.         v = v + a * dt
  24.    
  25.         List1.AddItem "X: " & x & "    " & "V: " & v
  26.    
  27.     Next i
  28.    
  29.     List1.AddItem ""
  30.     List1.AddItem "2nd Order Euler Integration"
  31.     List1.AddItem "---------------------"
  32.     x = 0
  33.     v = 0
  34.    
  35.     For i = 0 To 99
  36.    
  37.         x = x + v * dt + 0.5 * a * dt * dt
  38.         v = v + a * dt
  39.    
  40.         List1.AddItem "X: " & x & "    " & "V: " & v
  41.    
  42.     Next i
  43.    
  44.     List1.AddItem ""
  45.     List1.AddItem "Newton Stormer Verlet (Semi Implicit Euler)"
  46.     List1.AddItem "---------------------"
  47.     x = 0
  48.     v = 0
  49.    
  50.     For i = 0 To 99
  51.    
  52.         v = v + a * dt
  53.         x = x + v * dt
  54.    
  55.         List1.AddItem "X: " & x & "    " & "V: " & v
  56.    
  57.     Next i
  58.    
  59.     List1.AddItem ""
  60.     List1.AddItem "Velocity-less Verlet Integration"
  61.     List1.AddItem "---------------------"
  62.     x = 0
  63.     v = 0
  64.    
  65.     For i = 0 To 99
  66.    
  67.         v = x - old_x + a * dt * dt
  68.         old_x = x
  69.         x = x + v
  70.    
  71.         List1.AddItem "X: " & x & "    " & "V: " & v / dt
  72.    
  73.     Next i
  74.    
  75.     List1.AddItem ""
  76.     List1.AddItem "Newton Stormer Verlet Variant Integration"
  77.     List1.AddItem "---------------------"
  78.     x = 0
  79.     v = 0
  80.     dt2 = dt * dt
  81.    
  82.     For i = 0 To 99
  83.    
  84.         v = v + a * dt2
  85.         x = x + v
  86.    
  87.         List1.AddItem "X: " & x & "    " & "V: " & v / dt
  88.    
  89.     Next i
  90.    
  91.     List1.AddItem ""
  92.     List1.AddItem "Velocity Verlet Integration"
  93.     List1.AddItem "---------------------"
  94.     x = 0
  95.     v = 0
  96.     old_a = a
  97.    
  98.     For i = 0 To 99
  99.    
  100.         x = x + v * dt + 0.5 * old_a * dt * dt
  101.         v = v + 0.5 * (old_a + a) * dt
  102.         old_a = a
  103.    
  104.         List1.AddItem "X: " & x & "    " & "V: " & v
  105.    
  106.     Next i
  107.    
  108.     List1.AddItem ""
  109.     List1.AddItem "Time Corrected Velocity-less Verlet Integration"
  110.     List1.AddItem "---------------------"
  111.     x = 0
  112.     v = 0
  113.     old_x = x
  114.     old_dt = dt
  115.    
  116.     For i = 0 To 99
  117.    
  118.         v = x - old_x * (dt / old_dt) + a * dt * dt
  119.         old_x = x
  120.         old_dt = dt
  121.         x = x + v
  122.        
  123.         List1.AddItem "X: " & x & "    " & "V: " & v / dt
  124.    
  125.     Next i
  126.     List1.AddItem ""
  127.     List1.AddItem "RK2 Integration"
  128.     List1.AddItem "---------------------"
  129.     x = 0
  130.     v = 0
  131.     For i = 0 To 99
  132.         k1 = dt * v
  133.         l1 = dt * a
  134.        
  135.         k2 = dt * (v + k1 / 2)
  136.         l2 = dt * a
  137.        
  138.         x = x + k2
  139.         v = v + l2
  140.        
  141.         List1.AddItem "X: " & x & "    " & "V: " & v
  142.     Next i
  143.    
  144.     List1.AddItem ""
  145.     List1.AddItem "RK3 Integration"
  146.     List1.AddItem "---------------------"
  147.     x = 0
  148.     v = 0
  149.    
  150.     For i = 0 To 99
  151.    
  152.         k1 = dt * v
  153.         l1 = dt * a
  154.                
  155.         k2 = dt * (v + k1 / 2)
  156.         l2 = dt * a
  157.                
  158.         k3 = dt * (v - k1 + 2 * k2)
  159.         l3 = dt * a
  160.                
  161.         x = x + k1 * 1 / 6 + k2 * 2 / 3 + k3 * 1 / 6
  162.         v = v + l1 * 1 / 6 + l2 * 2 / 3 + l3 * 1 / 6
  163.        
  164.         List1.AddItem "X: " & x & "    " & "V: " & v
  165.    
  166.     Next i
  167.    
  168.     List1.AddItem ""
  169.     List1.AddItem "RK4 Integration"
  170.     List1.AddItem "---------------------"
  171.     x = 0
  172.     v = 0
  173.     For i = 0 To 99
  174.         k1 = dt * v
  175.         l1 = dt * a
  176.        
  177.         k2 = dt * (v + k1 / 2)
  178.         l2 = dt * a
  179.        
  180.         k3 = dt * (v + k2 / 2)
  181.         l3 = dt * a
  182.        
  183.         k4 = dt * (v + k3)
  184.         l4 = dt * a
  185.        
  186.         x = x + k1 / 6 + k2 / 3 + k3 / 3 + k4 / 6
  187.         v = v + l1 / 6 + l2 / 3 + l3 / 3 + l4 / 6
  188.        
  189.         List1.AddItem "X: " & x & "    " & "V: " & v
  190.     Next i
  191. End Sub

Last edited by Jacob Roman; Feb 27th, 2006 at 06:22 PM.
Jacob Roman is offline   Reply With Quote