Cocos2D Безье кривая вокруг объекта как бы под действием силы тяжести
Я пытаюсь манипулировать объектом. Когда он приближается к другому объекту, скажем, глобус, я хочу, чтобы земной шар имел гравитационное притяжение к исходному объекту. Я знаю, что я должен использовать 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
Траектория будет конической частью (линия, гипербола, парабола, эллипс или круг).
Вы можете представить их как рациональную кривую Безье.
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, чтобы найти оптимальные позиции контрольных точек
минимизацией наименьших квадратов.
Я думаю, что это было бы проще всего, если бы вы просто вычислили разделы коники и нарисовали их как линейные циклы.
Или вы реализуете вербальный интегратор и решаете уравнения движений.