201702GraduateEx0201 - dknife/Graduate2017_Autumn GitHub Wiki


from OpenGL.GLUT import *
from OpenGL.GL import *
from OpenGL.GLU import *
import numpy as np

Loc1 = np.array([0.0,1.0,0.0])
Loc2 = np.array([1.5,1.0,0.0])
Vel1 = np.array([0.01,0,0])
Vel2 = np.array([0,0,0])

mass1 = 1
mass2 = 1
K = 0.1
L0 = 1.0
dt = 0.01

def drawAxes():
    glBegin(GL_LINES)
    glColor3f(1,0,0)
    glVertex3f(0,0,0)
    glVertex3f(1,0,0)
    glColor3f(0, 1, 0)
    glVertex3f(0, 0, 0)
    glVertex3f(0, 1, 0)
    glColor3f(0, 0, 1)
    glVertex3f(0, 0, 0)
    glVertex3f(0, 0, 1)
    glEnd()

def drawSpring(loc1, loc2) :
    glColor3f(1,1,1)
    glPushMatrix()
    glTranslatef(loc1[0], loc1[1], loc1[2])
    glutWireSphere(0.1, 10, 10)
    glPopMatrix()
    glPushMatrix()
    glTranslatef(loc2[0], loc2[1], loc2[2])
    glutWireSphere(0.1, 10, 10)
    glPopMatrix()
    glBegin(GL_LINES)
    glVertex3f(loc1[0], loc1[1], loc1[2])
    glVertex3f(loc2[0], loc2[1], loc2[2])
    glEnd()

def move() :
    global Loc1, Loc2, Vel1, Vel2, L0, K, mass1, mass2, dt
    L = np.linalg.norm(Loc2-Loc1)
    dir = (Loc2 - Loc1) / L
    d = L - L0
    f1 = K * d * dir
    f2 = -f1
    a1 = f1 / mass1
    a2 = f2 / mass2
    Vel1 = Vel1 + a1 * dt
    #Loc1 = Loc1 + Vel1 * dt
    Vel2 = Vel2 + a2 * dt
    Loc2 = Loc2 + Vel2 * dt
    glutPostRedisplay()  ## Hey! Draw Function! Draw!

def draw():
    glClear(GL_COLOR_BUFFER_BIT)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(60, 1.0, 0.1, 1000);
    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()
    gluLookAt(0.5,2.0,5.0, 0.0,0.0,0.0, 0.0,1.0,0.0)
    drawAxes()
    drawSpring(Loc1, Loc2)
    glFlush()

def GLinit() :
    glClearColor(0.5, 0.5, 0.5, 1)

glutInit(sys.argv)
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA)
glutInitWindowSize(250, 250)
glutInitWindowPosition(100, 100)
glutCreateWindow(b"OpenGL with Python")
GLinit()
glutDisplayFunc(draw)
glutIdleFunc(move)
glutMainLoop()

# End of program