PDA

View Full Version : Looking through the eyes of an avatar


Frank Verberne
03-31-2008, 10:19 AM
In my experiment, I want participants to see the world through the eyes of an avatar. Therefore, I linked het headbone of the avatar and the Mainview to the same tracker. This works great, but not perfect yet. The problem is that the MainView is inside the head of the avatar. When I update the position of the link MainView-tracker with the position of the headbone and I set that position 11 cm further on the X-axis, then it is solved when participants look one direction. However, when they turn their heads 180 degrees (look the other way), the view is translated to the back of the head of the avatar. So what I would like is the MainView to be in front of the eyes of the avatar (not INSIDE its head) no matter where the participant looks at. How can I do that? I hope my question is clear, the code below should make things clearer.
#Link all bones to trackers of pp1
def updateBones_pp1():
for i in range(0, len(link_bones_pp1)):
if link_bones_pp1[i] != 'None':
bone = avatar.getBone(link_bones_pp1[i])
euler = tracker[i].getEuler()
bone.setEuler(euler,viz.AVATAR_WORLD)
if link_bones_pp1[i] == 'skel_Head01':
pos = tracker[i].getPosition()
link.setPos([0,0,pos[2]+.11])

#Depending on the subjectnumber, create an avatar and set the position of the viewpoint.
if subject != '':
condition = int(subject)%4
if condition == 0 or condition == 1: #Condition 4 or 1
global link
link = viz.link(tracker[19], viz.MainView) #Link MainView to headtracker
avatar = viz.add(avatarlist[condition]) #Avatar = Dutch for condition 4 and Moroccan for condition 1
lock_all_bones(avatar)
avatarLink(avatar, 1)
vizact.ontimer(0,updateBones_pp1) #Update linkbones
elif condition == 2 or condition == 3: #Condition 2 or 3
avatar = viz.add(avatarlist[condition-2]) #Avatar = Dutch for condition 2 and Moroccan for condition 3
viz.MainView.setPosition(0,1.90,-5.5) #(Y,Z,X) third person perspective
viz.MainView.getHeadLight().disable()
light_avatar = viz.addLight()
else:
print 'Geen proefpersoonnummer ingevuld! Dit is de testmode!'
avatar = viz.add(avatarlist[0])
lock_all_bones(avatar)
avatarLink(avatar,1)
vizact.ontimer(0,updateBones_pp1)
avatar.scale(0.33,0.33,0.33)
light_mirror = viz.addLight()
light_mirror.position(0,0,3,0)

farshizzo
03-31-2008, 12:27 PM
You will need to use the link.preTrans operator to offset the link position. For example, if the the eyes of the avatar are 4 centimeters forward from the head position then you would use the following code:link = viz.link(headBone,viz.MainView)
link.preTrans([0,0,0.04])

Frank Verberne
04-01-2008, 05:52 AM
Thanks again farshizzo! Now it works perfectly.