I wrote some code myself to solve the problem:
Code:
import math
import viz
# --- REQUIRED FUNCTIONS --- #
def Angle2Euler( angle ):
euler = 0
# Not defined for negative values
if angle < 0:
return 0
# Calculate 'euler' depending on quadrant
else:
if angle <= 90:
# Q1
euler = 90 - angle
elif angle <= 270:
# Q2 & Q3
euler = -( angle-90 )
else:
# Q4
euler = 360 - angle + 90
return euler
def Cart2Pol( x, y, unit='rad' ):
# Radius
r = math.sqrt( math.pow(x,2) + math.pow(y,2) )
# Angle in [rad]
t = math.atan2( y ,x )
# Angle in [deg]
if unit.lower() == 'deg':
t = math.degrees( math.atan(float(y)/float(x)) )
if x < 0:
t += 180 # Q2 & Q3
elif x > 0 and y < 0:
t += 360 # Q4
return r, t
def LookAt( Target ):
# Get current position and orientation
Pos = viz.MainView.getPosition()
Ori = viz.MainView.getEuler()
# Define position as 2D point 'P'
P = [Pos[0], Pos[2]]
# Define target as 2D point 'T'
T = [Target[0], Target[2]]
# Shift 'P' into origin (= 'P0') and
# move 'T' accordingly (= 'T0')
T0 = [T[0]-P[0], T[1]-P[1]]
# Get location of 'T0' as polar angle
angle = Cart2Pol( T0[0], T0[1], 'deg' )[1]
# Convert angle to Vizard's Euler style
euler = Angle2Euler( angle )
# Create rotation action towards target
rotation = vizact.spinTo( euler=[euler,0,0], time=2 )
# Apply rotation to MainView
viz.MainView.runAction( rotation )
# --- AN EXAMPLE --- #
# Go!
viz.add('court.ive')
viz.go()
# Add a box behind the MainView
box = viz.add('box.wrl')
box.setPosition([-5,1.7,-10])
# Look at the box
LookAt( box.getPosition() )
This may not be the easiest or most elegant way, but it works!