Since spinning balls is so much fun,
Let's try spinning more than one.
Code:
from viz import *
go()
clearcolor(.8,.8,.8)
ball1 = add('ball.wrl')
ball1.translate(.3,1.8,1.5)
ball2 = add('ball.wrl')
ball2.translate(-.3,1.8,1.5)
balls = []
balls.append(ball1)
balls.append(ball2)
INCREMENT = .5
mouse(OFF)
restrictmouse(OFF)
def mousemove(x,y):
object = pick()
if viz.mouse.getState() == viz.MOUSEBUTTON_LEFT:
mousedown = 1
else:
mousedown = 0
if object in balls and mousedown == 1:
object.rotate(0,1,0,-x*INCREMENT,RELATIVE_WORLD)
object.rotate(1,0,0,y*INCREMENT,RELATIVE_WORLD)
mousedata(RELATIVE,RELATIVE)
callback(MOUSEMOVE_EVENT,mousemove)
Or if you like the number three,
Let's try to make them all agree.
Code:
from viz import *
go()
clearcolor(.8,.8,.8)
ball1 = add('ball.wrl')
ball1.translate(0,2.1,2)
ball2 = add('ball.wrl')
ball2.translate(.4,1.5,2)
ball3 = add('ball.wrl')
ball3.translate(-.4,1.5,2)
balls = []
balls.append(ball1)
balls.append(ball2)
balls.append(ball3)
INCREMENT = .5
mouse(OFF)
restrictmouse(OFF)
def mousemove(x,y):
object = pick()
if viz.mouse.getState() == viz.MOUSEBUTTON_LEFT:
mousedown = 1
else:
mousedown = 0
if object in balls and mousedown == 1:
for b in range(len(balls)):
balls[b].rotate(0,1,0,-x*INCREMENT,RELATIVE_WORLD)
balls[b].rotate(1,0,0,y*INCREMENT,RELATIVE_WORLD)
mousedata(RELATIVE,RELATIVE)
callback(MOUSEMOVE_EVENT,mousemove)
And here's the one you want the most,
Just like iPhone make it coast.
Code:
from viz import *
go()
clearcolor(.8,.8,.8)
ball1 = add('ball.wrl')
ball1.translate(.3,1.8,1.5)
ball2 = add('ball.wrl')
ball2.translate(-.3,1.8,1.5)
balls = []
balls.append(ball1)
balls.append(ball2)
increment = .5
COAST = 1
mx = 0
my = 0
object = []
spinning = 0
mouse(OFF)
restrictmouse(OFF)
def mousemove(x,y):
global mx,my,object,spinning,increment
if spinning == 0:
object = pick()
if mouse.getState() == MOUSEBUTTON_LEFT:
object = pick()
mousedown = 1
killtimer(COAST)
spinning = 0
else:
mousedown = 0
if object in balls and mousedown == 1:
object.rotate(0,1,0,-x*increment,RELATIVE_WORLD)
object.rotate(1,0,0,y*increment,RELATIVE_WORLD)
mx = x
my = y
if mousedown == 1 and spinning == 0:
increment = .5
spinning = 1
starttimer(COAST,.01,FOREVER)
mousedata(RELATIVE,RELATIVE)
callback(MOUSEMOVE_EVENT,mousemove)
def onTimer(num):
global spinning,mx,my,object,increment
if num == COAST:
object.rotate(0,1,0,-mx*increment,RELATIVE_WORLD)
object.rotate(1,0,0,my*increment,RELATIVE_WORLD)
increment = increment - .01
if abs(increment) < .01:
spinning = 0
increment = .5
killtimer(COAST)
viz.callback(viz.TIMER_EVENT,onTimer)