运动期间的Kivy旋转

时间:2018-02-03 13:59:43

标签: python-3.x kivy image-rotation

我正在努力使用Kivy(在python中,而不是kv lang)正确实现同步移动和旋转。我的目标是旋转一个物体,使其面向目的地,然后使用动画将其移向目的地。使用下面的代码,我通常会获得与旋转角度相关的移动,而不是相对于我的一般游戏区域。例如,没有旋转的动画可能会将图像移动到点[1,1],而旋转180 *时,动画会将图像移动到[-1,-1]。在这种情况下,图像被正确旋转,这意味着它面向正确的方向但走错了方向。

我的理解是推/弹矩阵函数应该为动画而不是旋转的元素上下文提供适当的上下文。因为PopMatrix函数在Canvas中发生。看起来这似乎没有效果 - 我的动画在原始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

2 个答案:

答案 0 :(得分:1)

如果其他人对如何使这项工作保持一致感兴趣 - 我发现在每一帧上设置原点和角度,以及将图像小部件绑定到其父级的任何位置更改将确保小部件随其父级移动并且方向正确。我实现了这样:

像这样实例化图像:

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

答案 1 :(得分:0)

Rotate有效地改变了整个画布所使用的坐标系,所以在你旋转了180度之后,位置[1,1]实际上与之前的方向相反,至于任何帆布教学都是关注的。

我不知道self.image是什么(可能是一个Image小部件?),但是大概你看到的就是在它的画布上绘制的Rectangle,其pos和{ {1}}匹配小部件的那些。更新该位置和大小时,矩形将根据当前坐标系定位,该坐标系位于旋转的帧中。

考虑到这一点,我不确定是否有一种巧妙的方法可以将旋转指令与Kivy的高级小部件坐标结合起来。当然,您可以通过各种方式解决这个问题,例如在设置Rectangle的位置时考虑旋转,但这种情况有点繁琐,并且在使用预构建的小部件时不方便。您还可以查看size小部件的功能,以启用任意转换。

如果您只想旋转180度,则可以在显示之前调整显示的图像,或者通过调整矩形的tex_coords来更改显示的方向。但是,这对于任意旋转都不起作用,它看起来像你想要的那样。