View Single Post
  #2  
Old 12-01-2004, 12:35 PM
farshizzo farshizzo is offline
WorldViz Team Member
 
Join Date: Mar 2003
Posts: 2,849
Hi,

I wrote the following sample script that should fix your problems. I use the viewpoints built-in animation engines to translate and rotate. When they are finished I translate/rotate them to the final value just to be sure they are exact. Also, when I calculate where to move/turn, I round the values to integers. Also, I check if the viewpoint is currently being animated when a key is pressed.
Code:
import viz
viz.go()

#Add a ground
viz.add('tut_ground.wrl')

#Get main viewpoint object
view = viz.get(viz.MAIN_VIEWPOINT)

#Create a variable that will tell whether viewpoing is currently moving/turning
view.animating = 0

#Variable that holds current destination value
final = [0,0,0,0]

def onkeydown(key):
	if key == viz.KEY_UP:
		#Make sure view is not animating
		if not view.animating:
			pos = view.get(viz.HEAD_POS) 
			trans = view.get(viz.BODY_LOOK)
			#Round values to nearest integer
			final[0] = int(round(pos[0] + trans[0]))
			final[1] = int(round(pos[1] + trans[1]))
			final[2] = int(round(pos[2] + trans[2]))
			#Start animating viewpoint
			view.goto(final,1,viz.TIME) 
			view.animating = 1
	elif key == '6':
		#Make sure view is not animating
		if not view.animating:
			#Compute rotation of turning body 90 degrees to right
			xform = viz.Transform(view.get(viz.BODY_MAT))
			xform.postRot(0,1,0,90)
			rot = xform.getRot()
			#Round values to nearest integer
			final[0] = int(round(rot[0]))
			final[1] = int(round(rot[1]))
			final[2] = int(round(rot[2]))
			final[3] = int(round(rot[3]))
			#Start animating viewpoint
			view.spinmask(viz.BODY_ORI) #Spin the body orientation
			view.spinto(final,45) #Spin with speed of 45 deg/sec
			view.animating = 1

viz.callback(viz.KEYDOWN_EVENT,onkeydown)

def onstop(object, type):
	if type == viz.MOVE:
		#Viewpoint is done moving, translate it to the final value just to be sure
		view.translate(final)
		view.animating = 0
	elif type == viz.SPIN:
		#Viewpoint is done spinning, rotate it to the final value just to be sure
		view.rotate(final,viz.BODY_ORI)
		view.animating = 0
	
view.callback(viz.STOP_EVENT,onstop)
Reply With Quote