PDA

View Full Version : Adding a lot of Avatars


Roy
09-22-2020, 10:26 AM
Hello,

How to add many avatars at once?
If we try to add 100 different avatars, do we need to use 'addAvatar()' for each avatar?

Thanks

sado_rabaudi
09-25-2020, 01:22 PM
You can note it all down in a list and iterate through it. Here's a sample script for it.

import viz

viz.clearcolor(viz.SKYBLUE)

avatar_files = ['vcc_male.cfg', 'vcc_female.cfg', 'vcc_male2.cfg']
avatars = []
position = 0
for i in avatar_files:
new = viz.addAvatar(i, pos = (position*2, 0, 4), euler=(180,0,0))
avatars.append(new)
position += 1

viz.go()

Roy
09-26-2020, 11:34 AM
Hi Sado,

How about animations for each avatar?
If animation is added by 'state()', do every avatars have different animations?
I tried to make 2avatars x 15 animations list, and show them in random order as program below. But the same avatar with same animation is shown.

avatar_files = ['vcc_male.cfg', 'vcc_female.cfg']#2avatars
animation = range(1,16)#default 15 animations

#make 30 stimuli list (2avatars x 15animations), and shuffule the order
stimulus = []
for i in avatar_files:
for j in animation:
avatarAnim = viz.addAvatar(i, pos=(0,0,0), euler=(180,0,0))
avatarAnim.state(j)
avatarAnim.visible(viz.OFF)
stimulus.append(avatarAnim)
random.shuffle(stimulus)

def experiment():
yield viztask.waitKeyDown(viz.KEY_RETURN)
for trial in stimulus:
yield viztask.waitTime(1)
avatarAnim.visible(viz.ON)
yield viztask.waitKeyDown(viz.KEY_RETURN)
avatarAnim.visible(viz.OFF)

viztask.schedule(experiment())

kennethkarthik
09-28-2020, 11:54 PM
Hi Roy,

There was just a bug in your code. You were setting "avatarAnim" to visible off and on states in your experiment function instead of using "trial" which would iterate between your shuffled states.

import viz
import random
import viztask

avatar_files = ['vcc_male.cfg', 'vcc_female.cfg']#2avatars
animation = range(0,16) #default 15 animations

viz.go()

piazza = viz.addChild('piazza.osgb')


#make 30 stimuli list (2 avatars x 15 animations), and shuffle the order
stimulus = []
for i in avatar_files:
for j in animation:
avatarAnim = viz.addAvatar(i, pos=(0,0,0), euler=(180,0,0))
avatarAnim.state(j)
avatarAnim.visible(viz.OFF)
stimulus.append(avatarAnim)
print(stimulus)
random.shuffle(stimulus)
print(stimulus)

def experiment():
yield viztask.waitKeyDown(viz.KEY_RETURN)
for trial in stimulus:
yield viztask.waitTime(1)
trial.visible(viz.ON)
yield viztask.waitKeyDown(viz.KEY_RETURN)
trial.visible(viz.OFF)

viztask.schedule(experiment())

Check this and let us know if this was your intended experiment. Thanks

Roy
10-04-2020, 02:36 AM
Hi kennethkarthik,

Thank you, it works!
But I'm wondering any other way to add avatars.
In this program, 2 avatars are loaded 15 times, causing long time to run the program.
Any ideas?

Thanks

kennethkarthik
10-05-2020, 03:41 PM
Hey Roy,

Vizard does it's optimisation when it reuses objects. However if you do want to improve load time, I would suggest just changing the state of your characters on the same avatar instead of adding a new one for each animation state. Check out the code below

import viz
import random
import viztask

avatar_files = ['vcc_male.cfg', 'vcc_female.cfg']#2avatars
animation = range(0,16) #default 15 animations

viz.go()

piazza = viz.addChild('piazza.osgb')


#make 30 stimuli list (2 avatars x 15 animations), and shuffle the order
avatars = []
for i in avatar_files:
avatarAnim = viz.addAvatar(i, pos=(0,0,0), euler=(180,0,0))
avatarAnim.visible(viz.OFF)
avatars.append(avatarAnim)

def experiment():
yield viztask.waitKeyDown(viz.KEY_RETURN)
for i in avatars:
i.visible(viz.ON)
for state in animation:
yield viztask.waitTime(0.5)
i.state(state)
yield viztask.waitKeyDown(viz.KEY_RETURN)
i.visible(viz.OFF)

viztask.schedule(experiment())