Created
September 5, 2024 06:06
-
-
Save secemp9/b55ca0a68b39447152bf09deeeabdedf to your computer and use it in GitHub Desktop.
Interactive example in panda3D
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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