View Single Post
  #1  
Old 02-11-2009, 12:53 PM
Enlil Enlil is offline
Member
 
Join Date: May 2008
Posts: 61
Problems with getting head bone rotation right

Hello,

I am trying to write some code that causes a head to turn and face an object. I looked at the lookat() commands, and those didn't do what we were looking for, so I am writing it from scratch.

Now, I have a routine that takes two points and gives the euler angle that will point the first at the second. I can use this to turn the camera towards an object. However, when I try to do the same thing with the head or neck bone of an avatar, it does not work like I expected.

The code is here:

def GetTargetAngleToFace(position1, position2):
# Find horizontal target angle
x_pos = position1[X_POS] - position2[X_POS]
z_pos = position1[Z_POS] - position2[Z_POS]
horiz_angle = math.degrees(math.atan2(x_pos, z_pos))
#find vertical target angle
vert_x = math.sqrt(x_pos*x_pos + z_pos*z_pos)
y_pos = position1[Y_POS] - position2[Y_POS]
vert_angle = -math.degrees(math.atan2(y_pos, vert_x))
#print "Angles: H: " + str(horiz_angle) + " V: " + str(vert_angle)
return [horiz_angle, vert_angle, 0]


target_euler = GetTargetAngleToFace(self.ObjectToFollowWithHead.g etPosition(mode = viz.ABS_GLOBAL), self.HeadBone.getPosition(mode = viz.ABS_GLOBAL))
self.HeadBone.setEuler(target_euler, mode = viz.ABS_GLOBAL)

where self.HeadBone is the locked 'Bip01 Head' of the vcc_female model that comes with vizard.

What I get is the head tilting to not at all the same euler as target_euler. For that matter, if I just get the current euler of the head and change one element of it, then put it back in with setEuler in viz.ABS_GLOBAL mode, I get a different value when I do a getEuler in viz.ABS_GLOBAL mode. So I figure I am doing something wrong. Could anyone help me here?

Thanks,
Christian
Reply With Quote