是否可以使用简单的旋转矩阵来模拟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))
我正在尝试逐点旋转 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))