2011-06-06 7 views
10

J'essaie de manipuler un objet. Quand il s'approche d'un autre objet, disons un globe, je veux que le globe ait une attraction gravitationnelle sur l'objet original. Je sais que je suis censé utiliser CCBezierTo, donc ce n'est pas tellement une question de programmation que c'est une question de maths. Mathématiquement, comment pourrais-je comprendre les trois points de la courbe de Bézier (1, 2 et fin) et lui donner un poids en fonction de sa distance (plus loin = moins de traction). J'ai déjà la distance cartographiée dans une variable. Pensez à un vaisseau spatial qui fronde autour de la lune.Cocos2D Courbe de Bézier autour de l'objet comme par gravité

code:

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

Pourquoi ne pas simplement appliquer un vecteur de force au projectile proportionnel au carré de la distance à l'objet? c'est-à-dire pourquoi ne pas simplement "faire la gravité"? Le chemin sera naturellement courbé, en supposant que le projectile ne se dirige pas directement vers le centre de l'objet. – Robinson

+0

http://oreilly.com/catalog/9780596000066 –

Répondre

1

La trajectoire serait une section conique (ligne, hyperbole, parabole, ellipse ou cercle). Vous pouvez les représenter comme une courbe de Bézier rationnelle. http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/NURBS/RB-conics.html et http://www.cs.unc.edu/~dm/UNC/COMP236/papers/farin.pdf.

Si vous insistez sur l'utilisation des sections Bézier, je voudrais utiliser une fonction comme celui-ci http://www.netlib.org/minpack/lmder.f pour trouver des positions optimales des points de contrôle par la minimisation des moindres carrés.

Je pense que ce serait plus facile si vous calculiez simplement les sections coniques et les dessinez comme des boucles de lignes. Ou vous implémentez un intégrateur de verlet et résolvez les équations des mouvements.

Questions connexes