Исправление непоследовательного ротации мыши в Panda3dPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Исправление непоследовательного ротации мыши в Panda3d

Сообщение Anonymous »

Недавно я хотел начать делать 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»