运动过程中的 Kivy 旋转
Kivy rotation during movement
我正在为如何使用 Kivy(在 python 中,而不是 kv lang)正确地实现同步移动和旋转而苦恼。我的目标是旋转一个对象,使其面向目的地,然后使用动画将其移向目的地。使用下面的代码,我通常会获得与旋转角度相关的运动,而不是与我的一般游戏区域相关的运动。例如,没有旋转的动画可能会将图像移动到点 [1,1],而旋转 180* 时动画会将图像移动到 [-1,-1]。在这种情况下,图像已正确旋转,这意味着它面向正确的方向但走错了方向。
我的理解是 push/pop 矩阵函数应该为动画提供适当的上下文而不是旋转的元素上下文。因为 PopMatrix 功能在 Canvas.after 中发生,所以这似乎没有效果 - 我的动画在原始 Matrix 恢复之前完成。
我在这里缺少一些关键信息,这让我很头疼。有人可以解释为什么下面的代码会导致图像移动到 (-1,-1) 而不是指示的 (1,1),以及如何正确实现它?
我把这段代码放在一起作为例子,我的游戏代码要复杂得多。这就是为什么我希望对我的代码进行解释而不是直接解决方案。谢谢
with self.image.canvas.before:
PushMatrix()
self.rot = Rotate()
self.rot.axis = (0, 0, 1)
self.rot.origin=self.center
self.rot.angle=180
with self.image.canvas.after:
PopMatrix()
self.anim = Animation(pos = (1,1), duration=1)
self.anim.start(self)
self.image.pos = self.pos
self.image.size = self.size
Rotate
有效地改变了整个 canvas 使用的坐标系,所以在你旋转 180 度后,位置 [1, 1] 确实与它的方向相反之前,就任何 canvas 指令而言。
我不知道 self.image
是什么(也许是图像小部件?),但想必您看到的任何东西都类似于 canvas 上绘制的 Rectangle
,其 pos
和 size
匹配小部件的那些。当您更新该位置和尺寸时,矩形将根据当前坐标系定位,该坐标系位于旋转的框架中。
考虑一下,我不确定是否有一种巧妙的方法以这种方式将旋转指令与 Kivy 的高级小部件坐标结合起来。当然,您可以通过多种方式解决它,例如在设置矩形位置时考虑旋转,但这有点繁琐,并且在使用预构建小部件时不方便。您还可以查看 Scatter
小部件如何启用任意转换。
如果只想旋转 180 度,则可以在显示之前调整正在显示的图像,或者通过调整矩形的 tex_coords 来更改显示方向。但是,这不适用于您可能想要的任意旋转。
如果其他人对如何使这项工作始终如一感兴趣 - 我发现在每一帧上设置原点和角度,并将图像小部件绑定到它的任何位置变化 parent 将确保小部件与其 parent 一起移动并朝正确的方向移动。我是这样实现的:
像这样实例化图像:
with self.image.canvas.before:
PushMatrix()
self.rot = Rotate()
self.rot.axis = (0, 0, 1)
self.rot.origin=self.center
self.rot.angle = 0
with self.image.canvas.after:
PopMatrix()
这样绑定:
self.bind(pos = self.binding)
def binding(self, *args):
self.image.center = self.center
self.image.size = self.size
在每个帧上调用一个类似于下面的函数。
self.rot.origin = self.center
self.rot.angle = getangle()#you can use a set angle or generate a new angle every frame
我正在为如何使用 Kivy(在 python 中,而不是 kv lang)正确地实现同步移动和旋转而苦恼。我的目标是旋转一个对象,使其面向目的地,然后使用动画将其移向目的地。使用下面的代码,我通常会获得与旋转角度相关的运动,而不是与我的一般游戏区域相关的运动。例如,没有旋转的动画可能会将图像移动到点 [1,1],而旋转 180* 时动画会将图像移动到 [-1,-1]。在这种情况下,图像已正确旋转,这意味着它面向正确的方向但走错了方向。
我的理解是 push/pop 矩阵函数应该为动画提供适当的上下文而不是旋转的元素上下文。因为 PopMatrix 功能在 Canvas.after 中发生,所以这似乎没有效果 - 我的动画在原始 Matrix 恢复之前完成。
我在这里缺少一些关键信息,这让我很头疼。有人可以解释为什么下面的代码会导致图像移动到 (-1,-1) 而不是指示的 (1,1),以及如何正确实现它?
我把这段代码放在一起作为例子,我的游戏代码要复杂得多。这就是为什么我希望对我的代码进行解释而不是直接解决方案。谢谢
with self.image.canvas.before:
PushMatrix()
self.rot = Rotate()
self.rot.axis = (0, 0, 1)
self.rot.origin=self.center
self.rot.angle=180
with self.image.canvas.after:
PopMatrix()
self.anim = Animation(pos = (1,1), duration=1)
self.anim.start(self)
self.image.pos = self.pos
self.image.size = self.size
Rotate
有效地改变了整个 canvas 使用的坐标系,所以在你旋转 180 度后,位置 [1, 1] 确实与它的方向相反之前,就任何 canvas 指令而言。
我不知道 self.image
是什么(也许是图像小部件?),但想必您看到的任何东西都类似于 canvas 上绘制的 Rectangle
,其 pos
和 size
匹配小部件的那些。当您更新该位置和尺寸时,矩形将根据当前坐标系定位,该坐标系位于旋转的框架中。
考虑一下,我不确定是否有一种巧妙的方法以这种方式将旋转指令与 Kivy 的高级小部件坐标结合起来。当然,您可以通过多种方式解决它,例如在设置矩形位置时考虑旋转,但这有点繁琐,并且在使用预构建小部件时不方便。您还可以查看 Scatter
小部件如何启用任意转换。
如果只想旋转 180 度,则可以在显示之前调整正在显示的图像,或者通过调整矩形的 tex_coords 来更改显示方向。但是,这不适用于您可能想要的任意旋转。
如果其他人对如何使这项工作始终如一感兴趣 - 我发现在每一帧上设置原点和角度,并将图像小部件绑定到它的任何位置变化 parent 将确保小部件与其 parent 一起移动并朝正确的方向移动。我是这样实现的:
像这样实例化图像:
with self.image.canvas.before:
PushMatrix()
self.rot = Rotate()
self.rot.axis = (0, 0, 1)
self.rot.origin=self.center
self.rot.angle = 0
with self.image.canvas.after:
PopMatrix()
这样绑定:
self.bind(pos = self.binding)
def binding(self, *args):
self.image.center = self.center
self.image.size = self.size
在每个帧上调用一个类似于下面的函数。
self.rot.origin = self.center
self.rot.angle = getangle()#you can use a set angle or generate a new angle every frame