2011-06-06 20 views
10

Estoy tratando de manipular un objeto. Cuando se acerca a otro objeto, digamos un globo terráqueo, quiero que el globo tenga una atracción gravitacional sobre el objeto original. Sé que se supone que debo usar CCBezierTo, así que esto no es tanto una cuestión de programación como una cuestión matemática.Cocos2D curva de Bezier alrededor del objeto como por gravedad

Matemáticamente, cómo podría deducir los tres puntos de la curva bezier (1, 2 y final) y darle un peso según su distancia (más lejos = menos tirón). Ya tengo la distancia mapeada en una variable.

Piensa en una nave espacial tirando de una honda alrededor de la luna.

Código:

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

¿Por qué no simplemente aplica un vector de fuerza al proyectil proporcional al cuadrado de la distancia al objeto? es decir, ¿por qué no simplemente "hacer la gravedad"? El camino será naturalmente curvado, suponiendo que el proyectil no se dirige directamente hacia el centro del objeto. – Robinson

+0

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

Respuesta

1

La trayectoria sería una sección cónica (línea, hipérbola, parábola, elipse o círculo).

Puede representarlos como una curva de Bezier racional. http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/NURBS/RB-conics.html y http://www.cs.unc.edu/~dm/UNC/COMP236/papers/farin.pdf.

Si usted insiste en el uso de secciones de Bézier cuadráticas, me gustaría utilizar una función como esta http://www.netlib.org/minpack/lmder.f para encontrar posiciones óptimas de los puntos de control por mínimos cuadrados de minimización.

Creo que sería más fácil si solo calcula las secciones cónicas y las dibuja como bucles de línea.

O implementa un integrador de verlet y resuelve las ecuaciones de los movimientos.

Cuestiones relacionadas