如果我能得到一些帮助,我会发布更多此代码。这有点奇怪。我从视频中捡起它并稍微清理了一下。基本上它捕获 cam.pos[0]
中的所有 x 坐标,cam.pos[1] 中的所有 y 坐标
,以及 cam.pos[2]
中的所有 z 坐标。
我的 3D 环境有几十个立方体,我可以朝向、远离、上方、下方、左侧和右侧移动。但我不能转身。
这是我对开瓶器的尝试:
while True:
dt = clock.tick()/1000
rot = clock.tick()/1000
r = rot*36
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_x:
cam.pos[0] = cam.pos[0]*np.cos(r)-cam.pos[1]*np.sin(r)
cam.pos[1] = cam.pos[0]*np.sin(r)-cam.pos[1]*np.cos(r)
cam.pos[2] = cam.pos[2]
if event.type == pygame.QUIT: pygame.quit(); sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE: pygame.quit(); sys.exit()
cam.events(event)
screen.fill((0,0,0))
face_list = []; face_color = []; depth = []
for obj in cubes:
vert_list = []; screen_coords = []
for x,y,z in obj.verts:
x-=cam.pos[0]; y-=cam.pos[1]; z-=cam.pos[2]
如果有人感兴趣,我可以发布更多。它不返回任何错误,但也不是开瓶器。 谢谢。
出于某种原因,删除代码并不奏效。 您可以在这里查看:python_flyer
你可以看到我做了修改:
datax = cam.pos[0]
datay = cam.pos[1]
for i in range(datax):
for j in range(datay):
cam.pos[0] = i * np.cos(r) - j * np.sin(r)
cam.pos[1] = i * np.sin(r) - j * np.cos(r)
现在的错误是:
for i in range(datax):
TypeError: 'float' object cannot be interpreted as an integer
我称之为进步
最佳答案
注意,在行之后
cam.pos[0] = cam.pos[0]*np.cos(r)-cam.pos[1]*np.sin(r)
cam.pos[0]
中的值已更改。所以结果
cam.pos[1] = cam.pos[0]*np.sin(r)-cam.pos[1]*np.cos(r)
取决于前一个表达式的计算。
在计算旋转之前,将 cam.pos
的内容存储到局部变量中。
此外,旋转公式是错误的。参见 Rotation matrix - In two dimensions :
x` = x * cos(theta) - y * sin(theta) y` = x * sin(theta) + y * cos(theta)
例如
x, y, z = cam.pos
cam.pos[0] = x * np.cos(r) - y * np.sin(r)
cam.pos[1] = x * np.sin(r) + y * np.cos(r)
cam.pos[2] = z
不要调用 clock.tick()
连续两次。此函数返回自上次调用以来经过的毫秒数。所以第二次调用将始终返回 0.0。
您的相机位置是 (0, 0, -5)。如果这个位置绕z轴旋转任意角度,那么结果仍然是(0, 0, -5)。绕 y 轴旋转它。
试试下面的代码,它会让你的场景动起来:
while True:
ticks = clock.tick()
dt = ticks/1000
rot = ticks/1000
r = rot
x, y, z = cam.pos
cam.pos[0] = x * np.cos(r) - z * np.sin(r)
cam.pos[1] = y
cam.pos[2] = x * np.sin(r) + z * np.cos(r)
关于python - 在pygame中旋转列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55255787/