我正在尝试为一个任务实现Bezier曲线。我试图通过给我的函数一个关键帧数组来移动球(使用bezier曲线)。该函数应该给出关键帧之间的所有帧...或者控制点。虽然我用的是wikipedia上的公式。它不是真的有效:s
这是我的代码:
private void interpolate(){
float x,y,b, t = 0;
frames = new Frame[keyFrames.length];
for(int i =0;i<keyFrames.length;++i){
t+=0.001;
b = Bint(i,keyFrames.length,t);
x = b*keyFrames[i].x;
y = b*keyFrames[i].y;
frames[i] = new Frame(x,y);
}
}
private float Bint(int i, int n, float t){
float Cni = fact(n)/(fact(i) * fact(n-i));
return Cni * pow(1-t,n-i) * pow(t,i);
}此外,我还注意到frames[]数组应该更大,但我找不到其他更适合程序员的文本
提前谢谢。
发布于 2011-03-31 02:12:57
终于得到了我想要的东西!下面是我所做的:
private void interpolate() {
float t = 0;
float x,y,b;
for(int f =0;f<frames.length;f++) {
x=0;
y=0;
for(int i = 0; i<keyFrames.length; i++) {
b = Bint(i,keyFrames.length-1,map(t,0,time,0,1));
x += b*keyFrames[i].x;
y += b*keyFrames[i].y;
}
frames[f] = new Frame(x,y);
t+=partialTime;
}}
private void createInterpolationData() {
time = keyFrames[keyFrames.length-1].time -
keyFrames[0].time;
noOfFrames = 60*time;
partialTime = time/noOfFrames;
frames = new Frame[ceil(noOfFrames)];
}发布于 2011-03-30 20:25:51
这里有很多东西看起来不太对劲。
,
t的值应该从开始的0变为结束的1。你碰巧有1001个这样的关键帧吗?如果不是这样,你将做错误的thing.fact和pow可能效率低下,特别是当n很大的时候。在没有更多了解任务范围的情况下,我不愿详细介绍您应该做什么-- Stack Overflow为您做作业对任何人都没有好处!关于Bezier曲线,你已经被告知了什么?你的作业到底要求你做什么?
编辑后添加:
使用Bezier曲线进行插值的最简单方法可能是这样。在每对关键点之间有一条(三次) Bezier曲线。每条Bezier曲线的端点(第一个和最后一个控制点)就是这些关键点。你还需要两个控制点。要使运动在通过给定关键点时平滑,需要(关键点减去上一个控制点)=(下一个控制点减去关键点)。因此,您将在每个关键点选择一个向量,该向量将确定前一个控制点和后续控制点的位置。当您移动通过每个关键点时,您将沿着该向量的方向移动,并且向量越长,移动速度就越快。(如果向量为零,则立方Bezier将退化为简单的直线路径。)
选择该向量使所有东西看起来都很好是非常重要的,但在这个阶段,您可能并不是真的被要求这样做。因此,一些简单的东西可能就足够好了。例如,您可以将向量与(下一个关键点减去前一个关键点)成比例。如果你这样做,你需要在你的路径的开始和结束做一些不同的事情。
https://stackoverflow.com/questions/5486134
复制相似问题