iOS计算控制点为贝塞尔曲线路径曲线动画给出两点

时间:2012-08-31 22:30:36

标签: ios animation core-animation uiviewanimation uiviewanimation-curve

我正在尝试使用CGPathAddCurveToPoint为视图的移动设置动画并生成贝塞尔曲线路径,但是我无法找出原点和destion之间的控制点。你们中的任何人都知道如何在给定UIView的起源和位置的情况下动态计算控制点?

例如(iPad),我试图动画一只从(455,482)到(31,100)的飞行鸟(UIView)。我想成为鸟类飞行而不是直线运动的曲线运动。我非常感谢你的帮助。

感谢您的回答,但仍然想知道如何计算控制点。

2 个答案:

答案 0 :(得分:2)

您能否澄清一下您正在寻找的效果?控制点的选择不仅是起始坐标和结束坐标的函数,而且还取决于您尝试实现的效果。在过去,动画一个imageview的动作,我想要了解"拾取和放弃"在视图中,我在控制点上都在相同的方向上进行了轻微的垂直偏移,这产生了比纯线性运动稍微更动态的运动,但它完全取决于您尝试做的事情。我也通过动画放大然后同时恢复到变换比例的正常来完成此操作,以进一步丰富拾取和放下动画视图的错觉。

在您修改后的答案中,您说要显示鸟的飞行。现在,这是一个引人入胜的问题。从侧面看鸟的视图,例如从一个分支起飞到另一个分支,在这种情况下,你的控制点可能会直接指向一点,以显示鸟类起飞和降落。或者,如果您正在尝试模拟拍打动作,您可能还有临时向上控制点,每个拍打一个。或者它是从下面还是上面看鸟,在这种情况下是轻微的" s"形状飞行模式可能就足够了,所以你只需要一个控制器指向从飞行路径指向的起飞位置45度,另一个控制点在末端,朝向起点指向45度,但指向另一个方向。考虑到应用程序理论上3d空间中鸟与观察者之间的关系,这一切都取决于你所寻找的效果。

您可能需要显示场景的屏幕快照和鸟的图像(是从侧面,还是从上方或下方)。您可能还想绘制一个您正在设想的飞行模式的示例,也许我们可以提出其他更具体的建议。

其他资源:

顺便说一下,有一些有趣的动画演示可能会有所帮助。例如,Mike Nachbaur的这款赛车动画在我拍摄第一部动画时非常有用,向我展示了如何绘制贝塞尔曲线,如何沿着路径旋转图像,等等。我知道它不是一只鸟的飞行,但它仍然是一个例证。我确信网上还有其他很好的例子。无论如何,这些类型的教程可以帮助您弥合您的应用程序愿景与bezier路径之间的差距。

答案 1 :(得分:1)

//Draw points
UIBezierPath *aPath = [UIBezierPath bezierPath];
[aPath setLineWidth: LINE_SIZE];
for (int i=0; i<[results count]; i++) {
    CGPoint endPt = [[results objectAtIndex: i] CGPointValue];
    if (i == 0) {
        [aPath moveToPoint:endPt];
    } else {
        //Previous (start) point
        CGPoint startPt =[[results objectAtIndex: i-1] CGPointValue];

        //Default control points
        CGPoint cPt1, cPt2;
        if(ABS(startPt.x - endPt.x) > ABS(startPt.y - endPt.y)) {
            cPt1 = (CGPoint){(startPt.x + endPt.x) / 2, startPt.y};
            cPt2 = (CGPoint){cPt1.x, endPt.y};
        } else {
            cPt1 = (CGPoint){startPt.x, (startPt.y + endPt.y) / 2};
            cPt2 = (CGPoint){endPt.x, cPt1.y};
        }

        //Add curve to end point
        [aPath addCurveToPoint: endPt controlPoint1: cPt1 controlPoint2: cPt2];
    }
}
[aPath stroke];