I’m trying to use CollisionHandlerEvent() to trigger an action when something collides with a plane I exported from blender. I’m not exactly sure what it’s nodepath name is, I’ve tried using the name I get from node.ls(), which is:
PandaNode
GeomNode Cube (1 geoms: S:(MaterialAttrib)) [Collision] T:m(scale 5.63197 5.63197 -0.051988)
But I’ve had absolutely no luck with that.
Here’s the rest of my code, any help would be appreciated.:
from direct.directbase.DirectStart import *
from pandac.PandaModules import *
from direct.showbase.DirectObject import DirectObject
from panda3d.core import *
from panda3d.physics import *
from input_control import inputManager
class Collision(DirectObject):
def __init__(self):
# enabling the particle system is necessary for physics
base.enableParticles()
# Importing keymap
self.keymap = inputManager().keymap
# Initializing traverser
self.cTrav = CollisionTraverser('traverser')
base.cTrav = self.cTrav
# Traverser show collisions
self.cTrav.showCollisions(render)
# Creating handlers / setting handlers
self.cHanEvent = CollisionHandlerEvent()
self.cHanFloor = CollisionHandlerFloor()
self.cHanPhysics = PhysicsCollisionHandler()
self.cHanFloor.setMaxVelocity(.05)
self.cHanFloor.setOffset(-5)
# Bit Masks
self.mask = BitMask32.bit(1)
# The rest
self.setUp()
self.cHan()
self.phys()
taskMgr.add(self.player, 'task')
def setUp(self):
# settin up variables
floorMask = BitMask32(0x4)
# Camera
base.cam.setPos(0, -50, 0)
self.floor = render.attachNewNode(CollisionNode("floor"))
self.floor.node().addSolid(CollisionPlane(Plane(Vec3(0, 0, 1),
Point3(0, 0, 0))))
self.floor.show()
self.floor.setZ(-5)
# Loading models / nodes
self.cup = loader.loadModel('cup')
self.cup2 = loader.loadModel('cup')
self.thing = loader.loadModel('plane')
self.node = NodePath('player')
print self.thing.ls()
# Bitmasking
self.planeCollider = self.thing.find("**/Cube")
self.planeCollider.node().setIntoCollideMask(self.mask)
# Moving
self.thing.setZ(-5)
self.node.setX(-3)
# Reparentingwww.panda3d.orgg
self.node.reparentTo(render)
self.cup2.reparentTo(render)
self.cup.reparentTo(self.node)
self.thing.reparentTo(render)
# Creating Collision Nodes
self.cnode = render.attachNewNode(CollisionNode('cnode'))
self.cnode2 = self.cup2.attachNewNode(CollisionNode('cup2'))
#self.playerRay = self.node.attachNewNode(CollisionNode('playerRayCnode'))
# Reparenting cnodes
self.cnode.reparentTo(self.cup)
self.cnode2.reparentTo(self.cup2)
#self.playerRay.reparentTo(self.node)
##self.playerRay.node().setFromCollideMask(self.mask)
#Adding solids
self.cnode.node().addSolid(CollisionSphere(0, 0, 0, 1))
self.cnode2.node().addSolid(CollisionSphere(0, 0, 0, 1))
#self.playerRay.node().addSolid(CollisionRay(0, 0, 0, 0, 0, -1))
# Collision debug
self.cnode.show()
self.cnode2.show()
#self.playerRay.show()
# Adding collider to handlers
#self.cHanFloor.ad self.cTrav.addCollider(self.playerRay, self.cHanFloor)dCollider(self.playerRay, self.node)
#Adding to traverser
self.cTrav.addCollider(self.cnode, self.cHanEvent)
#self.cTrav.addCollider(self.playerRay, self.cHanFloor)
def phys(self):
actor = ActorNode('physics')
self.physNode = render.attachNewNode(actor)
base.physicsMgr.attachPhysicalNode(actor)
self.physNode.reparentTo(render)
self.node.reparentTo(self.physNode)
self.physNode.setZ(20)
thrustNode = ForceNode('thrust')
self.physNode.attachNewNode(thrustNode)
self.thrustForce = LinearVectorForce(0, 0, -9.8)
thrustNode.addForce(self.thrustForce)
base.physicsMgr.addLinearForce(self.thrustForce)
print self.node.getChildren()
self.cHanPhysics.addCollider(self.cnode, self.physNode)
self.cTrav.addCollider(self.cnode, self.cHanPhysics)
def cHan(self):
self.cHanEvent.addAgainPattern('%fn-again-%in')
self.cHanEvent.addInPattern('%fn-into-%in')
self.accept('cnode-again-Cube', self.method)
self.accept('cnode-into-floor', self.onCollision)
def method(self, bah):
print "ahhh!"
def onCollision(self, bah):
self.thrustForce = LinearVectorForce(0, 0, 40)
base.physicsMgr.removeLinearForce(self.thrustForce)
print "HALKHS:DFLKJ?"
def player(self, task):
dt = globalClock.getDt()
if self.keymap['a'] == True:
self.node.setX(self.node, -8 * dt)
if self.keymap['d'] == True:
self.node.setX(self.node, 8 * dt)
#if self.keymap['space'] == True:
return task.cont
c = Collision()
run()