我正在研究如何最好地圆化 CGPathRef
上的角,以便当我调用 SKAction
-followPath:asOffset:orientToPath:duration:
我的僵尸会平滑地绕过拐角,而不是每次小家伙拐过一个拐角时就突然旋转 90 度。网络上似乎有一些关于使用 Catmull-Rom 样条线的解决方案(以及 SO),我在 3D 动画中熟悉使用这些样条线。
我的问题:是有人知道添加圆角的简单方法吗,实现 Catmull-Rom 似乎有点超出了我的需要。
其次:如果确实需要 Catmull-Rom,那么将结果曲线返回到 CGPathRef
中有多容易,以便我可以将其输入我的 SKAction
?
注意:该路径是由一个简单的 A* 实现生成的,该实现存储了许多 CGPoint [x,y] 航路点,然后我想将它们用作我的路径的基础。如果可能的话,我不想使用贝塞尔曲线,因为我想保持新路径靠近图 block 中心线以避免可碰撞的对象。当我几乎达到初始路径近似所需的位置时,我也不想开始计算船体的控制点。
CGMutablePathRef path = CGPathCreateMutable();
CGPathMoveToPoint(path, NULL, [[[self pathArray] firstObject] position].x, [[[self pathArray] firstObject] position].y);
[[self pathArray]enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
if(idx != 0) {
CGPathAddLineToPoint(path, NULL, [obj position].x, [obj position].y);
}
}];
SKAction *pathAction = [SKAction followPath:path asOffset:NO orientToPath:YES duration:[[self pathArray] count]/2];
[[self zombie] runAction:pathAction];
最佳答案
CGPath
有许多用于生成曲线的工具。您绝对不需要自己实现 Catmull-Rom 或类似的。 (如果 CGPath
对您来说不方便,您可以使用更高级别的 UIBezierPath
并从中获取 CGPathRef
。)
对于您的应用程序,最简单的选择可能是 CGPathAddArcToPoint
。当然,您需要延长循环以确定何时需要转弯而不是直线。然后,不要在新正方形的中间添加一条线,而是在其边缘添加一条线,然后添加一条弧,其 (x1, y1)
是正方形的中间, (x2, y2)
是直线离开正方形的边缘,半径
是正方形宽度的一半。
关于ios - 平滑路径角以与 SKAction followPath 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20615472/