View Single Post
Old 02-14-2014, 06:09 AM
AntoniaHamilton AntoniaHamilton is offline
Join Date: Mar 2013
Posts: 4
avatar and her reflection


i'm trying to create a scene with two avatars who mirror each other (e.g. Anna raises her R hand, Betty raises her left hand, with no visible mirror). I've tried a variety of ways to copy Anna's bones or actions onto Betty, and can't get any to work.

The code below is what I *thought* should work - it premultiplies the full Position/Quaterion matrix for each bone by the appropriate transformation matrix. But it isn't giving me the right thing. The commented out version doesn't work either.

So I hope someone can help. Is this the right approach? Is there something silly wrong here? Or is there a different solution all together?




import viz
import vizact
import vizshape

import viztask #Needed to control the experiment structure.
import vizinput #Needed to allow the input of participant information.
import time #Needed to record the date and time.

import numpy as np


Anna = viz.addAvatar('vcc_female.cfg')

Betty = viz.addAvatar('vcc_female.cfg')

AnnaBones = {bone.getName(): bone for bone in Anna.getBoneList()}#For every bone in Linda's bone list, gets its name and make a dictionary.
BettyBones = {bone.getName(): bone for bone in Betty.getBoneList()}#Does the same for Mike.

mode = viz.AVATAR_LOCAL #Vizard defaults to ABS_PARENT. Sets 'mode' so that when we move the avatars' bones, they move locally to each avatar.

def reflect():
[BettyBones[bone].lock() for bone in BettyBones] #Locks Betty's bones.

# work out position & quaterion of each bone
for boneName in BettyBones:

p = AnnaBones[boneName].getPosition(mode)
q = AnnaBones[boneName].getQuat(mode)
t = AnnaBones[boneName].getMatrix(mode)

print '----------------'
print mode
print p
print q
print t

# s = vizmat.Transform()
# s.makeScale(1,-1,1)
# t.preMult(s)
# print t
# BettyBones[boneName].setMatrix(t,mode)

orig = np.array([ [p[0], 0, 0, q[0]], [0, p[1], 0, q[1]], [0, 0, p[2], q[2]], [0, 0, 0, q[3]] ])
rmat = np.array([ [ 1, 0, 0, 0], [0, 1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1] ])

nnn =,orig) #pre-multiply the original by the transform

newp = np.array([ nnn[0,0], nnn[1,1], nnn[2,2] ])
newq = np.array([ nnn[0,3], nnn[1,3], nnn[2,3], nnn[3,3] ])


def run_test():
vizact.ontimer(0, reflect)


Reply With Quote