Hi.
I am having some problems trying to click an actor.
What I did was using the code of panda hello world, adding a sphere to the panda and a collision ray to the camera.
The problem is that, if I use a small sphere, it doesn’t detect the sphere at all, if I use a big sphere, it detects the collision whenever I click (even outside the sphere).
Here is the code of the collision objects:
self.traverser = CollisionTraverser('traverser name')
self.pickerNode = CollisionNode('mouseRay')
self.pickerNP = camera.attachNewNode(self.pickerNode)
self.pickerNode.setIntoCollideMask(0)
self.pickerNode.setFromCollideMask(1)
self.pickerRay = CollisionRay()
self.pickerNode.addSolid(self.pickerRay)
self.myHandler = CollisionHandlerQueue()
pandaSphere = CollisionSphere(self.pandaActor.getX(), self.pandaActor.getY(), self.pandaActor.getZ()+250, 300)
pandaCol = CollisionNode('panda sphere')
pandaCol.setIntoCollideMask(1)
pandaCol.setFromCollideMask(BitMask32.bit(0))
pandaCol.addSolid(pandaSphere)
pandaCol.setTag('myObjectTag', '3')
pandaColNp = self.pandaActor.attachNewNode(pandaCol)
pandaColNp.show()
pandaColNp.setTag('myObjectTag', '2')
self.pandaHandler = CollisionHandlerQueue()
self.traverser.addCollider(self.pickerNP, self.myHandler)
self.traverser.addCollider(pandaColNp, self.pandaHandler)
self.traverser.showCollisions(render)
self.accept('mouse1',self.myFunction)
And here is the code of the mouse click function:
def myFunction(self):
print("called.")
mpos = base.mouseWatcherNode.getMouse()
self.pickerRay.setFromLens(base.camNode, mpos.getX(), mpos.getY())
self.traverser.traverse(render)
# Assume for simplicity's sake that myHandler is a CollisionHandlerQueue.
if self.myHandler.getNumEntries() > 0:
print("Clicked on something.")
# This is so we get the closest object.
self.myHandler.sortEntries()
pickedObj = self.myHandler.getEntry(0).getIntoNodePath()
pickedObj = pickedObj.findNetTag('myObjectTag')
if not pickedObj.isEmpty():
print("Cool, we found something.")
for i in range(self.myHandler.getNumEntries()):
entry = self.myHandler.getEntry(i)
print entry
Any help is very apreciated.
Thanks in advance.