1

我试图使用CGPathAddCurveToPoint动画化一个视图的运动并生成一条贝塞尔路径,但我无法找出原点和destionation之间的控制点。你们中的任何一个人都知道如何在给定UIView的起源和destionation的情况下动态计算控制点?iOS计算贝塞尔路径曲线动画给出两点的控制点

例如(iPad),我正在尝试使从点(455,482)飞到(31,100)的鸟(UIView)动起来。我想成为鸟类飞行的曲线运动而不是直线运动。我会非常感谢你的帮助。

谢谢你的答案,但仍然不知道如何计算控制点。

回答

2

您能否澄清一下您正在寻找的效果?控制点的选择不仅是开始和结束坐标的函数,还是您试图实现的效果的功能。在过去,在我想要“拾取和放下”视图的错觉中动画化图像视图的运动时,我在控制点上在相同方向上做了轻微的垂直偏移,这产生稍微更多的动态运动一个纯粹的线性运动,但它完全取决于你想要做什么。我也在做这个动画的同时扩大了变形尺度,然后恢复了正常的变形尺度,进一步丰富了拾取和放弃动画视图的错觉。

在你的修改答案中,你说你想显示一只鸟的飞行。现在,这是一个令人着迷的问题。鸟从侧面看,例如从一个分支跳到另一个分支,在这种情况下,你的控制点可能会直线上升一点,以显示鸟起飞和着陆。或者,如果您试图模拟拍动动作,您可能还会有临时上行控制点,每个动作一个。还是从下方或上方看鸟,在这种情况下,一个轻微的“s”形飞行模式可能就足够了,所以你只需要一个控制指向沿飞行路径指向起飞位置45度,并且另一个控制点在末端,朝向起点指向45度,但指向另一个方向。这一切都取决于您要查找的效果,因为该应用的理论上是鸟在三维空间中与观看者之间的关系。

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

其他资源:

顺便说一句,有动画的一些有趣的示威活动可能会有所帮助。例如Mike Nachbaur的这款赛车动画在我做第一个动画的时候很有帮助,向我展示了如何绘制更加缓慢的路径,如何沿着路径旋转图像等等。我知道这不是鸟的飞行,但它是仍是说明性的我相信网上也有其他很棒的例子。无论如何,这些教程可能会帮助您缩小您的应用程序视野与更加困难的路径之间的差距。

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];