So basically self.cube
is a child of render
and camera
is a child of self.cube
. That’s pretty much the entire scene graph with environment
a child of render
.
self.heading
is initially set to 0, with it changing with this:
self.heading += 40*dt
if self.keyMap["lookR"]:
self.heading -= 40*dt
if self.heading > 360:
self.heading -= 360
elif self.heading < 0:
self.heading += 360
If you simply want the entire code, here it is:
from panda3d.core import loadPrcFile
import math
loadPrcFile("configuration.prc")
from direct.showbase.ShowBase import ShowBase
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("cube.obj")
self.cube.reparentTo(self.render)
self.camera.setPos(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.taskMgr.add(self.update, "update")
def updateKeyMap(self, controlName, controlState):
self.keyMap[controlName] = controlState
def update(self,task):
dt = globalClock.getDt()
# If any movement keys are pressed, use the above time
# to calculate how far to move the character, and apply that.
if self.keyMap["forward"]:
#self.y += 7*dt*(math.cos(math.radians(self.heading)))
#self.x += 7*dt*(math.sin(math.radians(self.heading)))
quat = self.cube.getQuat(self.render)
forwardVec = quat.getForward()
self.cube.setPos(self.cube.getPos(self.render) + forwardVec * 40 * dt)
if self.keyMap["backward"]:
self.y += -17*dt
if self.keyMap["left"]:
self.x += -17*dt
if self.keyMap["right"]:
self.x += 17*dt
if self.keyMap["lookL"]:
self.heading += 40*dt
if self.keyMap["lookR"]:
self.heading -= 40*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()