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