I tweaked the above answer to make mouse/keyboard controls. You can use ws to move forward and back, ad to move left and right, space to move up, shift to move down, and click and drag to look around. I added some mouse smoothing as well because moving exactly according to mouse movements gets a little jarring. No citation needed, feel free to use this however you like
from panda3d.core import *
def setUpCameraControls():
base.disableMouse() # disable default mouse controls
# model for the camera to orbit along
model = loader.loadModel('eggModels/sphere.egg')
sphereTexture = loader.loadTexture('eggModels/empty.bmp')
model.setTexture(sphereTexture)
model.setTransparency(TransparencyAttrib.MAlpha)
model.reparentTo(render)
# dummy node for camera
parentnode = render.attachNewNode('camparent')
parentnode.reparentTo(model) # inherit transforms
parentnode.setEffect(CompassEffect.make(render)) # NOT inherit rotation
keyMap = {"a":0, "d":0, "w":0, "s":0, "space": 0, "shift": 0, 'mouse1': 0, 'mouse2': 0, 'mouse3': 0}
#Records the state of the arrow keys
def setKey(key, value):
keyMap[key] = value
# the camera
base.camera.reparentTo(parentnode)
base.camera.lookAt(parentnode)
base.camera.setY(0) # camera distance from model
global prevMouseX
global prevMouseY
global prevMouseVal
global prevDxs
global prevDys
global totalSmoothStore
prevMouseVal = 0
prevMouseX = 0
prevMouseY = 0
prevDxs = []
prevDys = []
totalSmoothStore = 10
def cameraMovement(task):
global prevMouseX
global prevMouseY
global prevMouseVal
global prevDxs
global prevDys
global totalSmoothStore
if (keyMap["a"]!=0):
curPos = parentnode.getPos()
forwardVector = render.getRelativeVector(camera, Vec3.left())
newPos = curPos + forwardVector*20*globalClock.getDt()
parentnode.setPos(newPos)
if (keyMap["d"]!=0):
curPos = parentnode.getPos()
forwardVector = render.getRelativeVector(camera, Vec3.right())
newPos = curPos + forwardVector*20*globalClock.getDt()
parentnode.setPos(newPos)
if (keyMap['w']!=0):
curPos = parentnode.getPos()
forwardVector = render.getRelativeVector(camera, Vec3.forward())
newPos = curPos + forwardVector*20*globalClock.getDt()
parentnode.setPos(newPos)
if (keyMap['s']!=0):
curPos = parentnode.getPos()
forwardVector = render.getRelativeVector(camera, Vec3.forward())
newPos = curPos + forwardVector*-20*globalClock.getDt()
parentnode.setPos(newPos)
if (keyMap['space']!=0):
curPos = parentnode.getPos()
forwardVector = Vec3.up()
newPos = curPos + forwardVector*20*globalClock.getDt()
parentnode.setPos(newPos)
if (keyMap['shift']!=0):
curPos = parentnode.getPos()
forwardVector = Vec3.up()
newPos = curPos + forwardVector*-20*globalClock.getDt()
parentnode.setPos(newPos)
if (keyMap['mouse1']!=0):
centerX = base.win.getXSize()/2
centerY = base.win.getYSize()/2
md = base.win.getPointer(0)
x = md.getX()
y = md.getY()
if prevMouseVal == 0:
prevMouseVal = 1
prevDxs = []
prevDys = []
else:
dx = x - prevMouseX
dy = y - prevMouseY
if len(prevDxs) > totalSmoothStore: prevDxs.pop(0)
if len(prevDys) > totalSmoothStore: prevDys.pop(0)
prevDxs.append(dx)
prevDys.append(dy)
curAverageDx = 0.
for curDx in prevDxs:
curAverageDx += curDx
curAverageDx = curAverageDx / len(prevDxs)
curAverageDy = 0.
for curDy in prevDys:
curAverageDy += curDy
curAverageDy = curAverageDy / len(prevDys)
parentnode.setP(parentnode.getP()-10*globalClock.getDt()*curAverageDy)
parentnode.setH(parentnode.getH()-10*globalClock.getDt()*curAverageDx)
prevMouseX = x
prevMouseY = y
else:
prevMouseVal = 0
return task.cont
taskMgr.add(cameraMovement, 'cameraMovement')
# camera rotation
base.accept('a', setKey, ["a",1])
base.accept('a-up', setKey, ["a",0])
base.accept('d', setKey, ["d",1])
base.accept('d-up', setKey, ["d",0])
base.accept('w', setKey, ["w",1])
base.accept('w-up', setKey, ["w",0])
base.accept('s', setKey, ["s",1])
base.accept('s-up', setKey, ["s",0])
base.accept('space', setKey, ["space",1])
base.accept('space-up', setKey, ["space",0])
base.accept('shift', setKey, ["shift",1])
base.accept('shift-up', setKey, ["shift",0])
base.accept('mouse1',setKey,['mouse1',1])
base.accept('mouse1-up',setKey,['mouse1',0])
base.accept('mouse2',setKey,['mouse2',1])
base.accept('mouse2-up',setKey,['mouse2',0])
base.accept('mouse3',setKey,['mouse3',1])
base.accept('mouse3-up',setKey,['mouse3',0])
setUpCameraControls()