1
0
forked from Rowland/EG
EG/core/CustomMouseController.py

96 lines
4.1 KiB
Python

from PyQt5.QtCore import showbase
from direct.task.TaskManagerGlobal import taskMgr
class CustomMouseController:
def __init__(self, showbase):
self.showbase = showbase
# This is used to store which keys are currently pressed.
self.keyMap = {
"mouse1": 0,
"cam-forward": 0,
"cam-backward": 0,
"cam-left": 0,
"cam-right": 0,
"cam-up": 0,
"cam-down": 0
}
# 添加鼠标控制
# self.showbase.accept("mouse1", self.setKey, ["mouse1", True])
# self.showbase.accept("mouse1-up", self.setKey, ["mouse1", False])
self.showbase.accept("w", self.setKey, ["cam-forward", True])
self.showbase.accept("a", self.setKey, ["cam-left", True])
self.showbase.accept("s", self.setKey, ["cam-backward", True])
self.showbase.accept("d", self.setKey, ["cam-right", True])
self.showbase.accept("e", self.setKey, ["cam-up", True])
self.showbase.accept("q", self.setKey, ["cam-down", True])
self.showbase.accept("w-up", self.setKey, ["cam-forward", False])
self.showbase.accept("a-up", self.setKey, ["cam-left", False])
self.showbase.accept("s-up", self.setKey, ["cam-backward", False])
self.showbase.accept("d-up", self.setKey, ["cam-right", False])
self.showbase.accept("e-up", self.setKey, ["cam-up", False])
self.showbase.accept("q-up", self.setKey, ["cam-down", False])
self.last_mouse_x = 0
self.last_mouse_y = 0
self.camera_speed = 25
self.move_speed = 20
def setUp(self, mouse_speed: float = 25, move_speed: float = 20):
taskMgr.add(self.move, "moveTask")
self.camera_speed = mouse_speed
self.move_speed = move_speed
def setKey(self, key, value, arg: str = None):
self.keyMap[key] = value
if key == "mouse1" and value == True and self.keyMap[key]:
mouse_pos = self.showbase.mouseWatcherNode.getMouse()
self.last_mouse_x = mouse_pos.get_x()
self.last_mouse_y = mouse_pos.get_y()
def move(self, task):
dt = self.showbase.clock.dt
if self.keyMap["cam-left"]:
self.showbase.camera.setX(self.showbase.camera, -self.move_speed * dt)
if self.keyMap["cam-right"]:
self.showbase.camera.setX(self.showbase.camera, +self.move_speed * dt)
if self.keyMap["cam-backward"]:
self.showbase.camera.setY(self.showbase.camera, -self.move_speed * dt)
if self.keyMap["cam-forward"]:
self.showbase.camera.setY(self.showbase.camera, +self.move_speed * dt)
if self.keyMap["cam-up"]:
self.showbase.camera.setZ(self.showbase.camera, +self.move_speed * dt)
if self.keyMap["cam-down"]:
self.showbase.camera.setZ(self.showbase.camera, -self.move_speed * dt)
if self.keyMap["mouse1"]:
try:
mouse_pos = self.showbase.mouseWatcherNode.getMouse()
current_x = mouse_pos.get_x()
current_y = mouse_pos.get_y()
# 计算鼠标移动差值
dx = current_x - self.last_mouse_x
dy = current_y - self.last_mouse_y
dy *= -1
# 根据鼠标移动调整摄像机
if abs(dx) > 0.01 or abs(dy) > 0.01:
cam_hpr = self.showbase.camera.get_hpr()
self.showbase.camera.set_hpr(
cam_hpr.x - dx * self.camera_speed,
max(-90, min(90, cam_hpr.y - dy * self.camera_speed)),
0
)
# 更新鼠标位置
self.last_mouse_x = current_x
self.last_mouse_y = current_y
except Exception as e:
print(f"旋转相机失败:{e}")
return task.cont