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)