python - 在pygame中旋转列表

标签 python numpy pygame rotational-matrices

如果我能得到一些帮助,我会发布更多此代码。这有点奇怪。我从视频中捡起它并稍微清理了一下。基本上它捕获 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/

相关文章:

python - 无法从 VSCode 外部在我的 macbook pro 中使用 Python3 numpy(或 matplotlib 等)

python - 游戏错误 : No module named 'pygame.base'

python - 如何检测基于图 block 的移动中的碰撞?

python - 在python中读取具有可变列数的文件

python - 如何使用 python 在条形图上添加总计数?

python - 将 ndarray 列表折叠为矩阵

python - 传递给线程时求和 numpy.ndarray 失败

python - 如何将 numpy 数组呈现到 pygame 表面?

python - Pandas 中的多重聚合计数

python 将 pandas 数据框、参数和函数传递给 scipy.optimize.minimize