在pygame中我有一个0度旋转的护卫舰的图像对象。在它上面我有炮塔,我需要计算他们的新位置,如果护卫舰旋转了90度。
像这样旋转图像后,
rotatedFrigate = pygame.transform.rotate(gui.frigate[0], facingAngle)
我试过各种方法比如旋转这个点,
point = pygame.math.Vector2(turretx, turretY)
rotated_point = point.rotate(facingAngle)
即使加上原始的x,y坐标,也仍然相差甚远
t1x,t1y = rotated_point[0]+point[0], rotated_point[1]+point[1]
我也尝试过旋转矩阵的方法,使用中点和增加新的调整暗。
xm,ym = self.x + 0.5*self.w,self.y + 0.5*self.h
a = math.radians(facingAngle) # Convert to radians
xr = (x - xm) * math.cos(a) - (y - ym) * math.sin(a) + xm
yr = (x - xm) * math.sin(a) + (y - ym) * math.cos(a) + ym
rotatedFrigate = pygame.transform.rotate(gui.frigate[0], facingAngle)
t1x,t1y = xr + 0.5*rotatedFrigate.get_width(),yr+ 0.5*rotatedFrigate.get_height()
对于转台:
turretx, turretY = self.x,self.y+0.05*self.h
自身指的是旋转前的护卫舰坐标
护卫舰图像中心坐标的计算方法为
xm,ym = self.x + 0.5*self.w,self.y + 0.5*self.h
其中w & h是用在护卫舰图像get_width() get_height()
上的方法。
再次旋转前。
这两种方法似乎都不起作用,有时它们很接近,但大多数时候它们很遥远。
附加信息
图片是如果我使用rotated_point = (point - pivot).rotate(-facingAngle) + pivot
1条答案
按热度按时间vuktfyat1#
我建议使用
pygame.math.Vector2.rotate()
。如果图像是围绕一个轴旋转的,下面的代码就可以工作。请参阅如何使用PyGame围绕图像中心旋转图像?以及如何为pygame. transform. rotate()?设置轴点(旋转中心)。pygame.math.Vector2.rotate()
旋转矢量pygame.transform.rotate
为顺时针方向,pygame.math.Vector2.rotate()
为逆时针方向。**在下面的最小示例中,枢轴点用蓝色十字标记,旋转点用绿色十字标记。旋转向量是蓝色十字和绿色十字之间的蓝色线。
如果不围绕图像中心旋转图像,而仅将位置保持在左上角,则必须:
pygame.math.Vector2.rotate()
旋转矢量最小示例: