Newbie with a problem again…
All I’m trying to do is make it so that my free-flying camera has collision with the loaded egg file.
Collision IS working, however whenever I bump into the model, it doesn’t just stop me. It bounces me back. I can’t just slide along a wall. And if I have my camera solid (sphere) set to a radius like 1, I can even force myself through the wall.
I set up my App like this:
import direct.directbase.DirectStart
from pandac.PandaModules import *
from pandac.PandaModules import PandaNode,NodePath,Camera,TextNode
from pandac.PandaModules import Vec3,Vec4,BitMask32
from direct.gui.OnscreenText import OnscreenText
from direct.actor.Actor import Actor
from direct.task.Task import Task
from direct.showbase.DirectObject import DirectObject
import random, sys, os, math
def addInstructions(pos, msg):
# Function to put instructions on the screen.
return OnscreenText(text=msg, style=1, fg=(1,1,1,1),
pos=(-1.3, pos), align=TextNode.ALeft, scale = .05, mayChange=True)
def addTitle(text):
# Function to put title on the screen.
return OnscreenText(text=text, style=1, fg=(1,1,1,1),
pos=(1.3,-0.95), align=TextNode.ARight, scale = .07)
class App(DirectObject):
def __init__(self):
self.loadLevel()
self.loadInstructions()
self.initCamera()
self.initControls()
self.initCollision()
taskMgr.add(self.mouseUpdate, 'mouse-task')
taskMgr.add(self.move,"moveTask")
self.prevtime = 0
def loadLevel(self):
#Load the first environment model
self.environ = loader.loadModel("hl2c.egg")
self.environ.reparentTo(render)
self.environ.setScale(0.25,0.25,0.25)
self.environ.setPos(-8,42,0)
base.win.setClearColor(Vec4(0.5,0.8,0.8,1)) # black bg
dlight = DirectionalLight('dlight')
dlight.setColor(VBase4(0.9, 0.9, 0.9, 1))
dlnp = render.attachNewNode(dlight)
dlnp.setHpr(90, -30, 0)
render.setLight(dlnp)
colour = (0.6,0.8,0.8)
expfog = Fog("Scene-wide exponential Fog object")
expfog.setColor(*colour)
expfog.setExpDensity(0.005)
render.setFog(expfog)
base.setBackgroundColor(*colour)
def loadInstructions(self):
# Post the instructions
self.title = addTitle("Testing Stuff with Panda3D Engine")
self.inst1 = addInstructions(0.95, "[ESC]: Quit")
self.inst3 = addInstructions(0.90, "[W]: Run Camera Forward")
self.inst4 = addInstructions(0.85, "[A]: Turn Camera Left")
self.inst6 = addInstructions(0.80, "[S]: Step Camera Backward")
self.inst7 = addInstructions(0.75, "[D]: Turn Camera Right")
self.inst8 = addInstructions(0.65, "")
def initCamera(self):
camera = base.camera
camera.setPos(-20,55,40)
camera.setHpr(30.0, -30.0, 0.0)
base.camLens.setFar(2000)
def initControls(self):
self.keyMap = {"left":0, "right":0, "forward":0, "cam-left":0, "cam-right":0, "cam-forward":0, "cam-back":0}
self.accept( "escape" , sys.exit) # Sets ESC key to close app
self.accept("arrow_left", self.setKey, ["left",1])
self.accept("arrow_right", self.setKey, ["right",1])
self.accept("arrow_up", self.setKey, ["forward",1])
self.accept("w", self.setKey, ["cam-forward",1])
self.accept("a", self.setKey, ["cam-left",1])
self.accept("d", self.setKey, ["cam-right",1])
self.accept("s", self.setKey, ["cam-back",1])
self.accept("arrow_left-up", self.setKey, ["left",0])
self.accept("arrow_right-up", self.setKey, ["right",0])
self.accept("arrow_up-up", self.setKey, ["forward",0])
self.accept("w-up", self.setKey, ["cam-forward",0])
self.accept("a-up", self.setKey, ["cam-left",0])
self.accept("d-up", self.setKey, ["cam-right",0])
self.accept("s-up", self.setKey, ["cam-back",0])
base.disableMouse() # Disable mouse controlled camera
def initCollision(self):
base.cTrav = CollisionTraverser()
base.pusher = CollisionHandlerPusher()
cs = CollisionSphere(0, 0, 0, 3)
cnodePath = camera.attachNewNode(CollisionNode('cnode'))
cnodePath.node().addSolid(cs)
base.pusher.addCollider(cnodePath,self.environ)
base.cTrav.addCollider(cnodePath,base.pusher)
def setKey(self, key, value):
#Records the state of the arrow keys
self.keyMap[key] = value
def move(self, task):
elapsed = task.time - self.prevtime
feedback = str(camera.getPos())
if (self.keyMap["cam-left"]!=0):
strafe = camera.getNetTransform().getMat().getRow3(0)
strafe.setZ(0)
strafe.normalize()
camera.setPos(camera.getPos() - strafe*(elapsed*35))
if (self.keyMap["cam-right"]!=0):
strafe = camera.getNetTransform().getMat().getRow3(0)
strafe.setZ(0)
strafe.normalize()
camera.setPos(camera.getPos() + strafe*(elapsed*35))
if (self.keyMap["cam-forward"]!=0):
strafe = camera.getNetTransform().getMat().getRow3(1)
#strafe.setZ(0) #comment this out for free fly camera
strafe.normalize()
camera.setPos(camera.getPos() + strafe*(elapsed*55))
if (self.keyMap["cam-back"]!=0):
strafe = camera.getNetTransform().getMat().getRow3(1)
#strafe.setZ(0) #comment this out for free fly camera
strafe.normalize()
camera.setPos(camera.getPos() - strafe*(elapsed*55))
self.inst8.setText(feedback)
# Store the task time and continue.
self.prevtime = task.time
return Task.cont
def mouseUpdate(self,task):
md = base.win.getPointer(0)
x = md.getX()
y = md.getY()
if base.win.movePointer(0, base.win.getXSize()/2, base.win.getYSize()/2):
camera.setH(camera.getH() - (x - base.win.getXSize()/2)*0.1)
camera.setP(camera.getP() - (y - base.win.getYSize()/2)*0.1)
return Task.cont
#Run program
App()
run()
Thanks for your time and guidance!