hi,
I have problem with collision detection -> when there are more objects ( > 31) the collision detection fail. I’ve carefully read the manual + forums + Airblade 1.0.5 source so I realized I’ll need more than 1 traverser. But I don’t know how to make it right. my code (based on example in manual + Airblade ) looks like this:
...
...
self.collHandEvent=CollisionHandlerEvent()
self.collHandEvent.addInPattern('into-%in')
self.collHandEvent.addOutPattern('outof-%in')
self.playerTraverser = CollisionTraverser()
self.playerTraverser2 = CollisionTraverser()
taskMgr.add(self.traverseAll, 'traverseAll')
...
...
def loadObjX(self):
#load a model. reparent it to the camera so we can move it.
self.x = loader.loadModel('smiley2')
self.x.reparentTo(render)
self.x.setPos(-5, 25,0)
#setup a collision solid for this model
xColl=self.initCollisionSphere(self.x, True)
xColl[0].setIntoCollideMask( BitMask32.bit( 1 ) )
xColl[0].setFromCollideMask( BitMask32.bit( 1 ) )
#add this object to the traverser
self.playerTraverser2.addCollider(xColl[0] , self.collHandEvent)
self.x.setScale(.6,.6,.6)
self.accept( 'into-' + xColl[1], self.collide5)
self.accept( 'outof-' + xColl[1], self.collide6)
def loadObj1(self):
#load a model. reparent it to the camera so we can move it.
self.s = loader.loadModel('smiley')
self.s.reparentTo(camera)
self.s.setPos(0, 25,0)
#setup a collision solid for this model
sColl=self.initCollisionSphere(self.s, True)
sColl[0].setIntoCollideMask( BitMask32.bit( 1 ) )
sColl[0].setFromCollideMask( BitMask32.bit( 1 ) )
#add this object to the traverser
self.playerTraverser.addCollider(sColl[0] , self.collHandEvent)
self.playerTraverser2.addCollider(sColl[0] , self.collHandEvent)
self.s.setScale(.6,.6,.6)
self.accept( 'into-' + sColl[1], self.collide3)
self.accept( 'outof-' + sColl[1], self.collide4)
def loadObj2(self):
self.t = [None for i in range (self.maxobjs)]
for i in range (self.maxobjs):
#load a model.
self.t[i] = loader.loadModel('smiley')
self.t[i].reparentTo(render)
self.t[i].setPos(5, 25,0+4*i)
self.t[i].setScale(.6,.6,.6)
#setup a collision solid for this model
tColl=self.initCollisionSphere(self.t[i], True)
tColl[0].setIntoCollideMask( BitMask32.bit( 1 ))
tColl[0].setFromCollideMask( BitMask32.bit( 1 ))
#add this object to the traverser
self.playerTraverser.addCollider(tColl[0], self.collHandEvent)
self.t[i].setScale(.6,.6,.6)
#accept the events sent by the collisions
self.accept( 'into-' + tColl[1], self.collide)
self.accept( 'outof-' + tColl[1], self.collide2)
...
...
def collide(self, collEntry):
hittedobj = collEntry.getFromNodePath().getParent()
hittedobj.setH(-45)
...
...
def traverseAll(self, task):
self.playerTraverser.traverse(render)
self.playerTraverser2.traverse(render)
return Task.cont
any ideas ???