![]() |
#1
|
|||
|
|||
Multidimensional Arrays
I was wondering if anyone could help me with a multidimensional array. I need to make an array that satisfies 3 conditions. There will be 3 different avatars, each having to hold 3 different items(gun, camera, cell phone). There has to be 10 of each of these conditions (shown in attachment). Any ideas? Thanks. I'm thinking it would be a multidimensional 3x3 array that I can call 10 times. Another idea I had was just make a 30x30 array but I think that would take too long to load. Please help.
|
#2
|
|||
|
|||
Hi,
I don't understand what you are asking for. How many avatars do you need at any given time? What exactly do you need to do with these avatars? |
#3
|
|||
|
|||
I need 3 separate avatars, a mexican-american, a white-american, and the experimenter. Each of these avatars will hold one of three items, a camera, a cell phone or a gun. Technically I have to have 90 different avatars, but I think I can use the same three avatars and just do different "link" commands. They will be coming toward the subject relatively quickly and the subject will have to decide whether or not they feel threatened and if they are threatened, shoot the person coming at them. The avatars should come at the subject at a randomized fashion, but at the end of the study, the following conditions must be met:
Mex-american - 10 cameras, 10 cell phones, 10 guns wht-american - 10 cameras, 10 cell phones, 10 guns experimenter - 10 cameras, 10 cell phones, 10 guns Each avatar must hold one of the three items 10 different times. To the subject it should appear as if 90 avatars are coming at them (not necessarily all at once). I hope that's a little more clear. If not, please let me know. Thanks |
#4
|
|||
|
|||
Hi,
If you are only viewing each avatar one at a time, then you only need to add 3 avatars. When you are starting an avatar link the appropriate object to it. When you are done with the avatar unlink the object from it. |
#5
|
|||
|
|||
The only problem with that is that I would need more than 3 avatars to come out at once. The experimenter wants a continous flow of avatars. Would I be able to do this w/only an array of 3 avatars and the link and unlink?
|
#6
|
|||
|
|||
Hi,
You need to create at least the same number of avatars that you want to be visible at the same time. So if you only need 6 avatars to be visible at a time, then you need at least 6 avatars. |
#7
|
|||
|
|||
Thanks that helped a lot. I have the program functioning as I wanted it to. My next step is to "tag each avatar". When I call the avatars using:
Code:
#Create all the avatars and add them to the waiting list for x in range(0,3): if x == 0: male = viz.add(people[0]) male.scale(.1,.1,.1) link = viz.add(viz.GROUP) myphone = link.add(objects[0]) myphone.scale(.0005,.0005,.0005) male.linkbone(link,'skel_HandR') elif x == 1: male = viz.add(people[1]) link = viz.add(viz.GROUP) myphone = link.add(objects[1]) myphone.scale(.0005,.0005,.0005) myphone.translate(0,-.25,.17) myphone.rotate(180) male.linkbone(link,'skel_Neck') elif x ==2: male = viz.add(people[2]) link = viz.add(viz.GROUP) myphone = link.add(objects[2]) myphone.scale(.0008,.0008,.0008) myphone.rotate(66.51,151.49,86.01) myphone.translate(-0.02,0.04,0.02) male.linkbone(link,'skel_HandRF') male.translate(3*x,-10,10) male.rotate(180) #Add the avatar to the waiting and lemming list waitlist.append(male) characters.append(male) Code:
def RestoreAvatar(): global keyindex if len(dead_list): print "avatar restored" avatar = waitlist.pop() #Ressurrect dead avatar avatar.visible(1) #Make it visible characters.append(avatar) #Add it to avatar list # walkAvatar(avatar) print 'avatar restored' def RemoveAvatar(avatar): avatar.visible(0) #Hide avatar #avatar._face_.visible(0) #Hide face avatar.speed(1) #Restore speed characters.remove(avatar) #Remove from list dead_list.append(avatar) #Add to dead list Code:
if info.intersected: autospawn = not autospawn print 'intersect point is',info.intersectPoint if info.object in waitlist: print "in waitlist" if info.object in dead_list: print "in dead_list" if info.object in characters: print "in characters" avatarsHit = avatarsHit + 1 viz.playsound('arrgh.wav') print 'Avatars hit: ', avatarsHit WaitThenFreeze = vizact.sequence( vizact.waittime(info.object.getduration(7)+.001), vizact.speed_node(0) ) info.object.execute(7) info.object.clear(viz.ALL) info.object.clear(viz.CURRENT_ACTION) info.object.add(WaitThenFreeze) #Add the action to the avatar RemoveAvatarAction = vizact.call(RemoveAvatar,info.object) info.object.add(RemoveAvatarAction) #Add action to remove avatar |
#8
|
|||
|
|||
Hi,
I'm not sure exactly what you are asking here. You just need a way to identify each avatar when they get shot? Just add some tag to each avatar when you create/restore it. Code:
male.tag = 'avatar 1 with object 2' Code:
print info.object.tag,'got shot' |
#9
|
|||
|
|||
![]()
PERFECT! Thanks for the help. Can I do the same thing with the object they are holding? Since the object is a different array that's merely linked to this one, how do I identify the object in hand? Basically if it's a gun or a cell phone I just need to specify that it's "non-threatening". If it's a gun then i have to specify that it's "threatening".
Thanks again! |
#10
|
|||
|
|||
Hi,
In python, you can add as many attributes to an object as you wish. So to determine if an object is "threatening" simply give it an attribute which says so. Code:
donut = viz.add('donut.wrl') donut.isThreatening = False donut.isDelicious = True gun = viz.add('gun.wrl') gun.isThreatening = True gun.isDelicious = False |
#11
|
|||
|
|||
Ok, I understand that part, but my problem is how do I let the program know that the avatar is holding that object. In the MoveBullet function shown above, I identify the avatar "attribute" as info.object.tag, but how do I do that with the object they are holding. Can I do something like info.object.tag.linkbone to identify each object of each avatar?
Code:
for x in range(0,3): if x == 0: male = viz.add(people[0]) male.scale(.1,.1,.1) link = viz.add(viz.GROUP) myphone = link.add(objects[0]) myphone.scale(.0005,.0005,.0005) male.linkbone(link,'skel_HandR') male.tag = 0 myphone.threatening = TRUE elif x == 1: male = viz.add(people[1]) link = viz.add(viz.GROUP) myphone = link.add(objects[1]) myphone.scale(.0005,.0005,.0005) myphone.translate(0,-.25,.17) myphone.rotate(180) male.linkbone(link,'skel_Neck') male.tag = 1 myphone.threatening = FALSE elif x ==2: male = viz.add(people[2]) link = viz.add(viz.GROUP) myphone = link.add(objects[2]) myphone.scale(.0008,.0008,.0008) myphone.rotate(66.51,151.49,86.01) myphone.translate(-0.02,0.04,0.02) male.linkbone(link,'skel_HandRF') male.tag = 2 myphone.threatening = FALSE male.translate(3*x,-10,10) male.rotate(180) #Add the avatar to the waiting and lemming list waitlist.append(male) characters.append(male) |
#12
|
|||
|
|||
Hi,
As I already mentioned, you can add any attribute to an object. So just add an attribute to each avatar which contains a list of the objects it is holding. Code:
male.holding = [gun,phone,bowlingBall] . . . print 'Avatar is holding',info.object.holding |
#13
|
|||
|
|||
Thank you, worked GREAT
|
![]() |
|
|