Thanks very much for your reply. I have been working hard on this code and it is now completely different from when I posted my initial question. Please see below.
1. how do I stop the avatar going out of the screen?
2. when the avatar's right arm hits the target, I want the avatar to do something e.g. dance, if the avatars right arm hits a distractor then it should something else, e.g. ball should change colour - I have tried setting this up using collisions and hotspots and can't get either to work?
3. I still haven't managed to get the objects in a semi-circle so that they are all equidistant from the avatar start position
Any help would be huegly appreciated. Sorry the code is such a mess, any help with tidying it up would also be greatly appreciated.
Code:
import viz
import viztask
import random
import vizjoy
viz.go()
def createlabel():
global trialNumber, time, xPosition
#Create background quad for labels
viz.startlayer(viz.QUADS)
viz.vertexcolor(0,0.2,0)
viz.vertex(0,0,0)
viz.vertex(0,0.05,0)
viz.vertex(0.20,0.05,0)
viz.vertex(0.205,0,0)
InfoQuad = viz.endlayer(viz.SCREEN)
InfoQuad.draworder(30)
InfoQuad.disable(viz.DEPTH_WRITE)
InfoQuad.alpha(0.5)
InfoQuad.translate(1-0.20,0)
#Create label for trial number
trialNumber = InfoQuad.add(viz.TEXT3D,'0')
trialNumber.scale(0.3,0.3,1)
trialNumber.translate(0.01,0.02)
trialNumber.font('times.ttf')
trialNumber.color(viz.GREEN)
trialNumber.draworder(31)
trialNumber.disable(viz.LIGHTING)
trialNumber.alignment(viz.TEXT_LEFT_CENTER)
#Create label for nv
time = InfoQuad.add(viz.TEXT3D,'0')
time.scale(0.3,0.3,1)
time.translate(0.04,0.02)
time.font('times.ttf')
time.color(viz.GREEN)
time.draworder(31)
time.disable(viz.LIGHTING)
time.alignment(viz.TEXT_LEFT_CENTER)
#Create label for reversals
xPosition = InfoQuad.add(viz.TEXT3D,'0')
xPosition.scale(0.3,0.3,1)
xPosition.translate(0.08,0.02)
xPosition.font('times.ttf')
xPosition.color(viz.GREEN)
xPosition.draworder(31)
xPosition.disable(viz.LIGHTING)
xPosition.alignment(viz.TEXT_LEFT_CENTER)
createlabel()
joystick = vizjoy.add()
viz.mouse(viz.OFF)
viz.mouse.setTrap(viz.ON)
#viz.mouse.setVisible(viz.OFF)
Z_dist = -5
viz.MainView.move(0.5,0,-10)
filename = viz.input('Input data file name')
file = filename + 'T1StaticObjects' + '.txt'
print 'Filename: ', file
#viz.window.setSize(-1) # set to full size
# Add distractor and target objects
ballsize = [2.0,2.0,2.0]
# Distractor ball
distractor = viz.add('soccerball.ive')
distractorClone1 = distractor.clone() #Copy the object
distractorClone1.setScale(ballsize[0],ballsize[1],2)
distractorClone1.addAction(vizact.spin(0,1,0,100))
distractorClone2 = distractor.clone() #Copy the object
distractorClone2.setScale(ballsize[0],ballsize[1],2)
distractorClone2.addAction(vizact.spin(0,1,0,100))
distractorClone3 = distractor.clone() #Copy the object
distractorClone3.setScale(ballsize[0],ballsize[1],2)
distractorClone3.addAction(vizact.spin(0,1,0,100))
distractorClone4 = distractor.clone() #Copy the object
distractorClone4.setScale(ballsize[0],ballsize[1],2)
distractorClone4.addAction(vizact.spin(0,1,0,100))
distractorClone5 = distractor.clone() #Copy the object
distractorClone5.setScale(ballsize[0],ballsize[1],2)
distractorClone5.addAction(vizact.spin(0,1,0,100))
# Target Ball
target = viz.add('soccerball.ive')
target.setScale(ballsize[0],ballsize[1],2)
target.addAction(vizact.spin(0,-1,0,100))
pos = [[-1.5,1.5,Z_dist],[-1.5,2.5,Z_dist]]
pos1 = [[-1.5,0.75,Z_dist],[-1.5,1.5,Z_dist],[-1.5,2.25,Z_dist],[-1.5,3.0,Z_dist]]
pos2 = [[-1.5,0.5,Z_dist],[-1.5,1.0,Z_dist],[-1.5,1.5,Z_dist],[-1.5,2.0,Z_dist],[-1.5,2.5,Z_dist],[-1.5,3.0,Z_dist]]
objects = [target,distractorClone1,distractorClone2,distractorClone3,distractorClone4,distractorClone5]
# Set up zones for the objects to appear on the screen
choice = ['1', '3', '5']
select = viz.choose('How many distractors?', choice)
def sceneOn():
global target_position,rand_pos,Rotation
if select == 0:
# set objects to 2 random positions
rand_pos = random.sample(pos,2)
objects[0].setPosition(rand_pos[0])
objects[1].setPosition(rand_pos[1])
target_position = rand_pos[0]
print 'target position:', target_position
if select == 1:
#set objects to 4 different random positions
rand_pos = random.sample(pos1,4)
objects[0].setPosition(rand_pos[0])
objects[1].setPosition(rand_pos[1])
objects[2].setPosition(rand_pos[2])
objects[3].setPosition(rand_pos[3])
target_position = rand_pos[0]
print 'target position:', target_position
if select == 2:
#set objects to 6 different random positions
rand_pos = random.sample(pos2,6)
objects[0].setPosition(rand_pos[0])
objects[1].setPosition(rand_pos[1])
objects[2].setPosition(rand_pos[2])
objects[3].setPosition(rand_pos[3])
objects[4].setPosition(rand_pos[4])
objects[5].setPosition(rand_pos[5])
target_position = rand_pos[0]
print 'target position:', target_position
# Set up male and female avatars
choice2 = ['male', 'female']
select2 = viz.choose('Gender of participant?', choice2)
if select2 == 0:
avatar = viz.add('vcc_male.cfg')
if select2 == 1:
avatar = viz.add('vcc_female.cfg')
avatar.lookat(-10, 0, -10)
avatar.state(1)
import time
def position_loop():
global pos_inc, x, y, Rotation, start_position, target_position, rand_pos
tinc = 1/500
pos_inc = [0,0]
start_position = (3.0, 1.0,Z_dist)
start_time = time.time()
elapsed_time = time.time() - start_time
total_reps = 10
def position_timer(num):
global pos_inc, start_position, target_position,Rotation
position = joystick.getPosition()
Rotation = joystick.getRotation()
pos_inc[0] = pos_inc[0] + position[0]/50
pos_inc[1] = pos_inc[1] + position[1]/50
x = start_position[0]+pos_inc[0]
y = start_position[1]+pos_inc[1]
avatar.setPosition(x,y,Z_dist)
if Rotation > 1:
elapsed_time = time.time() - start_time
#print 'Elapsed Time: ', elapsed_time, 'X Position: ', x, 'Y Position: ', y #Y',"%.2f, %.2f, %.2f" % (elapsed_time,x,y)
SaveData(select, select2, elapsed_time, x, y)
viz.callback(viz.TIMER_EVENT,position_timer)
viz.starttimer(1,tinc,viz.FOREVER)
def experiment():
global pos_inc, x, y, Rotation, start_position, target_position, select, select2, elapsed_time,rand_pos
#updatelabel(0,0,0)
total_reps = 10
for i in range (total_reps):
print total_reps
yield viztask.waitKeyDown(' ')
position_loop()
#Ready = viz.ask('Are You Ready?')
#yield viztask.waitKeyDown(' ')
yield viztask.waitMouseDown(viz.MOUSEBUTTON_LEFT)
avatar.lookat(-10, 0, -5)
sceneOn()
avatar.state(2)
armBone = avatar.getBone('Bip01 R UpperArm')
# Don't move the bone with built-in animations
armBone.lock()
# Raise arm
armBone.setEuler(0, 0, -70)
#updatelabel(tr,round(x,1), round(elapsed_time),1)
#def updatelabel(tr,x,elapsed_time):
# global trialNumber, time, xPosition
# trialNumber.message(str(tr))
# time.message(str(elapsed_time))
# xPosition.message(str(x))
import vizinfo
# Define a function that saves data
file = open(filename + 'T1StaticObjects', 'w')
def SaveData(a,b,c,d,e):
# Create the output string
out = str(a) + '\t' + str(b) + '\t' + str(c) + '\t' + str(d) + '\t' + str(e) + '\n'
out_headings = 'Distractor Number' + '\t' + 'Avatar' + '\t' + 'Elapsed Time' + '\t' + 'x Position' + '\t' + 'y Position' + '\t'
if a == 0:
file.write (out_headings)
# Write the string to the output file
file.write(out)
# Makes sure the file data is really written to the harddrive
file.flush()
viztask.schedule(experiment())