View Single Post
  #23  
Old 03-02-2006, 05:03 PM
farshizzo farshizzo is offline
WorldViz Team Member
 
Join Date: Mar 2003
Posts: 2,849
Hi,

I've attached a modified version of the script which I hope will point out why you are experiencing this problem. First of all, I removed the crosshair because you shouldn't be using objects attached to the screen when using stereo. Second, I set the ipd value to 0. The ipd is the eye distance value. So both eyes will be at the same location. Third, I multiplied the x value of the mouse position by 2.0 when using the screentoworld command. This should cause the the bullet to come directly from the mouse position, for the left half of the screen. If you set the IPD value back to normal, you will experience your problem again. This is because in stereo mode the eyes are offset from the actual viewpoint position. I've attached an image which shows why the bullet appears to go to the left (excuse my crappy drawing skills ). Do you plan on the user using the mouse to aim while wearing the HMD?
Code:
import viz
import vizmat
import math

viz.go(viz.STEREO)

#arrays
avatars = []			#for avatars
collidables = []		#for collidable objects
bullets = []			#for number of balls

#constants
NUM_BULLETS = 3			#number of balls in the array
nextBullet = 0			#index for the next ball in the array
BULLET_SPEED = 250		#speed in meters/secs of the bullet
ANIMATION = 1			#animation ID
NUM_AVATARS	= 5			#the number of avatars

court = viz.add('terrain1.wrl')
court.scale(0.5,0.5,0.5)
court.rotate(0,1,0,-90)
court.translate(-5,0,-10)
court.appearance(viz.MODULATE)
court.disable(viz.LIGHT0)

#Set eye distance to 0 to show why the bullet goes to the left of the mouse
viz.ipd(0)

#Create six avatars
def startAvatar(location):
	global court
	for i in range(NUM_AVATARS):
		
		newX = -math.cos(-2*i+15) * 2
		newZ = math.sin(i^2+1) * 2	
		male = viz.add('male.cfg')
		male.translate(newX,0,newZ)
		male.rotate(180,0,0)
		avatars.append(male) #Save avatar in list
startAvatar(court)

for x in range(0,NUM_BULLETS):
	#create a bullet that is initially hidden
	bullet = viz.add('ball.wrl')
	bullet.scale(.1,.1,.1)
	bullet.visible(viz.OFF)
	
	#add a shadow, To be removed once final program is completed
	bullet.shadow = viz.add('shadow.wrl')
	bullet.shadow.alpha(0.7)
	bullet.shadow.visible(viz.OFF)
	
	#Enable collisions with the ball based on a sphere shape
	bullet.collidesphere(0.25)
	bullet.isTarget = 0
	collidables.append(bullet)

	#keep track of the last object the ball hit
	bullet.lastHit = 0
	
	#add the ball to the ball list
	bullets.append(bullet)
	bullet.active = 0
def shootBullet():
	global nextBullet
	#find the next available ball to shoot
	bullet = bullets[nextBullet]
	nextBullet = (nextBullet + 1) % NUM_BULLETS
	#Calculate the vector of the ball based on the mouse position
	pos = viz.mousepos()
	bulletvector = viz.screentoworld(pos[0]*2.0,pos[1]) #Need to account for stereo
	bullet.vector = viz.Vector(bulletvector[3]-bulletvector[0],bulletvector[4]-bulletvector[1],bulletvector[5]-bulletvector[2])
	bullet.vector.normalize()
	bullet.vector *= BULLET_SPEED
	
	#translate the bullet to the head position
	bullet.translate(viz.get(viz.HEAD_POS))
	
	#make the bullet and it's shadow visible
	bullet.visible(viz.ON)
	bullet.shadow.visible(viz.ON)
	
	#mark the bullet as active
	bullet.active = 1

def MoveBullet(bullet,elapsed):
	hitObject = 0
	
	#check if bullet is colliding with an object
	for object in collidables:
		
		#perform the collision check with the object
		info = bullet.collidingwith(object,1)
		if info.intersected:
			#set the bullets new vector to the reflection vector
			bullet.vector = viz.Vector(vizmat.ReflectionVector(bullet.vector,info.normalVector))
			
			#create a vector of the normal of the collision
			normal = viz.Vector(info.normalVector)
			
			#Check dot product of velocity and normal
			if bullet.vector * normal <0:
				bullet.vector*= -1
						
			#if object.isTarget and ball.lastHit != object:
				
			hitObject = object
			
			#play ball bounce sound
			viz.playsound('bounce.wav')
			
			break
	#get the bullet's current position
	pos = bullet.get(viz.POSITION)
	
	#calculate the balls future position based on it's velocity
	futurePos = pos + (bullet.vector * elapsed)
	bullet.translate(futurePos.get())
	
	#Update the bullet's shadow
	bullet.shadow.translate(futurePos.x,0,futurePos.z)	
			
def mytimer(num):
	
	if num == ANIMATION:
		
		#Calculate elapsed time since last update
		elapsed = viz.elapsed()
		
		#Update each active ball
		for bullet in bullets:
			if bullet.active:
				#Move the ball and check if it has collided with any objects
				MoveBullet(bullet,elapsed)

#Shoot a ball whenever left mousebutton is clicked
vizact.onmousedown(viz.MOUSEBUTTON_LEFT,shootBullet)

#Create callbacks for timer events
viz.callback(viz.TIMER_EVENT,mytimer)

##Start a timer which starts the next available duck
#viz.starttimer(START_DUCK,0.01)

#Start the animation timer, which animates the ball and checks for collisions
viz.starttimer(ANIMATION,0.01,-1)

#Move the head position back
viz.translate(viz.HEAD_POS,0,0,-10)	

#Disable mouse navigation
viz.mouse(viz.OFF)
Attached Thumbnails
Click image for larger version

Name:	bullet_stereo.JPG
Views:	1715
Size:	11.5 KB
ID:	79  
Reply With Quote