Sí, a eso me refería, y mejor, porque eso lo podría complicar bastante.
Pero son 3 velocidades a calcular...
Cuando escribí esto:
en realidad es un problema de sólo 2 dimensiones. Por lo tanto, para calcular la parábola solo hay que usar los ejes (x, y). La forma de visualizar la curva que forma la pelota es esta:
Me refería a que para calcular el ángulo inicial de v para la parábola, sólo se usan 2 dimensiones: la altura y la distancia "hacia adelante". Esta última tú la ves como 2 dimensiones (y como una diagonal en tu dibujo) porque la perspectiva es aérea, pero no tendría que ser forzosamente así. Una buena forma de visualizar esto es imaginar que observamos el tiro desde una perspectiva lateral donde el eje horizontal es paralelo a la trayectoria que seguirá la pelota. Se ve mejor en esta imagen:
Si estuviéramos donde está el círculo amarillo de esa imagen, y
a ras de suelo, veríamos lo que te puse en la imagen de mi mensaje anterior, que
es la que debes tener en mente todo el tiempo que hablemos de la parábola. Desde ahí sólo tenemos 2 dimensiones, ya que la pelota ni se acerca ni se aleja de nosotros. Los cálculos que se hagan son igualmente válidos. Ese cambio de perspectiva, por así decirlo, es lo que se consigue al hacer esto que te había escrito:
Para resolver tu problema, y hacerlo en 2D, primero debes calcular la distancia total (que llamaremos x) hasta el punto destino:
x = raiz(DistanciahastaDestinoX2 + DistanciahastaDestinoY2)
Nota que estamos combinando DistanciahastaDestinoX y DistanciahastaDestinoX en una sola dimensión, que llamamos x, para hacer los cálculos de la parábola. Naturalmente, luego habrá que reconvertir a 3D para mostrar en pantalla. No lo especifiqué porque no tenía idea de qué tanto conoces de estos temas, pero básicamente lo que se hace es revertir la combinación. Más adelante te digo cómo.
Para evitar confusiones, siempre que mencione x o y, me estaré refiriendo a estos ejes desde la perspectiva lateral del dibujo de mi mensaje anterior. Y cuando quiera hacer referencia a la toma aérea (llamémosla coordenadas de pantalla), usaré tus variables BallX, BallY, etc. Si ves el dibujo de la toma lateral, verás que x se refiere a la trayectoria de la pelota (que en coordenadas de pantalla puede ser diagonal, pero desde nuestra perspectiva siempre es de izquierda a derecha simplemente), mientras que y es la altura, que se correspondería con BallZ.
¿Me puedes dar más info?
Si te refieres a la fuerza, es sólo por ser quisquilloso. Lo que pasa es que en física la fuerza es algo muy concreto que no se mide en distancia por segundo sino en newtons y se refiere a cuánta aceleración le puedes imprimir a un cuerpo de acuerdo con su masa, por lo que no se traduce directamente en velocidad. Solamente sería útil si quisieras una simulación ultra realista, que tome en cuenta la masa de la pelota, quizás resistencia del viento, etc., pero para algo como un juego sencillo sólo complicaría las cosas innecesariamente. Como dije es perfectamente válido llamarla fuerza en tu juego, pero si buscas información en internet o libros, el término que encontrarás es velocidad inicial.
¿Tampoco en caso de que se dedique el 100% a una velocidad sola?
En ese caso sí, pero es más bien por coincidencia. Como te comenté, la forma en que se distribuye la velocidad es: v0 = raiz(vx
2 + vy
2). Si la velocidad es totalmente vertical, la horizontal será cero (y viceversa), luego v0 = raiz(vy
2 + 0), así que v0 = vy, pero sólo para este caso.
Más o menos, en el sentido de que va ejerciendo una aceleración hacia abajo a lo largo del tiempo. En la realidad es más o menos como el método que te pongo (salvo que simplificamos obviando resistencia del viento, masa, etc.). De hecho, las ecuaciones de parábola que uso son justo las que encontrarías en un libro de física.
No me di cuenta de especificarlo: Sí, puede variar.
Entonces hay que hacer algunos cambios, ya que la fórmula del rango R es para cuando la altura inicial y final son iguales. También se hacía esa suposición en la ecuación de la parábola para y, que ahora quedaría así (otra vez, en negrita lo que realmente necesitas calcular en el programa):
y = h + v0 * sen(θ) * t - (g * t
2)/2
donde h es la altura inicial de la pelota.
La distancia en línea recta, x, entre la pelota y el objetivo se sigue calculando igual:
x = raiz(DistanciahastaDestinoX2 + DistanciahastaDestinoY2)El cálculo del ángulo se complica, pero sólo un poco. Queremos el valor de θ que permite que cuando la bola caiga (cuando y = 0) haya recorrido la distancia x deseada, así que la ecuación para y queda:
h + v0 * sen(θ) * t - (g * t
2)/2 = 0
Pero como no conocemos t, necesitamos usar la otra ecuación que puse en el otro mensaje:
t = x/(v0 * cos(θ))Sustituimos t por esto en la ecuación para y:
h + v0 * sen(θ) * x/(v0 * cos(θ)) - (g * (x/(v0 * cos(θ)))
2)/2 = 0
Si la manipulamos un poco usando las propiedades de las funciones trigonométricas, la podemos convertir en una ecuación de segundo grado que se puede resolver con la fórmula general, y que al final reducimos a esto:
θ = arctan((v0
2 ± raiz(v0
4 - (g * (g*x
2 - 2*v0
2*h))))/(g*x))
Como toda ecuación cuadrática puede tener 2 soluciones, por lo que es posible que haya 2 ángulos válidos.
Aquí conviene primero calcular el valor del que se saca la raíz:
disc = v04 - (g * (g*x2 - 2*v02*h))Si disc (que es equivalente al discriminante típico de la ecuación cuadrática) es negativo, significa que no tienes la "fuerza" necesaria para el tiro. Si es cero, las 2 soluciones son idénticas, así que sólo hay un ángulo. En caso contrario, hay dos ángulos distintos. Procedes a calcularlo(s):
θ1 = arctan((v02 + raiz(disc))/(g*x))
θ2 = arctan((v02 - raiz(disc))/(g*x))Lo que seguiría es verificar, para cada ángulo, si pasa la red. Esto no cambia, y se sigue haciendo como en el mensaje anterior. Si sólo uno de los 2 ángulos lo consigue (o sólo había un ángulo), es el que hay que usar. Si los dos lo hacen, toca elegir el que quieras. Si lo que buscas es el que permita mayor velocidad hacia adelante (y menor altura), escoge el menor de θ1 y θ2.
Finalmente, para poder ir mostrando en pantalla la trayectoria, toca convertir las velocidades a 3D. BallZSpeed es la más simple (recuerda que en el mensaje anterior se calcularon vx y vy):
BallZSpeed = vy
aunque con este método no la necesitarías, ya que lo ideal sería calcular directamente la posición BallZ con la misma ecuación de la parábola:
BallZ = h + v0 * sen(θ) * t - (g * t2)/2de nuevo, h es el valor original de BallZ al momento del tiro, y en t pones el número de segundos transcurridos.
Para las otras dos, hay que hacer unos cálculos. De la misma forma que nuestra x combina DistanciahastaDestinoX con DistanciahastaDestinoY, vx combina BallXSpeed con BallYZSpeed. Para separarlas hay que conocer el ángulo de inclinación del trayecto de la bola visto desde arriba. Primero, hay que considerar el caso especial para cuando el destino está en línea totalmente vertical: eso significaría que toda la velocidad se aplicó en una sola dirección:
si (DistanciahastaDestinoX == 0)
BallYSpeed = vx
BallXSpeed = 0
en caso contrario, primero calculas la pendiente m de la trayectoria (vista desde perspectiva aérea/de pantalla):
m = DistanciahastaDestinoY/DistanciahastaDestinoX luego su ángulo α:
α = arctan(m)y con eso obtienes:
BallXSpeed = vx * cos(α)
BallYSpeed = vx * sen(α)Sí, es vx en ambos casos, porque contiene las 2 velocidades combinadas.
Es la idea, aunque aún no la apliqué. Por las dudas: Esa distancia la calculo usando sólo la distancia Y. No sé si así sirve.
No. Eso sólo te serviría si el tiro es exactamente en línea recta vertical (en coordenadas de pantalla/vista aérea), pero cuando es en diagonal esa distancia cambia, y además depende del punto de la red por el que la pelota pase.Como te había dicho, lo que se hace es calcular la intersección de la recta que define la red con la del trayecto de la pelota. Hay más de un método para la intersección; no sé si los conozcas.
Antes de intentar aplicar tu método decime qué piensas de esto (me lo dijeron hace tiempo o le agregué Z basado en lo que me habían dicho):
¿Es el método que usas en tu juego? No está mal, salvo que, como dices, no toma en cuenta la gravedad, y si después la aplicas, descompones totalmente los cálculos. Además ese método hace que la pelota baje desde el primer momento, cuando para ciertos ángulos, primero debería elevarse. Así y todo se ve aceptable, pero no sé si podrías meterle la gravedad de forma convincente ni qué tan complicado sería.