WorldViz User Forum  

Go Back   WorldViz User Forum > Vizard

Reply
 
Thread Tools Rate Thread Display Modes
  #1  
Old 10-27-2010, 08:08 PM
7up 7up is offline
Member
 
Join Date: Aug 2010
Posts: 5
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 )
Reply With Quote
  #2  
Old 10-29-2010, 11:02 AM
Jeff Jeff is offline
WorldViz Team Member
 
Join Date: Aug 2008
Posts: 2,471
You could try using a collideBox shape on the avatar instead and removing the following line:
Code:
avatar.disable(viz.DYNAMICS)
Reply With Quote
  #3  
Old 10-31-2010, 06:35 PM
7up 7up is offline
Member
 
Join Date: Aug 2010
Posts: 5
Thanks very helpfull!
Reply With Quote
Reply

Thread Tools
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

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


All times are GMT -7. The time now is 05:56 AM.


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