Collision detection doesn't work

Hi all,

I have tried adding a wall and collision in my panda3d project after following a beginner’s tutorial and they are visible after toggling .show() for the collision handler and the wall, which is a collision tube, however, my object just seems to go through the wall.

Here is the code that deals with collisions:

self.CT = CollisionTraverser()
        self.pusher = CollisionHandlerPusher()
        colliderNode = CollisionNode("player")
        colliderNode.addSolid(CollisionSphere(0, 0, 0, 5))
        collider = self.cube.attachNewNode(colliderNode)
        self.pusher.setHorizontal(True)
        collider.show()
        base.pusher.addCollider(collider, self.cube)
        base.CT.addCollider(collider, self.pusher)
        wallSolid = CollisionTube(-800.0, 0, 0, 800.0, 0, 0, 20)
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = self.render.attachNewNode(wallNode)
        wall.setY(0)
        wall.show()
        self.taskMgr.add(self.update, "update")

here is the entire code if needed:

from panda3d.core import loadPrcFile
import math
loadPrcFile("configuration.prc")
from direct.showbase.ShowBase import ShowBase
from panda3d.core import CollisionTraverser, CollisionHandlerPusher, CollisionSphere, CollisionNode, CollisionTube
class MyGame(ShowBase):
    def __init__(self):
        super().__init__()
        self.disableMouse()
        self.test = self.loader.loadModel("models/environment")
        self.test.reparentTo(self.render)

        self.x = 0
        self.y = -140
        self.z = 5
        self.heading = 0
        self.cube = self.loader.loadModel("emiratesCube.obj")
        self.cube.reparentTo(self.render)
        self.camera.setPos(0,-60,2) # originally 0,-20,2
        self.camera.reparentTo(self.cube)
        self.cube.setPos(self.x,self.y,self.z)

        self.keyMap = {
            "forward": False,
            "backward": False,
            "right": False,
            "left": False,
            "Rotate": False,
            "lookL": False,
            "lookR": False
        }
        self.accept("w", self.updateKeyMap, ["forward", True])
        self.accept("w-up", self.updateKeyMap, ["forward", False])

        self.accept("a", self.updateKeyMap, ["left", True])
        self.accept("a-up", self.updateKeyMap, ["left", False])

        self.accept("s", self.updateKeyMap, ["backward", True])
        self.accept("s-up", self.updateKeyMap, ["backward", False])

        self.accept("d", self.updateKeyMap, ["right", True])
        self.accept("d-up", self.updateKeyMap, ["right", False])

        self.accept("arrow_left", self.updateKeyMap, ["lookL", True])
        self.accept("arrow_left-up", self.updateKeyMap, ["lookL", False])

        self.accept("arrow_right", self.updateKeyMap, ["lookR", True])
        self.accept("arrow_right-up", self.updateKeyMap, ["lookR", False])

        self.CT = CollisionTraverser()
        self.pusher = CollisionHandlerPusher()
        colliderNode = CollisionNode("player")
        colliderNode.addSolid(CollisionSphere(0, 0, 0, 5))
        collider = self.cube.attachNewNode(colliderNode)
        self.pusher.setHorizontal(True)
        collider.show()
        base.pusher.addCollider(collider, self.cube)
        base.CT.addCollider(collider, self.pusher)
        wallSolid = CollisionTube(-800.0, 0, 0, 800.0, 0, 0, 20)
        wallNode = CollisionNode("wall")
        wallNode.addSolid(wallSolid)
        wall = self.render.attachNewNode(wallNode)
        wall.setY(0)
        wall.show()
        self.taskMgr.add(self.update, "update")



    def updateKeyMap(self, controlName, controlState):
        self.keyMap[controlName] = controlState
    def update(self,task):
        dt = globalClock.getDt()
        walkConstant = 50
        rotateConstant = 90
        if self.keyMap["forward"]:
            #self.y += 7*dt*(math.cos(math.radians(self.heading)))
            #self.x += 7*dt*(math.sin(math.radians(self.heading)))
            self.y += walkConstant*dt*(math.cos(math.radians(self.heading)))
            self.x += walkConstant*dt*(math.sin(math.radians(self.heading))) *-1
        if self.keyMap["backward"]:
            self.y -= walkConstant * dt * (math.cos(math.radians(self.heading)))
            self.x -= walkConstant * dt * (math.sin(math.radians(self.heading))) * -1
        if self.keyMap["left"]:
            self.y -= 20 * dt * (math.cos(math.radians(self.heading-90)))
            self.x -= 20 * dt * (math.sin(math.radians(self.heading-90))) * -1
        if self.keyMap["right"]:
            self.y += 20 * dt * (math.cos(math.radians(self.heading - 90)))
            self.x += 20 * dt * (math.sin(math.radians(self.heading - 90))) * -1
        if self.keyMap["lookL"]:
            self.heading += rotateConstant*dt
        if self.keyMap["lookR"]:
            self.heading -= rotateConstant*dt
        if self.heading > 360:
            self.heading -= 360
        elif self.heading < 0:
            self.heading += 360
        self.cube.setPos(self.x,self.y,self.z)
        self.cube.setH(self.heading)
        return task.cont


game = MyGame()
game.run()

I think that the problem may be the use of a variable named “CT” for your CollisionTraverser.

You see, the ShowBase class holds a special variable called “cTrav”. If a CollisionTraverser is assigned to this variable, then ShowBase will automatically have it peform collision traversal. However, any other traversers have to be traversed manually (by calling “traverse”, if I recall correctly).

And since you’re neither using the special “cTrav” variable nor manually traversing your “CT” traverser, no collision-traversal is being done. As a result, no collisions are being detected.