Resources > spindots.py


##############################################################
# spindots          Andy Beall 1998
#
# This script demonstrates on-the-fly geometry of a sphere
# and a wire-frame box the surround it.  The sphere spins, and
# you can optionally add the box.  The sphere always goes in
# the same direction but the box goes either 'f'ordward or
# 'r'everse depending on which key you press.
#
##############################################################
##############################################################
 

import vrut
import math
import whrandom
import win32api

vrut.go()

NUM_DOTS   = 350
RADIUS = 1

vrut.clearcolor(0, 0, 0)

angle  = 0
cubeAngle   = 0
SPEED  = 1
cubeSpeed = 0

print "\n***************************************"
print "Press 'f' or 'r' to see a cube spinning"
print "along with the sphere."
print "\n***************************************"

#Build sphere
vrut.startlayer(vrut.POINTS)
vrut.vertexcolor(1,1,1)
vrut.pointsize(2)

for i in range(0, NUM_DOTS):
 x = whrandom.random() - 0.5
 y = whrandom.random() - 0.5
 z = whrandom.random() - 0.5
 length = math.sqrt(x*x + y*y + z*z)
 x = x / length * RADIUS
 y = y / length * RADIUS + 1.8
 z = z / length * RADIUS
 vrut.vertex(x, y, z)

vrut.endlayer()
 

#Build cube
vrut.startlayer(vrut.LINE_STRIP)
vrut.vertexcolor(0, .6, 0)
vrut.vertex(-RADIUS, -RADIUS, -RADIUS)
vrut.vertex(-RADIUS, -RADIUS,  RADIUS)
vrut.vertex( RADIUS, -RADIUS,  RADIUS)
vrut.vertex( RADIUS, -RADIUS, -RADIUS)
vrut.vertex(-RADIUS, -RADIUS, -RADIUS)
vrut.vertex(-RADIUS,  RADIUS, -RADIUS)
vrut.vertex(-RADIUS,  RADIUS,  RADIUS)
vrut.vertex( RADIUS,  RADIUS,  RADIUS)
vrut.vertex( RADIUS,  RADIUS, -RADIUS)
vrut.vertex(-RADIUS,  RADIUS, -RADIUS)
vrut.startlayer(vrut.LINES)
vrut.vertex(-RADIUS, -RADIUS,  RADIUS)
vrut.vertex(-RADIUS,  RADIUS,  RADIUS)
vrut.vertex( RADIUS, -RADIUS,  RADIUS)
vrut.vertex( RADIUS,  RADIUS,  RADIUS)
vrut.vertex( RADIUS, -RADIUS, -RADIUS)
vrut.vertex( RADIUS,  RADIUS, -RADIUS)
vrut.endlayer()

vrut.translate(vrut.WORLD, 2, 0, 1.8, 4)
vrut.curtain(vrut.CLOSE, vrut.WORLD, 2)
 

###############################################
def mytimer(num):
 global angle
 global cubeAngle
 global cubeSpeed

 if num == 0:
  vrut.reset(vrut.WORLD, 1)
  vrut.translate(vrut.WORLD, 1, 0, 0, 4)
  vrut.rotate(vrut.WORLD, 1, vrut.YAXIS, angle)
  angle = angle + SPEED
  vrut.starttimer(0, .001)

  if cubeSpeed != 0:
   vrut.reset(vrut.WORLD, 2)
   vrut.translate(vrut.WORLD, 2, 0, 1.8, 4)
   vrut.rotate(vrut.WORLD, 2, vrut.YAXIS, cubeAngle)
   cubeAngle = cubeAngle + cubeSpeed

 elif num == 2:
  vrut.curtain(vrut.CLOSE, vrut.WORLD, 2)
  cubeSpeed = 0
 

###############################################
def mykeyboard(key):
 global cubeSpeed

 if key == 'f':
  cubeSpeed = SPEED
  vrut.starttimer(2, 5)
  vrut.curtain(vrut.OPEN, vrut.WORLD, 2)
 if key == 'r':
  cubeSpeed = -SPEED
  vrut.starttimer(2, 5)
  vrut.curtain(vrut.OPEN, vrut.WORLD, 2)

 if key == 'p':
  import foodlg
 
 
 

vrut.callback(vrut.KEYBOARD_EVENT, 'mykeyboard')
vrut.callback(vrut.TIMER_EVENT, 'mytimer')
vrut.starttimer(0, .5)