#1
|
|||
|
|||
collide
Hello all.
I ‘d like to use collide by vizard. For study, when adding and moving avatar in physics2.py of help, a problem occurred. If avatar collides while the box is moving, it will react, but when the box has stopped, avatar will pass through a box. While a ball is crashed, avatar doesn't strike. It is why? Thanks for your help. Code:
#Declare some constants GRID_WIDTH = 6 GRID_HEIGHT = 6 SPACING = 1.05 MAX_BALLS = 20 MIN_POWER = 1 MAX_POWER = 80 import viz import vizmat viz.go() import vizinfo vizinfo.add('Hold down left mouse button to charge up\nRelease left button to fire ball\nPress \'r\' to reset boxes') #We need to enable physics viz.phys.enable() #Add a ground with an infinite collision plane ground = viz.add('tut_ground.wrl') ground.collidePlane() #List for holding the boxes and balls boxes = [] balls = [] for i in range(GRID_WIDTH): boxes.append([]) for j in range(GRID_HEIGHT): #Add a box model box = viz.add('box.wrl',cache=viz.CACHE_CLONE) #Use the boxes bounding box for collisions box.collideBox() #Add the box to the list boxes[i].append(box) for x in range(MAX_BALLS): #Add a ball model ball = viz.add('ball.wrl',scale=(2,2,2),cache=viz.CACHE_CLONE) #The balls collision will be represented by the bounding sphere of the ball ball.collideSphere() #Add the body to the list balls.append(ball) #Create a generator this will loop through the balls nextBall = viz.cycle(balls) #Add a green marker that will show where we are aiming, disable picking on it marker = viz.add('white_ball.wrl',color=viz.GREEN) marker.visible(viz.OFF) marker.disable(viz.PICKING) #Add a progress bar to the screen that will show how much power is charged up power = viz.addProgressBar('Power',pos=(0.8,0.1,0)) power.disable() power.set(0) #Move the head position back and up and look at the origin viz.MainView.setPosition([0,5,-20]) viz.MainView.lookat([0,0,0]) #Disable mouse navigation viz.mouse(viz.OFF) #This function will reset all the boxes and balls def ResetObjects(): for i in range(GRID_WIDTH): for j in range(GRID_HEIGHT): #Reset the physics of the object (This will zero its velocities and forces) boxes[i][j].reset() #Reset the position of the box boxes[i][j].setPosition((i*SPACING)-(GRID_WIDTH/2.0),j*SPACING+0.5,0) #Reset the rotation of the box boxes[i][j].setEuler([0,0,0]) for b in balls: #Translate the ball underneath the ground b.setPosition([0,-5,0]) #Disable physics on the ball b.disable(viz.PHYSICS) ResetObjects() #'r' key resets simulation vizact.onkeydown('r',ResetObjects) def ChargePower(): #Get detailed information about where the mouse is pointed info = viz.pick(1) #Show and place marker based on intersection result marker.visible(info.valid) marker.setPosition(info.point) #Increment the amount of power charged up power.set(power.get()+0.05) vizact.whilemousedown(viz.MOUSEBUTTON_LEFT,ChargePower) def ShootBall(): #Hide marker marker.visible(viz.OFF) #Convert the current mouse position from screen coordinates to world coordinates line = viz.MainWindow.screenToWorld(viz.mouse.getPosition()) #Create a vector that points along the line the mouse is at vector = viz.Vector(line.dir) #Set length of vector based on the amount of power charged up vector.setLength(vizmat.Interpolate(MIN_POWER,MAX_POWER,power.get())) #Move the next ball to be fired to the begin point b = nextBall.next() b.setPosition(line.begin) #Reset the ball, set its velocity vector, and enable it b.reset() b.setVelocity(vector) b.enable(viz.PHYSICS) #Reset the power power.set(0) vizact.onmouseup(viz.MOUSEBUTTON_LEFT,ShootBall) #Set the background color viz.clearcolor(viz.SKYBLUE) #add avatar avatar = viz.add('vcc_male.cfg',pos = [0,0,5], euler = [180,0,0]) avatar.collideMesh() avatar.disable(viz.DYNAMICS) avatar.state(2) import math import time def run_around(): newX = -math.cos(time.clock()) * 1.9 newZ = math.sin(time.clock()) * 1.9 avatar.setPosition([newX, 0, newZ], viz.ABS_PARENT ) avatar.setEuler( [time.clock()/math.pi*180,0,0], viz.ABS_PARENT ) vizact.ontimer(.01, run_around ) |
#2
|
|||
|
|||
You could try using a collideBox shape on the avatar instead and removing the following line:
Code:
avatar.disable(viz.DYNAMICS) |
#3
|
|||
|
|||
Thanks very helpfull!
|
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Collision problem | Dave | Vizard | 2 | 09-16-2010 04:25 AM |
Collide mesh on child objects | Enlil | Vizard | 1 | 08-31-2010 05:52 PM |
Collide Surface Problem | Boerske | Vizard | 0 | 10-05-2009 12:14 PM |
Physics Problem | Sandro Holzer | Vizard | 4 | 03-29-2009 10:51 PM |
Registering 2 objects to show the collide | djones1010 | Vizard | 1 | 03-25-2009 12:35 PM |