【问题标题】:How do I make a translation animation in python?如何在python中制作翻译动画?
【发布时间】:2013-01-01 23:13:30
【问题描述】:

我正在尝试为屏幕上两点之间的平滑运动设置动画。目前,我正在使用以下 python 生成器函数来确定绘制图像的点:

#indexes (just for readability)
X=0
Y=1

def followLine(pointA, pointB, speed):
    x1, y1 = pointA
    x2, y2 = pointB
    movement=[0, 0]
    pos=list(pointA)
    diffY=y2-y1
    diffX=x2-x1
    if abs(diffY) > abs(diffX):
        #Y distance is greater than x distace
        movement[Y]=speed
        numFrames=abs(diffY)//speed
        if numFrames==0:
            movement[X]=0
        else:
            movement[X]=abs(diffX)//numFrames
    elif abs(diffY) < abs(diffX):
        #Y distance is less than x distace
        movement[X]=speed
        numFrames=abs(diffX)//speed
        if numFrames==0:
            movement[Y]=0
        else:
            movement[Y]=abs(diffY)//numFrames
    else: #Equal
        movement=[speed]*2

    if diffY < 0:
        #is negative
        movement[Y] *= -1
    if diffX < 0:
        movement[X] *= -1

    yield pointA
    while (abs(pos[X]-x2) > speed)or(abs(pos[Y]-y2) > speed):
        pos[X] += movement[X]
        pos[Y] += movement[Y]
        yield pos
    yield pointB

但是,这有两个问题:

    1234563 ;
  • 另一个问题是,在动画结束时,当图像卡入到位时会有一种震动。这种颠簸通常是难以察觉的,但我想尝试让动画更流畅。

我该怎么做?我一直在研究三角函数的使用,这似乎很有希望,但我不是一个数学家,所以我无法准确理解如何使用三角函数来实现它。

另外,值得我使用 Python 3.2。

【问题讨论】:

    标签: python animation python-3.x trigonometry


    【解决方案1】:

    我认为缺少信息。似乎您需要将numFrames arg 替换为speed,或者在speed 之外添加time arg。假设是前者,这个怎么样。请注意,这会生成 numFrames+1 个点,因此 pointA 和 pointB 始终分别是第一个点和最后一个点,但如果这不是您想要的行为,那么更改是微不足道的:

    def followLine(pointA, pointB, numFrames):
        x1, y1 = pointA
        x2, y2 = pointB
        diffY = float(y2 - y1) /    numFrames
        diffX = float(x2 - x1) /    numFrames
    
        yield(pointA)
        for f in range(1,numFrames):
        point = (x1 + f * diffX, y1 + f * diffY)
            yield(point)
        yield(pointB)
    
    points = followLine((0,0), (1,1), 10)
    
    # then iterate over the points and do whatever                                                                                                
    for p in points:
        print str(p)
    

    【讨论】:

    • 时间实际上是由程序的另一部分管理的,它每帧调用一次生成器上的next(),而speed 意味着更多地沿着每帧行进的距离线。但是谢谢,你让我走上了正确的道路。我将 arg 改回 speed 并用 int(max((abs(y2-y1), abs(x2-x1)))/speed 计算 numFrames,并舍入输出(因为我需要它以 int 形式),缩进 thar for 循环的第一行,它工作得很好。
    猜你喜欢
    • 2021-06-10
    • 2011-05-23
    • 2021-11-15
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 2013-04-25
    相关资源
    最近更新 更多