在cocos2d中,您可以使用ccBezierConfig在Bezier路径中移动精灵。这不是我的问题,我有一个导弹,我试图让它垂直于曲线上的那个点旋转。我暂时想不通,然后我的朋友告诉我衍生物。现在我需要明显地找到贝塞尔曲线的导数。我在Google上搜索并在此页面上找到了它:http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/bezier-der.html。那么我尝试用3种方法实现旋转导弹:
-(float)f:(int)x {
if (x == 0)
return 1.0f;
float result = 1;
while (x>0) {
result = result*x;
x--;
}
return result;
}
-(float)B:(float)u i:(int)i n:(int)n {
return ([self f:n])/([self f:i]*[self f:(n-i)])*pow(u, (float)i)*pow(1-u, (float)n-i);
}
-(void)rotateMissile:(float)delta {
//Get bezier derivative...
float y = [self B:missileP1.controlPoint_1.x i:0 n:2]+[self B:missileP1.controlPoint_2.x i:1 n:2]
*2*(missileP1.controlPoint_1.x - missileP1.controlPoint_2.x);
//Take the y and rotate it...
missile1.rotation = atanf(y);
}
第一种方法是阶乘,第二种方法应该在方程导数中找到B.第三种方法应该找到实际的导数,并通过使用atanf将斜率转换为度数来旋转导弹。
正在连续调用rotateMissile:
[self schedule:@selector(rotateMissile:)];
missileP1是ccBezierConfig对象。导弹1是我试图旋转的导弹。我真的很困惑这个衍生的东西(换句话说,我真的很迷茫和困惑)。我需要帮助试图弄清楚什么是错的...对不起,代码很乱,方程式很长,我可以想办法让它不那么混乱。
答案 0 :(得分:2)
实际上我不明白你是如何选择衍生品并将其放入浮动的。那是因为比较曲线是二维参数曲线(它有x和y分量)。它不是函数y(x)。在立方体情况下,它是:
x(t) = x0 + x1*t + x2*t*t + x3*t*t*t
y(t) = y0 + y1*t + y2*t*t + y3*t*t*t
我们称之为form1。所以实际上它只不过是三阶的两个多项式。三次贝塞尔曲线的传统形式是
注意,这里的B(t)是二维矢量(x(t),y(t))。因此,如果你有一个传统方式定义Bezier曲线,你可以通过评估系数x0,x1和son on将它转换为form1。
如果你现在在form1中定义了Bezier曲线,那么很容易得到导数:
x'(t) = x1 + 2*x2*t + 3*x3*t*t
y'(t) = y1 + 2*y2*t + 3*y3*t*t
现在向量(x'(t),y'(t)) - 是贝塞尔曲线上的速度。它也是曲线的切线向量。垂直向量将是(-y'(t),x'(t))或((y'(t), - (x'(t))。
以下是系数:
对于y系数,公式完全相同。它只是py0,py1,py2,py3而不是px0,......。