如何解决Pyglet 3D相机移动无法正常工作
我正在开发我的小型3D游戏,并且正在努力使3D运动和相机控件正常工作。当我移动相机时,它确实会移动,但是它以奇怪的方式移动。另外,当我按下W
时,我希望相机朝着它所看的方向移动。
from pyglet.gl import *
from pyglet.window import key
import pyglet.clock
import math
class Triangle:
def __init__(self):
self.vertices = pyglet.graphics.vertex_list(3,('v3f',[-0.5,-0.5,0.0,0.5,0.0]),('c3B',[100,200,220,110,100,250,100]))
class Quad:
def __init__(self):
self.vertices = pyglet.graphics.vertex_list_indexed(4,[0,1,2,3,0],('c3f',[1.0,1.0,0.0]))
class Player:
def __init__(self):
self.velocity = [0,-5]
self.rotation = [0,0]
self.change_x = 0
self.change_z = 0
self.speed = 0.05
def controls(self,keys,dt):
self.change_x = 0
self.change_z = 0
#s=dt*10
rotX = -self.rotation[0]#/180*math.pi
rotY = -self.rotation[1]#/180*math.pi
rotZ = -self.rotation[2]#/180*math.pi
#print(rotY)
dx = math.cos(rotX)
dy = math.sin(rotY)
dz = math.sin(rotX)
if keys[key.W]:
self.change_z = self.speed * dz
self.change_x = self.speed * dx
if keys[key.S]:
self.change_z = -self.speed * dz
self.change_x = -self.speed * dx
if keys[key.A]:
self.change_x = -self.speed * dx
self.change_z = self.speed * dz
if keys[key.D]:
self.change_x = self.speed * dx
self.change_z = -self.speed * dz
self.velocity[0] += self.change_x
self.velocity[2] += self.change_z
def mouse_motion(self,dx,dy):
dx/= -8
dy/= -8
print(dx,dy)
self.rotation[0] -= dx
self.rotation[1] -= dy
self.rotation[2] -= dx
if self.rotation[1]>90:
self.rotation[1]=90
elif self.rotation[1]<-90:
self.rotation[1]=-90
class Window(pyglet.window.Window):
def __init__(self,*args,**kwargs):
super().__init__(*args,**kwargs)
self.set_minimum_size(300,300)
glClearColor(0.2,0.3,0.2,1.0)
self.keys = key.KeyStateHandler()
self.push_handlers(self.keys)
self.quad = Quad()
self.player = Player()
pyglet.clock.schedule_interval(self.update,1/60)
def Projection(self):
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
def Model(self):
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
def set2d(self):
self.Projection()
gluOrtho2D(0,self.width,self.height)
self.Model()
def set3d(self):
self.Projection()
gluPerspective(70,self.width/self.height,0.05,1000)
self.Model()
def on_key_press(self,KEY,MOD):
if KEY == key.E:
self.mouse_lock = not self.mouse_lock
def update(self,dt):
self.player.controls(self.keys,dt)
def setLock(self,state): self.lock = state; self.set_exclusive_mouse(state)
lock = False
mouse_lock = property(lambda self:self.lock,setLock)
def on_mouse_motion(self,x,y,dy):
if self.mouse_lock:
self.player.mouse_motion(dx,dy)
def on_draw(self):
self.clear()
self.set3d()
x,z = self.player.velocity
glRotatef(*self.player.rotation,1.0)
glTranslatef(x,z)
self.quad.vertices.draw(GL_TRIANGLES)
def on_resize(self,width,height):
glViewport(0,height)
if __name__ == '__main__':
window = Window(800,600,'My Window',resizable = True)
pyglet.app.run()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。