Skip to content

Instantly share code, notes, and snippets.

@davepape
Created October 15, 2013 15:17
Show Gist options
  • Select an option

  • Save davepape/6993241 to your computer and use it in GitHub Desktop.

Select an option

Save davepape/6993241 to your computer and use it in GitHub Desktop.
basic spring simulation - two point masses connected by a spring
import sys, time, math
from pyglet.gl import *
from euclid import *
window = pyglet.window.Window(512,512)
point0 = Vector2(100, 240)
velocity0 = Vector2(0, 0)
mass0 = 1
point1 = Vector2(300, 240)
velocity1 = Vector2(0, 0)
mass1 = 1
springConstant = 100
restLength = 150
triangle = pyglet.graphics.vertex_list(3, ('v2f', [-8,-8, 8,-8, 0,8]))
line = pyglet.graphics.vertex_list(2, ('v2f', [point0[0], point0[1], point1[0], point1[1]]))
@window.event
def on_draw():
glClear(GL_COLOR_BUFFER_BIT)
glColor3f(1,0.5,0)
glPushMatrix()
glTranslatef(point0[0], point0[1], 0)
triangle.draw(GL_TRIANGLES)
glPopMatrix()
glColor3f(0,0.5,1)
glPushMatrix()
glTranslatef(point1[0], point1[1], 0)
triangle.draw(GL_TRIANGLES)
glPopMatrix()
glColor3f(1,0,0)
line.vertices = point0[0:2] + point1[0:2]
line.draw(GL_LINES)
def update(dt):
global velocity0, velocity1, point0, point1
v = point1 - point0
displacement = v.magnitude() - restLength
v = v.normalized()
force = springConstant * displacement * v
accel = force / mass0
velocity0 += accel * dt
point0 += velocity0 * dt
accel = -force / mass1
velocity1 += accel * dt
point1 += velocity1 * dt
pyglet.clock.schedule_interval(update,1/60.0)
pyglet.app.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment