Fixierung inkonsistenter Maus -Look -Rotation in Panda3d

Post a reply

Smilies
:) :( :oops: :chelo: :roll: :wink: :muza: :sorry: :angel: :read: *x) :clever:
View more smilies

BBCode is ON
[img] is ON
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Fixierung inkonsistenter Maus -Look -Rotation in Panda3d

by Guest » 07 Feb 2025, 03:55

Vor kurzem wollte ich mit Panda3D mit Python ein 3D -Testerspiel mit Pandhon machen. Ich kann jedoch nicht die Mausrotation in der Umgebung nachahmen, die andere beliebte Spiele aus der ersten Person haben. Wenn ich meine Maus über einen langen Zeitraum langsam auf der linken Seite meines Mousepads und nach rechts bewege, muss ich sie in die Mitte des Mousepads bewegen, um eine volle 360 ​​-Grad -Kurve innerhalb des Spiels zu erzielen. Wenn ich meine Maus jedoch über einen kürzeren Zeitraum sehr schnell bewege, kann ich eine volle Revolution in viel weniger Platz machen, sodass ich noch mehr Rotationen in einer Mausbewegung durchführen kann. < /P>
Dies geschieht nicht in Spielen, die ich täglich spiele. In beliebten Spielen, die ich gespielt habe, hat die Mausgeschwindigkeit die gedrehte Menge nicht beeinflusst. von Mausabstand vom Zentrum. Dies trat jedoch auf, dass das entgegengesetzte Ereignis auftrat, bei dem die Maus über einen längeren Zeitraum langsamer bewegte, dass die Kamera mehr drehte. < /P>
Leider kann ich Clips davon nicht hochladen Ich komme auf, aber ich freue mich, den Code für andere Menschen selbst zu geben, um ihn selbst zu testen. Schauen Sie sich zunächst die Box an, bewegen Sie Ihre Maus über einen längeren Zeitraum langsam, zählen Sie die Revolutionen und versuchen Sie dann, Ihre Maus schneller zu bewegen. Ich habe ungefähr 2 Revolutionen für den langsamen Test und 4 für die schnelle. Lang-Py PrettyPrint-Override ">

Code: Select all

from direct.showbase.ShowBase import ShowBase
from panda3d.core import CardMaker, LVector3, Vec4, NodePath, Mat3, WindowProperties
from math import sin, cos, radians

class WalkingGame(ShowBase):
def __init__(self):
global base
base=self
ShowBase.__init__(self)

cm = CardMaker("ground")
cm.setFrame(-10, 10, -10, 10)
self.plane = NodePath(cm.generate())
self.plane.reparentTo(self.render)
self.plane.setHpr(0, -90, 0)
self.plane.setColor(Vec4(1, 1, 1, 1))  # White

self.player = self.loader.loadModel("models/box")
self.player.reparentTo(self.render)
self.player.setScale(0.5)
self.player.setPos(0, 0, 0)

self.camLens.setFov(75)

# Camera
self.taskMgr.add(self.update_camera, "camera_task")
self.taskMgr.add(self.update_movement, "move_task")
self.camera.setPos(0.2,2,2)
# Detect key presses
self.keys = []
self.buttonThrowers[0].node().setButtonDownEvent('any')
self.buttonThrowers[0].node().setButtonUpEvent('any-up')
self.accept('escape',self.userExit)
self.accept('any', self.press)
self.accept('any-up', self.release)

self.disableMouse()
props = WindowProperties()
props.setCursorHidden(True)
props.setFullscreen(True)
self.win.requestProperties(props)

def lockMouse(self, task):
center_x = self.win.getXSize() // 2
center_y = self.win.getYSize() // 2
self.win.movePointer(0, center_x, center_y)
return task.cont

def press(self, key: str):
key=key.replace("shift-","")
self.keys.append(key)

def release(self, key: str):
key=key.replace("shift-","")
self.keys.remove(key)

def update_movement(self, task):
yaw=self.camera.getHpr()[0]
rotation_matrix = Mat3.rotateMatNormaxis(yaw, LVector3(0, 0, 1))
direction = rotation_matrix.xform(LVector3(0, 1, 0))

yaw_rad = radians(yaw+90)

right_x = -sin(yaw_rad)
right_y = cos(yaw_rad)
pos = self.camera.getPos()

speed = 0.1 if "shift" in self.keys else 0.05

if "w" in self.keys:
pos += direction * speed
if "s" in self.keys:
pos -= direction * speed
if "a" in self.keys:
pos.x += right_x * speed
pos.y += right_y * speed
if "d" in self.keys:
pos.x -= right_x * speed
pos.y -= right_y * speed

self.camera.setPos(pos)

return task.cont

def update_camera(self, task):
sensitivity = 100
center_x = base.win.getXSize() // 2
center_y = base.win.getYSize() // 2

if base.mouseWatcherNode.hasMouse():
# Get current mouse position
x = base.win.getPointer(0).getX()
y = base.win.getPointer(0).getY()

# Calculate movement delta
dx = center_x - x
dy = center_y - y

# Get current camera rotation
h, p, r = self.camera.getHpr()

new_h = h + dx * sensitivity * 0.003
new_p = max(min(p + dy * sensitivity * 0.003, 90), -90)  # Clamp pitch

# Apply
self.camera.setHpr(new_h, new_p, r)

# Reset mouse position to the center
base.win.movePointer(0, center_x, center_y)

return task.cont

if __name__ == "__main__":
game = WalkingGame()
game.run()

Top