Cocos2D Кривая Безье вокруг объекта, как будто под действием силы тяжести - PullRequest
10 голосов
/ 06 июня 2011

Я пытаюсь манипулировать объектом. Когда он приближается к другому объекту, скажем, к глобусу, я хочу, чтобы глобус имел гравитационное притяжение к исходному объекту. Я знаю, что должен использовать CCBezierTo, так что это не столько вопрос программирования, сколько математический вопрос.

Математически, как я могу вычислить три точки кривой Безье (1, 2 и конец) и придать ей вес в зависимости от расстояния (дальше = меньше тяги). У меня уже есть расстояние, указанное в переменной.

Подумайте о космическом корабле, стреляющем вокруг Луны.

Код:

ccBezierConfig bezier;
bezier.controlPoint_1 = ccp(projectile.position.x + 10, projectile.position.y + 20);
bezier.controlPoint_2 = ccp(projectile.position.x + 20, projectile.position.y + 40);
bezier.endPosition = ccp(projectile.position.x + 30, projectile.position.y+60);
id bezierAction = [CCBezierTo actionWithDuration:1 bezier:bezier];
[projectile stopAllActions];
[projectile runAction: bezierAction];

1 Ответ

1 голос
/ 02 июля 2011

Траектория будет представлять собой коническое сечение (прямая, гипербола, парабола, эллипс или круг).

Вы можете представить их в виде рациональной кривой Безье.http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/NURBS/RB-conics.html и http://www.cs.unc.edu/~dm/UNC/COMP236/papers/farin.pdf.

Если вы настаиваете на использовании квадратичных сечений Безье, я бы использовал такую ​​функцию http://www.netlib.org/minpack/lmder.f, чтобы найти оптимальные положения контрольных точек путем минимизации наименьших квадратов.

Я думаю, что было бы проще, если бы вы просто вычислили конические сечения и нарисовали их как линейные петли.

Или вы внедрили интегратор верлетов и решили уравнения движения.

...