2011-05-27 102 views
2

在cocos2d中,您可以使用ccBezierConfig在贝塞尔路径中移动精灵。这不是我的问题,但我有一个导弹,并试图使它垂直于曲线上的那个点旋转。我无法弄清楚一段时间,然后我的朋友告诉我有关衍生品。现在我需要明显地找到贝塞尔曲线的导数。我在Google上搜索,发现它在这个页面上:http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/bezier-der.html。于是我试图在这里实现与旋转的3种方法的导弹,他们是:在Cocos2d中获取贝塞尔曲线问题的导数

-(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是我试图旋转的导弹。我对这个整体衍生的东西感到困惑(换句话说,我真的迷失了和困惑)。我需要帮助,试图弄清楚什么是错的...抱歉,代码是混乱的,方程式很长,我可以找出一种方法来减少混乱。

回答

2

其实我不明白你是如何拿一个衍生物并将其放入浮动。这是因为Bizier曲线是二维参数曲线(它具有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。所以实际上它不过是两个三阶多项式。三次Bezier曲线的传统形式是

enter image description here

。注意,B(T)在这里是一个二维向量(x(T),Y(t))的。所以,如果你有一个传统的方式定义贝塞尔曲线,你可以通过评估系数x0,x1和son来将它转换为form1。

如果你现在已经在Form1定义了贝塞尔曲线是很容易把衍生:

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))的

下面是系数: enter image description here

对于y系数,公式是完全相同的,它只是将py0,py1,py2,py3而不是px0,...

+0

是x0,y0,y1,x1控制点,是t导弹的位置(在我的情况下)? – Dair 2011-05-28 03:51:24

+0

@anon:不,控制点是P0,P1,P2,P3但是计算x0,y0,x1,...,y3很简单,只需删除括号并收集。曲线参数。你可以在这里阅读更多关于这个http://en.wikipedia.org/wiki/Bezier_curve – Andrew 2011-05-28 05:05:03

+0

由于我所有的d oing给出了Cocos2d中的点(2点的影响力和终点),我怎么知道x0-y3是相等的?从我看到的(我可能会误解)x0 - y3是常量。但是,这些常数的值是什么?我怎么知道在bezier路径(导弹所遵循的路径)的特定时间t应该相等。 (我知道t应该在0和1之间,但是当导弹完成其1/4的行程时,应该如何?1/2?1/3?等等)。 – Dair 2011-05-28 20:54:28