2 # Simulate the artwork in the hall.
11 main_dict
= __main__
.__dict
__
17 # Make a cylinder paralel with the Z axis with center (X,Y,0)
19 def mkcyl(nslice
, nparts
, docircle
):
21 step
= 2.0 / float(nslice
)
23 for i
in range(nslice
):
24 cyl
.append(mkslice(z
, z
+step
, nparts
, docircle
))
26 return drawcylinder(cyl
)
28 # Make one part of a cylinder
30 def mkslice(z1
, z2
, nparts
, docircle
):
42 step
= (2.0*pi
)/float(nparts
)
44 for i
in range(nparts
+1):
47 slice.append( ((vx
*w1
,vy
*w1
,z1
), (vx
*w1
, vy
*w1
, z1
*normalz
)) )
48 slice.append( ((vx
*w2
,vy
*w2
,z2
), (vx
*w2
, vy
*w2
, z2
*normalz
)) )
52 # Drawcylinder : draw the cylinder
57 def drawcylinder(cyl
):
59 curobj
.curobj
= curobj
.curobj
+1
73 v3f(triang
[0][0] + triang
[1][0], triang
[0][1] + triang
[1][1], triang
[0][2] + triang
[1][2])
77 curobj
.curobj
= curobj
.curobj
+1
85 for floor
in range(3):
109 curobj
.curobj
= curobj
.curobj
+1
111 for floor
in range(3):
123 curobj
.curobj
= curobj
.curobj
+1
125 for floor
in range(3):
149 curobj
.curobj
= curobj
.curobj
+1
197 green_velvet
= [ DIFFUSE
, 0.05, 0.4, 0.05, LMNULL
]
198 silver
= [ DIFFUSE
, 0.3, 0.3, 0.3, SPECULAR
, 0.9, 0.9, 0.95, \
199 SHININESS
, 40.0, LMNULL
]
200 floormat
= [ AMBIENT
, 0.5, 0.25, 0.15, DIFFUSE
, 0.5, 0.25, 0.15, SPECULAR
, 0.6, 0.3, 0.2, SHININESS
, 20.0, LMNULL
]
201 wallmat
= [ DIFFUSE
, 0.4, 0.2, 0.1, AMBIENT
, 0.4, 0.20, 0.10, SPECULAR
, 0.0, 0.0, 0.0, SHININESS
, 20.0, LMNULL
]
202 offwhite
= [ DIFFUSE
, 0.8, 0.8, 0.6, AMBIENT
, 0.8, 0.8, 0.6, SPECULAR
, 0.9, 0.9, 0.9, SHININESS
, 30.0, LMNULL
]
203 doormat
= [ DIFFUSE
, 0.1, 0.2, 0.5, AMBIENT
, 0.2, 0.4, 1.0, SPECULAR
, 0.2, 0.4, 1.0, SHININESS
, 60.0, LMNULL
]
205 toplight
= [ LCOLOR
, 1.0, 1.0, 0.5, \
206 POSITION
, 0.0, 0.0, 11.0, 1.0, LMNULL
]
207 floor1light
= [ LCOLOR
, 1.0, 1.0, 1.0, POSITION
, 3.9, -3.9, 0.0, 1.0, \
208 SPOTDIRECTION
, 1.0, 1.0, 0.0, SPOTLIGHT
, 10.0, 90.0, LMNULL
]
210 lmodel
= [ AMBIENT
, 0.92, 0.8, 0.5, LOCALVIEWER
, 1.0, LMNULL
]
213 lmdef(DEFMATERIAL
, 1, green_velvet
)
214 lmdef(DEFMATERIAL
, 2, silver
)
215 lmdef(DEFMATERIAL
, 3, floormat
)
216 lmdef(DEFMATERIAL
, 4, wallmat
)
217 lmdef(DEFMATERIAL
, 5, offwhite
)
218 lmdef(DEFMATERIAL
, 6, doormat
)
219 lmdef(DEFLIGHT
, 1, toplight
)
220 lmdef(DEFLIGHT
, 2, floor1light
)
221 lmdef(DEFLMODEL
, 1, lmodel
)
226 IdMat
=[1.0,0.0,0.0,0.0, 0.0,1.0,0.0,0.0, 0.0,0.0,1.0,0.0, 0.0,0.0,0.0,1.0]
231 print 'F'+axis
+'(t) = ',
232 s
= sys
.stdin
.readline(100)
235 s
= 'def f'+axis
+'(t): return '+s
239 print 'Sorry, there is a syntax error in your expression'
241 print 'Welcome to the CWI art simulator. You can now enter X, Y and Z'
242 print 'coordinates as a function of t.'
243 print 'Normal trig functions are available. Please use floating point'
244 print 'values only (so 0.0 for 0). Comments to jack@cwi.nl'
248 print 'Ok, here you go. Use mouse+right button to move up/down,'
249 print 'mouse+middle to speed up/slow down time. type ESC to quit simulation'
253 prefposition(100,600,100,600)
254 void
= winopen('cyl')
264 perspective(400, 1.0, 1.0, 20.0)
269 lookat(0.0, -6.0, 0.0, 0.0, 0.0, 0.0, 0)
273 bol
= mkcyl(12,24, 1)
274 cable
= mkcyl(1, 6, 0)
275 floors
= drawfloors()
277 pillar
= mkcyl(1,4,0)
278 railing
= drawrailing()
285 # Check for some user input
289 if dev
== PKEY
and value
== 1:
293 elif (dev
==MOUSE1
or dev
==MOUSE2
) and value
== 1:
299 oldx
= getvaluator(MOUSEX
)
300 oldy
= getvaluator(MOUSEY
)
301 elif (dev
==MOUSE1
or dev
==MOUSE2
):
304 newx
= getvaluator(MOUSEX
)
305 newy
= getvaluator(MOUSEY
)
306 if newy
<> oldy
and mousing
==MOUSE1
:
307 vz
= vz
+ float(newy
- oldy
)/100.0
308 dist
= sqrt(vx
*vx
+ vy
*vy
+ vz
*vz
)
309 perspective(400, 1.0, 1.0, dist
+16.0)
312 lookat(vx
, vy
, vz
, 0.0, 0.0, 0.0, 1800)
314 lookat(vx
, vy
, vz
, 0.0, 0.0, 0.0, 0)
315 if newy
<> oldy
and mousing
==MOUSE2
:
316 step
= step
* exp(float(newy
-oldy
)/400.0)
317 if getbutton(CTRLKEY
) == 0:
321 if getbutton(LEFTSHIFTKEY
) == 0:
326 # Draw background and axis
339 if bolx
< -4.0 or bolx
> 4.0:
340 err
= 'X('+`bolx`
+') out of range [-4,4]'
341 if boly
< -4.0 or boly
> 4.0:
342 err
= 'Y('+`boly`
+') out of range [-4,4]'
343 if bolz
< -4.0 or bolz
> 8.0:
344 err
= 'Z('+`bolz`
+') out of range [-4,8]'
347 translate(bolx
, boly
, bolz
)
360 v3f(bolx
, boly
, bolz
)
364 v3f(bolx
, boly
, bolz
)
368 v3f(bolx
, boly
, bolz
)
372 v3f(bolx
, boly
, bolz
)
384 translate(-4.5,4.5,3.0)
392 translate(0.0, -0.01, 0.0)
395 if mousing
== MOUSE2
or err
:
399 if mousing
== MOUSE2
:
402 charstr('delta-t='+`step`
)
412 charstr('Pausing, type P to continue')
425 except KeyboardInterrupt: