是否可以使用简单的旋转矩阵来模拟pygame中的圆形轨道?

Is it possible to use simple rotation matrices to simulate circular orbits in pygame?

我正在尝试逐点旋转 py 游戏的整个场景,以模拟 3d space。然而,我注意到,简单的旋转矩阵在长 运行 中表现不佳。如果我 运行 下面的测试代码,轨道圆将倾向于 'fall' 到其轨道的中心。这对我来说很奇怪,因为我在更简单的环境 (geogebra) 中完成了这项工作,我觉得它应该在 python.

下工作得更好

测试代码为:

import time
import numpy as np
import pygame

pygame.init()

#screensize
screensize = (width,height)=(600,600)
center=(int(width/2),int(height/2))
screen = pygame.display.set_mode(screensize)

#delta mov
do=0.1

#orbiting point
k=[100,100]

run=True
while run:
    pygame.time.delay(20)
    for event in pygame.event.get(): 
        if event.type == pygame.QUIT:
            run=False

    #rotation
    k[0]=np.cos(do)*k[0]-np.sin(do)*k[1]
    k[1]=np.sin(do)*k[0]+np.cos(do)*k[1]

    pygame.draw.circle(screen,(255,255,255),(int(k[0]+center[0]),int(k[1]+center[1])),5)
    pygame.display.update()
    screen.fill((0,0,0))
pygame.quit()

当然,我可以通过减少 time.delay 和旋转角度来获得更好的近似值来解决这个问题,但这不是我尝试绘制的整个模拟的选项,因为它会消耗很多来自我相当基本的笔记本电脑的资源......恐怕我只是对图书馆提出了很多要求。

¿关于如何解决这个问题有什么建议吗? ¿对正弦和余弦使用 numpy 函数是个坏主意吗?

可能是我太傻了,有什么地方我没注意到!

我不是专家,所以如果有一些不涉及额外库的解决方案,我将不胜感激。

感谢您的帮助!

问题是你操纵了原点k。由于浮点运算的精度有限,因此每一步都会稍微移动一点。

保留原始点,但增加角度并根据每帧中的原始点计算新点。例如:

kr = np.cos(do)*k[0]-np.sin(do)*k[1], np.sin(do)*k[0]+np.cos(do)*k[1]
do += 0.1

查看示例

do = 0.0
k = [100, 0]

run=True
while run:
    pygame.time.delay(20)
    for event in pygame.event.get(): 
        if event.type == pygame.QUIT:
            run=False

    #rotation
    kr = np.cos(do)*k[0]-np.sin(do)*k[1], np.sin(do)*k[0]+np.cos(do)*k[1]
    do += 0.1

    pygame.draw.circle(screen,(255,255,255),(int(kr[0]+center[0]),int(kr[1]+center[1])),5)
    pygame.display.update()
    screen.fill((0,0,0))