[SOLVED] CollisionHandlerGravity and other collision object

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()

Sorry, after messing with this for 4 hours earlier and not figuring it out I posted this question and figured it out 5 minutes later.

First my CollisionRay wasn’t moving with my player. Second I needed to mask it to detect the other types of objects.