Hi,
I have been studying panda now for a a couple weeks and have run into an issue where if I use a CollisionHandlerGravity object for ground collision detection in conjunction with a CollisionRay my player will not be able to stand on top of CollisionHandlerPusher objects. Instead the player just falls through them. I have tried switching my CollisionHandlerPusher to a PhysicsCollisionHandler and my player can then stand on the objects but the player will then not fall to the ground when he walks off.
Any suggestions would be welcomed. Thanks.
import sys
from direct.showbase.ShowBase import ShowBase
from pandac.PandaModules import BitMask32, CollisionHandlerPusher, CollisionTraverser, CollisionNode, CollisionHandlerGravity, CollisionRay, CollisionHandlerFloor
from direct.actor.Actor import Actor, ActorNode
from panda3d.core import CollisionSphere, NodePath
from utils.actor_controller import ThirdPersonController, ActorController
class MyGame(ShowBase):
"""
Attributes
environ The level model
"""
def __init__(self):
ShowBase.__init__(self)
## Setup Base
#Setup CollisionTraverser
base.cTrav=CollisionTraverser()
# Check for fast moving objects
base.cTrav.setRespectPrevTransform(True)
# Uncomment below to show collisions
base.cTrav.showCollisions(render)
self.setUpKeyboard()
self.setUpModels()
self.setUpActors()
self.setUpCollision()
def setUpKeyboard(self):
self.accept("escape", sys.exit)
def setUpModels(self):
### Load the environment
#self.environ = base.loader.loadModel('models/level_no_collide')
self.environ = base.loader.loadModel('models/level_w_collide')
self.environ.setCollideMask(BitMask32.allOff())
self.environ.reparentTo(render)
def setUpActors(self):
### Load player
playerStartPoint = self.environ.find("**/start_point").getPos()
self.playerNP = base.render.attachNewNode(ActorNode('playerNP'))
self.playerNP.reparentTo(base.render) # ???
self.playerActor = Actor("models/ralph", {
"run":"models/ralph-run",
"walk":"models/ralph-walk"
})
self.playerActor.setScale(.2)
self.playerActor.setCollideMask(BitMask32.allOff())
self.playerActor.reparentTo(self.playerNP)
self.playerNP.setPos(playerStartPoint)
def setUpCollision(self):
### Collision setup
FLOOR_MASK = BitMask32.bit(0)
WALL_MASK = BitMask32.bit(1)
OBJECT_MASK = BitMask32.bit(2)
wallHandler = CollisionHandlerPusher()
wallCollider = self.environ.find("**/walls-collide")
wallCollider.node().setIntoCollideMask(WALL_MASK)
#wallCollider.show()
boxHandler = CollisionHandlerPusher()
boxCollider = self.environ.find("**/boxes-collide")
boxCollider.node().setIntoCollideMask(OBJECT_MASK)
#boxCollider.show()
self.groundHandler = CollisionHandlerGravity()
self.groundHandler.setGravity(9.81+25) # the 25 is for player weight
self.groundHandler.setMaxVelocity(100)
groundCollider = self.environ.find("**/ground-collide")
groundCollider.node().setIntoCollideMask(FLOOR_MASK)
#groundCollider.show()
## Actor Collision
playerColliderNP = self.playerActor.attachNewNode(CollisionNode('playerColliderNode'))
playerColliderNP.node().addSolid(CollisionSphere(0, 0, 1, 1))
playerColliderNP.node().setFromCollideMask(WALL_MASK|OBJECT_MASK)
playerColliderNP.node().setIntoCollideMask(BitMask32.allOff())
#playerColliderNP.show()
## Actor Ray Collision
rayGeometry = CollisionRay(0, 0, 2, 0, 0, -1)
playerRayColliderNP = self.playerNP.attachNewNode(CollisionNode('playerRayColliderNode'))
playerRayColliderNP.node().addSolid(rayGeometry)
playerRayColliderNP.node().setFromCollideMask(FLOOR_MASK)
playerRayColliderNP.node().setIntoCollideMask(BitMask32.allOff())
#playerRayColliderNP.show()
wallHandler.addCollider(playerColliderNP, self.playerNP)
boxHandler.addCollider(playerColliderNP, self.playerNP)
self.groundHandler.addCollider(playerRayColliderNP, self.playerNP)
## cTrav
base.cTrav.addCollider(playerColliderNP, wallHandler)
base.cTrav.addCollider(playerColliderNP, boxHandler)
base.cTrav.addCollider(playerRayColliderNP, self.groundHandler)
#actorController = ActorController(self.playerActor, self.groundHandler)
actorController = ThirdPersonController(self.playerActor, self.groundHandler)
if __name__ == '__main__':
game = MyGame()
game.run()