Недавно я хотел начать делать 3D -тестировку с Panda3d с помощью Python. Тем не менее, я не могу имитировать вращение мыши в среде, которое есть у других популярных игр от первого лица. < /P>
Позвольте мне объяснить: < /p>
Если я медленно перемещаю свою мышь в течение длительного периода времени, начиная с левой стороны моего мыши и движущейся вправо, я должен переместить ее в центр мыши, чтобы сделать полный поворот на 360 градусов в игре. Однако, если я очень быстро перемещаю свою мышь в течение более короткого периода времени, я смогу сделать полную революцию в гораздо меньшем пространстве, позволяя мне сделать еще больше вращений в одной мышью. < /P>
Этого не происходит в играх, в которые я играю ежедневно. В популярных играх, в которые я играл, скорость мыши не повлияла на сумму, перевернутое. мыши расстояния от центра. Тем не менее, это закончилось тем, что произошло противоположное событие, когда перемещение мыши медленнее в течение более длительного периода времени заставило камеру больше вращения. Поиск, но я рад предоставить код, чтобы другие люди могли проверить его сами. Начните с просмотра коробки, затем медленно перемещайте мышь в течение более длительного периода времени, подсчитывая революции, а затем попробуйте быстрее перемещать мышь. Я получил около 2 революций для медленного теста и 4 для быстрого. Lang-Py PrettyPrint-Override ">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()
Подробнее здесь: https://stackoverflow.com/questions/794 ... in-panda3d
Исправление непоследовательного ротации мыши в Panda3d ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение