Consigue puntos en una línea entre dos puntos

9

Estoy haciendo un juego espacial simple en JavaScript, pero ahora me he topado con un muro con respecto a los vectores.

La vista del juego es de arriba hacia abajo en una cuadrícula 2D. Cuando el usuario hace clic en la cuadrícula, la nave espacial volará a ese lugar.

Entonces, si tengo dos conjuntos de puntos:

{ x : 100.2, y : 100.6 }; // the ship
{ x : 20.5,  y : 55.95 }; // the clicked coordinates

Si el bucle del juego funciona a 60 iteraciones por segundo, y la velocidad deseada del barco es de 0.05 puntos por tic (3 puntos por segundo), ¿cómo calculo el nuevo conjunto de coordenadas para el barco para cada tic del bucle del juego?

ps No quiero tener en cuenta la inercia o los múltiples vectores que afectan a la nave, solo quiero que la nave se detenga, haga lo que esté haciendo (es decir, vuele en una dirección) y se mueva a las coordenadas cliqueadas a una velocidad estática.

Stephen
fuente

Respuestas:

8

En pseudocódigo:

speed_per_tick = 0.05
delta_x = x_goal - x_current
delta_y = y_goal - y_current
goal_dist = sqrt( (delta_x * delta_x) + (delta_y * delta_y) )
if (dist > speed_per_tick)
{
    ratio = speed_per_tick / goal_dist
    x_move = ratio * delta_x  
    y_move = ratio * delta_y
    new_x_pos = x_move + x_current  
    new_y_pos = y_move + y_current
}
else
{
    new_x_pos = x_goal 
    new_y_pos = y_goal
}
Tristan
fuente
@Tristan: ¿Quieres decir goal_disten tu ifcondición?
Nate W.
21

LERP - Interpolación lineal

Di esta respuesta para un problema similar hace unos días, pero aquí vamos:

La interpolación lineal es una función que le da un número entre dos números, según el progreso. En realidad, podrías obtener un punto entre dos puntos.


La gran fórmula: cómo calcularla

La fórmula general de LERP viene dada por pu = p0 + (p1 - p0) * u. Dónde:

  • pu: el número de resultado
  • p0: el número inicial
  • p1: el número final
  • u: El progreso. Se da en porcentaje, entre 0 y 1.

Cómo obtener porcentaje

Quizás se pregunte, "¿Cómo puedo obtener este porcentaje?". No te preocupes Es así: ¿Cuánto tiempo tomará el punto para viajar para que el vector de inicio termine? Ok, divídalo por el tiempo que ya pasó. Esto te dará el porcentaje.

Mira, algo como esto: percentage = currentTime / finalTime;


Vectores calculadores

Para obtener un vector resultante, todo lo que necesita hacer es aplicar la fórmula dos veces, una para el componente X y otra para el componente Y. Algo como esto:

point.x = start.x + (final.x - start.x) * progress;
point.y = start.y + (final.y - start.y) * progress;

Calcular tiempo variable

Es posible que desee tener sus puntos para viajar a una velocidad de 0.5 puntos, ¿sí? Entonces, digamos, se viajará una distancia más larga en un tiempo más largo.

Puedes hacerlo de la siguiente manera:

  • Obtenga la longitud de la distancia Para ello, necesitará dos cosas. Obtenga el vector de distancia, luego transfórmelo en un valor de longitud.

    distancevec = final - start;
    distance = distancevec.length();

Espero que sepas vectores de matemáticas. Si no lo hace, puede calcular la longitud de un vector con esta fórmula d = sqrt(pow(v.x, 2) + pow(v.y, 2));.

  • Obtenga el tiempo que tomará y actualice la hora final. Este es fácil. Como desea que en cada tic se obtenga una longitud de 0.5, solo tenemos que dividir y obtener cuántos ticks tenemos.

    finalTime = distance / 0.5f;

Hecho.

AVISO: Quizás, esta no sea la velocidad prevista para usted, pero esta es la correcta. entonces tienes un movimiento lineal, incluso en movimientos diagonales. Si desea hacer x + = 0.5f, y + = 0.5f, entonces lea un libro de matemáticas de vectores y vuelva a verificar sus planes.

Gustavo Maciel
fuente
¿Qué sucede si desea que le quede% al destino desde su posición? SI no puede usar el tiempo delta sino más bien las coordenadas x: y.
Dave
Si calculó progresscomo se indica en esta respuesta, debe estar en el 0..1rango. Just do:progressLeft = 1.0 - progress;
Gustavo Maciel
3

Esto se puede hacer calculando la normalidad de la dirección y luego calculando la posición actual a través de la ecuación paramétrica

newPoint = startPoint + directionVector * velocity * t

Donde t es el tiempo transcurrido desde que el barco comenzó a viajar en la dirección deseada. También puede realizar esto por actualización a través de

newPoint = currentPoint + directionVector * velocity * timeDelta

Y solo calcula esto en cada cuadro / física / etc. actualizar hasta que el barco llegue a su destino.

hatboyzero
fuente