WorldViz User Forum  

Go Back   WorldViz User Forum > Vizard

 
 
Thread Tools Rate Thread Display Modes
Prev Previous Post   Next Post Next
  #1  
Old 02-14-2014, 06:09 AM
AntoniaHamilton AntoniaHamilton is offline
Member
 
Join Date: Mar 2013
Posts: 4
avatar and her reflection

Hi,

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?

Thanks

Antonia


----------------------------------------




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

viz.setMultiSample(4)
viz.fov(60)
viz.go()

Anna = viz.addAvatar('vcc_female.cfg')
Anna.setPosition([0,0,-1])
Anna.setEuler([0,0,0])
Anna.state(15)

Betty = viz.addAvatar('vcc_female.cfg')
Betty.setPosition([0,0,1])
Betty.setEuler([0,0,0])
Betty.state(15)

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 = np.dot(rmat,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] ])

BettyBones[boneName].setPosition(newp.tolist(),mode)
BettyBones[boneName].setQuat(newq.tolist(),mode)


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

viztask.schedule(run_test)

Reply With Quote
 

Thread Tools
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -7. The time now is 11:51 AM.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2021, vBulletin Solutions, Inc.
Copyright 2002-2018 WorldViz LLC