WorldViz User Forum

WorldViz User Forum (https://forum.worldviz.com/index.php)
-   Vizard (https://forum.worldviz.com/forumdisplay.php?f=17)
-   -   collide (https://forum.worldviz.com/showthread.php?t=3052)

7up 10-27-2010 08:08 PM

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 )


Jeff 10-29-2010 11:02 AM

You could try using a collideBox shape on the avatar instead and removing the following line:
Code:

avatar.disable(viz.DYNAMICS)

7up 10-31-2010 06:35 PM

Thanks very helpfull!


All times are GMT -7. The time now is 03:13 PM.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Copyright 2002-2023 WorldViz LLC