Cocoa touch 查询沿UIBezier曲线的特定点以进行动画?
我最近为Maya编写了一个脚本,该脚本导出了一个包含Bezier路径(一系列xy点和xy控制点)数据的文件 此贝塞尔路径表示3D“轨道”或路径,我的角色将在应用程序内以恒定速度行进 我知道如何构造UIBEZIER曲线,但我似乎找不到任何可靠的信息,说明在给定沿曲线移动的距离的情况下,是否可能/如何获得曲线上某个点的x/y位置 我在苹果上找到了以下列表: 但是我不太明白这个函数返回了什么,我将如何使用它来实现我的目标 如有任何帮助/建议,将不胜感激 谢谢,Cocoa touch 查询沿UIBezier曲线的特定点以进行动画?,cocoa-touch,animation,uikit,bezier,uibezierpath,Cocoa Touch,Animation,Uikit,Bezier,Uibezierpath,我最近为Maya编写了一个脚本,该脚本导出了一个包含Bezier路径(一系列xy点和xy控制点)数据的文件 此贝塞尔路径表示3D“轨道”或路径,我的角色将在应用程序内以恒定速度行进 我知道如何构造UIBEZIER曲线,但我似乎找不到任何可靠的信息,说明在给定沿曲线移动的距离的情况下,是否可能/如何获得曲线上某个点的x/y位置 我在苹果上找到了以下列表: 但是我不太明白这个函数返回了什么,我将如何使用它来实现我的目标 如有任何帮助/建议,将不胜感激 谢谢, -亚当·艾斯菲尔德(Adam Eisf
-亚当·艾斯菲尔德(Adam Eisfeld)你引用的链接暗示的是,贝塞尔曲线的每一段都描绘出一条路径(x(t),y(t)),其中t从0到1 我不熟悉
UIBezierCurve
,但我敢打赌,您可以从中获得NSBezierPath
,从中您可以手动迭代这些段。每段都是一个移动到、线到、曲线到或闭合(相当于最后一个移动到位置的线)。唯一的非平凡路径类型是curveTo,您可以在此处了解更多信息:
如果您只想设置沿曲线移动的动画,给每个段一个固定的时间量,这将很简单;您可以迭代这些段,然后在每个段中,从0到1逐步运行t,并插入到方程中
棘手的部分将以恒定的速度移动。为此,您需要实际测量每个片段的长度,并将该长度拆分为每个帧的部分。在这个问题中,您可以阅读更多关于这方面的内容:
我已经有一段时间没有使用Cocoa了,但是我有一些Java代码,您可以很容易地移植它们(这只是数学,在任何语言中都是一样的):
好的,这将是一个很长的答案。以下是我所做的:
#import <Foundation/Foundation.h>
#import "AEBezierVertex.h"
#import "AEBezierLine.h"
@interface AEBezierPath : NSObject
{
NSMutableArray *vertices;
NSMutableArray *lines;
UIBezierPath *path;
}
@property (strong) NSMutableArray *vertices;
@property (strong) NSMutableArray *lines;
@property (strong) UIBezierPath *path;
-(id) initFromFile: (NSString*) file;
-(CGPoint) positionFromDistance: (float) fromDistance;
@end
#import <Foundation/Foundation.h>
@interface AEBezierVertex : NSObject
{
CGPoint controlIn;
CGPoint controlOut;
CGPoint control;
}
@property CGPoint controlIn;
@property CGPoint controlOut;
@property CGPoint control;
-(id) initWithControl: (CGPoint) setControl In: (CGPoint) setIn Out: (CGPoint) setOut;
@end
#import <Foundation/Foundation.h>
@interface AEBezierLine : NSObject
{
float length;
}
@property float length;
-(id) initWithLength: (float) setLength;
@end
AEBezierLine:
.h文件:
#import <Foundation/Foundation.h>
#import "AEBezierVertex.h"
#import "AEBezierLine.h"
@interface AEBezierPath : NSObject
{
NSMutableArray *vertices;
NSMutableArray *lines;
UIBezierPath *path;
}
@property (strong) NSMutableArray *vertices;
@property (strong) NSMutableArray *lines;
@property (strong) UIBezierPath *path;
-(id) initFromFile: (NSString*) file;
-(CGPoint) positionFromDistance: (float) fromDistance;
@end
#import <Foundation/Foundation.h>
@interface AEBezierVertex : NSObject
{
CGPoint controlIn;
CGPoint controlOut;
CGPoint control;
}
@property CGPoint controlIn;
@property CGPoint controlOut;
@property CGPoint control;
-(id) initWithControl: (CGPoint) setControl In: (CGPoint) setIn Out: (CGPoint) setOut;
@end
#import <Foundation/Foundation.h>
@interface AEBezierLine : NSObject
{
float length;
}
@property float length;
-(id) initWithLength: (float) setLength;
@end
工作原理:
- 亚当·艾斯菲尔德
CGPath
,而遍历它的唯一方法是通过回调和从cgpathpapply
。对不起;我多年前在桌面上的可可体验。谢谢。经过大量的实验和阅读,我想我终于想出了两个方法