Collision Detection fail........Why????

I have attempted to get collision from “collisionEntry” by coding like this below…and what wrong

When I tried to get the number of collision of my ray downward using

 print self.queue.getNumEntries() 

but do not have anything happen (collision return number = 0)
::::::::::::::What wrong:::::::::::::::::
I cried and felt baaaad…Help me please THX

import direct.directbase.DirectStart
from direct.showbase.DirectObject import DirectObject
from pandac.PandaModules import * 

base.cTrav = CollisionTraverser()#traverser
base.cTrav.setRespectPrevTransform(1)

class EntryCollision(DirectObject):
    def __init__(self):
        #set camera 
        base.disableMouse()
        lens = OrthographicLens() 
        lens.setFilmSize(800, 600)
        lens.setNearFar(-500,500)
        base.cam.node().setLens(lens)

        #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
        #create collision Traverser
        base.cTrav = CollisionTraverser()
        base.cTrav.showCollisions(render)
        self.queue = CollisionHandlerQueue()
        #load object
        obj  = loader.loadModel("smiley.egg")
        obj.setScale(20)
        obj.setPos(0,0,100)
        obj.reparentTo(render)        
        obj.setCollideMask(BitMask32.allOff())
        #add collision ray to the object
        self.rayNode = CollisionNode('Obj_ray')
        self.raySolid = CollisionRay(0,0,0,0,0,-1)
        self.rayNode.addSolid(self.raySolid)
        #create collision node from object and collision solide
        self.collisionRayNode = obj.attachNewNode(self.rayNode)
        self.rayNode.setIntoCollideMask( BitMask32.allOff())
        self.rayNode.setFromCollideMask( BitMask32.bit(1))
        self.collisionRayNode.show()
        base.cTrav.addCollider(self.collisionRayNode, self.queue)
        base.cTrav.traverse(render)
        
        #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
        #load wall
        wall = loader.loadModel('floor.egg')
        wall.setScale(10)
        wall.setPos(0,0,-100)
        wall.reparentTo(render)
        wall.setCollideMask( BitMask32.allOn())

        #::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
        #get Collision Entry
        print self.queue.getNumEntries()



x = EntryCollision()
run()

[code]
:unamused: :unamused:

See this part :

        base.cTrav.traverse(render) 
        
        #:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 
        #load wall 
        wall = loader.loadModel('floor.egg') 
        wall.setScale(10) 
        wall.setPos(0,0,-100) 
        wall.reparentTo(render) 
        wall.setCollideMask( BitMask32.allOn())

At the moment of collision traversal, floor’s collide mask hasn’t been set. You should call traverse() after collision setup.

Thank You…
I got it but.
can you explain more about why i need to do that (call Traverser)
Because the collision is appeared but cannot capture
Thx again

What should be done by “traverse(root)” is walking through the scenegraph under root node, looking for any matching collision mask. If there is any match, the collision detection algorithm would be called to determine the collision point, then send the appropriate data according to collision handler being used.
I haven’t read the source though, but that is what should happens.
Don’t hit me :slight_smile:

So if you call traverse() before setting the mask for every needed objects, how the traverser possibly know if there could be collision against the floor ?

thank you…I got it and seem to be understand…just trying