Skip to content

Instantly share code, notes, and snippets.

@secemp9
Created September 5, 2024 06:06
Show Gist options
  • Save secemp9/b55ca0a68b39447152bf09deeeabdedf to your computer and use it in GitHub Desktop.
Save secemp9/b55ca0a68b39447152bf09deeeabdedf to your computer and use it in GitHub Desktop.
Interactive example in panda3D
from direct.showbase.ShowBase import ShowBase
from panda3d.core import *
import math
from direct.task import Task
from panda3d.core import ClockObject
globalClock = ClockObject.getGlobalClock()
class MyApp(ShowBase):
def __init__(self):
ShowBase.__init__(self)
# Load the environment model.
self.scene = self.loader.loadModel("models/environment")
self.scene.reparentTo(self.render)
self.scene.setScale(0.25, 0.25, 0.25)
self.scene.setPos(-8, 42, 0)
# Add some lighting.
self.dir_light = DirectionalLight("dir_light")
self.dir_light.setColor((1, 1, 1, 1))
self.dir_light_nodepath = self.render.attachNewNode(self.dir_light)
self.dir_light_nodepath.setHpr(0, -60, 0)
self.render.setLight(self.dir_light_nodepath)
# Add ambient light.
self.ambient_light = AmbientLight("ambient_light")
self.ambient_light.setColor((0.2, 0.2, 0.2, 1))
self.ambient_light_nodepath = self.render.attachNewNode(self.ambient_light)
self.render.setLight(self.ambient_light_nodepath)
# Disable the default mouse camera control and initialize key tracking
self.disableMouse()
self.key_map = {"left": 0, "right": 0, "forward": 0, "backward": 0}
self.setup_key_controls()
# Mouse control for camera rotation
self.mouse_btn_down = False
self.last_mouse_pos = (0, 0)
self.accept("mouse1", self.set_mouse_btn_down, [True])
self.accept("mouse1-up", self.set_mouse_btn_down, [False])
self.taskMgr.add(self.update_camera_rotation, "update_camera_rotation")
# Movement task
self.taskMgr.add(self.update_movement, "update_movement")
def setup_key_controls(self):
self.accept("arrow_left", self.update_key_map, ["left", True])
self.accept("arrow_right", self.update_key_map, ["right", True])
self.accept("arrow_up", self.update_key_map, ["forward", True])
self.accept("arrow_down", self.update_key_map, ["backward", True])
self.accept("arrow_left-up", self.update_key_map, ["left", False])
self.accept("arrow_right-up", self.update_key_map, ["right", False])
self.accept("arrow_up-up", self.update_key_map, ["forward", False])
self.accept("arrow_down-up", self.update_key_map, ["backward", False])
def update_key_map(self, key, value):
self.key_map[key] = value
def update_movement(self, task):
dt = globalClock.getDt()
# print(dt)
speed = 10.0
# Calculate the camera's forward and right vectors
forward_vec = self.camera.getNetTransform().getMat().getRow3(1)
right_vec = self.camera.getNetTransform().getMat().getRow3(0)
forward_vec.normalize()
right_vec.normalize()
if self.key_map["forward"]:
self.camera.setPos(self.camera.getPos() + forward_vec * speed * dt)
if self.key_map["backward"]:
self.camera.setPos(self.camera.getPos() - forward_vec * speed * dt)
if self.key_map["left"]:
self.camera.setPos(self.camera.getPos() - right_vec * speed * dt)
if self.key_map["right"]:
self.camera.setPos(self.camera.getPos() + right_vec * speed * dt)
return task.cont
def set_mouse_btn_down(self, down):
self.mouse_btn_down = down
if not down:
self.last_mouse_pos = (0, 0) # Reset last mouse position
def update_camera_rotation(self, task):
if self.mouse_btn_down and self.mouseWatcherNode.hasMouse():
x, y = self.mouseWatcherNode.getMouseX(), self.mouseWatcherNode.getMouseY()
if self.last_mouse_pos != (0, 0):
delta_x, delta_y = x - self.last_mouse_pos[0], y - self.last_mouse_pos[1]
self.camera.setH(self.camera.getH() - delta_x * 100) # Horizontal rotation
self.camera.setP(self.camera.getP() + delta_y * 100) # Vertical rotation, sign inverted
self.last_mouse_pos = (x, y)
return task.cont
app = MyApp()
app.run()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment