GlowScript 2.1 VPython
##add keyboard control
def process(event):
global Fthrust
if event.type=='keydown':
k = event.which
if k == 38 and mfuel>0: #up arrow turns on the vertical thruster
Fthrust=thrust*vector(0,1,0)
fireU.visible=True
FarrowU.visible=True
elif k == 39 and mfuel>0: #right arrow turns on the rightward thruster
Fthrust=thrust*vector(1,0,0)
fireR.visible=True
FarrowR.visible=True
elif k == 37 and mfuel>0: #right arrow turns on the leftward thruster
Fthrust=thrust*vector(-1,0,0)
fireL.visible=True
FarrowL.visible=True
elif event.type=='keyup': #releasing the key turns off the thruster
Fthrust=vector(0,0,0)
fireR.visible=False
FarrowR.visible=False
fireL.visible=False
FarrowL.visible=False
fireU.visible=False
FarrowU.visible=False
FthrustArrow.axis=scale*Fthrust
scene=canvas(title="Lunar Lander")
scene.append_to_title("
Instructions
")
scene.append_to_title("
1. Click the scene to begin.")
scene.append_to_title("
")
scene.append_to_title("2. Hold down the up arrow or right arrow or left arrow to turn the corresponding thruster.")
scene.append_to_title("
")
scene.append_to_title("3. Land on the red target. To succeed, the lander's speed must be less than 1 m/s, and it
must land within 1 m of the center of the target.")
scene.append_to_title("
")
scene.append_to_title("
")
scene.bind('keydown keyup', process)
scene.range=40
scene.background=color.black
scene.camera.pos=scene.camera.pos+vector(0,20,-10)
L=3
ground = box(pos=vector(0,-1.1,0), size=vector(50.0,2,50), color=color.white)
lander = box(pos=vector(-10,50,0), size=vector(L,L,L), color=color.yellow)
target = cylinder(pos=vector(10,0,0), axis=vector(0,-1,0), radius=L/2+1, color=color.red)
m_i=1e4
lander.m = m_i
mfuel=8e3
mdot=-500
lander.v = vector(0,0,0)
g=1.6*vector(0,-1,0)
thrust=3*m_i*mag(g)
scale=2*L/m_i/mag(g)
sw=0.5
vstr="Speed: {0:.2f}".format(mag(lander.v))
vlabel=label(pos=vector(0,-10,0), text=vstr)
mfuelstr="Mass of Fuel: {0:.0f} kg".format(mfuel)
mfuellabel=label(pos=vector(-30,-10,0), text=mfuelstr)
fireR=cone(pos=lander.pos-vector(L/2,0,0), radius=L/4, axis=L/2*vector(-1,0,0), color=color.orange, visible=False)
FarrowR=arrow(pos=lander.pos, axis=scale*thrust*vector(1,0,0), color=color.orange, shaftwidth=sw, visible=False)
fireL=cone(pos=lander.pos+vector(L/2,0,0), radius=L/4, axis=L/2*vector(1,0,0), color=color.orange, visible=False)
FarrowL=arrow(pos=lander.pos, axis=scale*thrust*vector(-1,0,0), color=color.orange, shaftwidth=sw, visible=False)
fireU=cone(pos=lander.pos-vector(0,L/2,0), radius=L/4, axis=L/2*vector(0,-1,0), color=color.orange, visible=False)
FarrowU=arrow(pos=lander.pos, axis=scale*thrust*vector(0,1,0), color=color.orange, shaftwidth=sw, visible=False)
Farrowgrav=arrow(pos=lander.pos, axis=scale*lander.m*g, color=color.white, shaftwidth=sw, visible=True)
dt = 0.01
t = 0
Fthrust=vector(0,0,0)
aGraph=graph(title="", xtitle='t (s)', ytitle='a_y (m/s/s)', xmin=0, x=500, y=0, width=400, height=150)
ayPlot=series(color=color.blue, graph=aGraph)
scene.waitfor("click")
while 1:
rate(100)
if(mag(Fthrust)>0):
dm=mdot*dt
mfuel=mfuel+dm
lander.m=lander.m+dm
Fgrav=lander.m*g
Fnet=Fgrav+Fthrust
lander.v =lander.v+Fnet/lander.m*dt
lander.pos = lander.pos + lander.v*dt
if(lander.pos.y-lander.height/2