Una pelota golpea la esquina, ¿dónde se desviará?

46

Necesito repasar mi trigonometría y espero que puedan ayudar aquí con un modelo matemático simple. Aquí está mi modelo hasta ahora en la imagen adjunta. Soy consciente de que la animación de cuadros tiene otros problemas cuando la pelota se mueve muy rápido, pero por ahora solo necesito calcular ballDx y ballDy. También es posible que ballDx = 0 (solo movimiento vertical), pero cuando la bola se desvía, ballDx puede obtener un valor diferente.

Colisión 2D entre la bola y el borde de la esquina de un objeto sólido inamovible

Lumis
fuente
22
¿Es esto lo que llaman un "caso de esquina"?
Andrew Grimm
2
Definitivamente, a medida que avanzan las cosas, pronto podemos emplear la teoría de la relatividad para resolverlo: el problema es obtener masa (ive).
Lumis

Respuestas:

45

Nota: Todo lo siguiente supone que la superficie de la pelota no tiene fricción (por lo que no comenzará a girar o rebotar de manera diferente porque sí lo es).

En el momento de la colisión, la pelota estará tocando la esquina. Cuando los objetos sólidos colisionan, una fuerza actuará a lo largo de la llamada superficie normal, es decir, perpendicular a la superficie en el punto de colisión.

Como es una pelota, perpendicular a la superficie es hacia el centro de la pelota. Ok, entonces sabemos la dirección de la fuerza, ¿qué pasa con su magnitud? Suponiendo una colisión elástica (y que el rectángulo no puede moverse), la pelota debe rebotar a la misma velocidad con la que impactó.

Sea (nDx, nDy) la velocidad después de la colisión, (oDx, oDy) la velocidad antes de la colisión y (x, y) la posición de la pelota en el punto de colisión. Supongamos además que la esquina con la que colisiona la pelota está en (0,0).

Expresando nuestras ideas como fórmulas, tenemos:

(nDx, nDy) = (oDx, oDy) + c * (x, y)
length (nDx, nDy) = length (oDx, oDy)

Lo que es equivalente a:

nDx = oDx + c * x
nDy = oDy + c * y
nDx^2 + nDy^2 = oDx^2 + oDy^2

Sustituyendo las dos primeras ecuaciones en la última, obtenemos:

(oDx + c * x)^2 + (oDy + c * y)^2 = oDx^2 + oDy^2

Expansión utilizando el teorema binomial

(a+b)^2 = a^2 + 2ab + b^2 

rendimientos:

oDx^2 + 2 * oDx * c * x + (c * x) ^ 2 + oDy^2 + 2 * oDy * c * y + (c * y) ^ 2 = oDx^2 + oDy^2
2 * oDx * c * x + 2 * oDy * c * y + (c * x) ^ 2 + (c * y) ^ 2 = 0
(2 * oDx * x + 2 * oDy * y) * c + (x^2 + y^2) * c^2 = 0

Esta ecuación cuadrática para ctiene dos soluciones, una de las cuales es 0. Obviamente, esa no es la solución que nos interesa, ya que generalmente la dirección de la pelota cambiará como resultado de la colisión. Para obtener la otra solución, dividimos ambos lados entre c y obtenemos:

(2 * oDx * x + 2 * oDy * y) + (x^2 + y^2) * c = 0

Es decir:

 c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)

Para resumir, tenemos:

c = -(2 * oDx * x + 2 * oDy * y) / (x^2 + y^2)
nDx = oDx + c * x
nDy = oDy + c * y

Editar : en el código:

if (collision) {
    float x = ballX - cornerX;
    float y = ballY - cornerY;
    float c = -2 * (ballDx * x + ballDy * y) / (x * x + y * y);
    ballDx = ballDx + c * x;
    ballDy = ballDy + c * y;
}

Algunas consideraciones de implementación: si bien puede aproximarse (x, y) con la posición de la pelota después del paso de simulación, esta aproximación cambiará el ángulo de desviación y, por lo tanto, será muy notable, por lo que sus pasos de simulación deben ser muy finos (tal vez la pelota no se mueve más de 1/20 de su diámetro por paso). Para una solución más precisa, puede calcular el momento en que ocurre la colisión y dividir ese paso de simulación en ese momento, es decir, hacer un paso parcial hasta el punto de colisión, y otro paso parcial para el resto del paso.

Edición 2: Calcular el punto de impacto

Sea r el radio, (x0, y0) la posición y (dx, dy) la velocidad de la pelota al comienzo del paso de simulación. Para simplificar, supongamos que la esquina en cuestión se encuentra en (0,0).

Sabemos:

(x,y) = (x0, y0) + (dx, dy) * t

Queremos

length(x,y) = r

Es decir

(x0 + dx * t) ^ 2 + (y0 + dy * t) ^ 2 = r^2
x0^2 + 2 * x0 * dx * t + dx^2 * t^2 + y0^2 + 2 * y0 * dy * t + dy^2 * t^2 = r ^ 2
(dx^2 + dy^2) * t^2 + (2 * x0 * dx + 2 * y0 * dy) * t + (x0^2 + y0^2 - r^2) = 0
\____  _____/         \____________  ___________/       \_______  ________/
     \/                            \/                           \/
     a                             b                            c

Esa es una ecuación cuadrática en t. Si es discriminante

D = b^2 - 4 * a * c

es negativo, no tiene soluciones, es decir, la pelota nunca golpeará la esquina en su curso actual. De lo contrario, sus dos soluciones están dadas por

t1 = (-b - sqrt(D)) / (2 * a)
t2 = (-b + sqrt(D)) / (2 * a)

Estamos interesados ​​en el momento en que comenzó la colisión, que es el momento anterior t1.

Tu método se convertiría en:

    // compute a,b,c and D as given above

    if (D >= 0) {
        t = (-b - sqrt(D)) / (2 * a);
        if (0 < t && t <= ts) {
            // collision during this timestep!

            x = x + t * dx;
            y = y + t * dy;
            ts = ts - t;

            // change dx and dy using the deflection formula 
        }
    }

    x = x + ts * dx;
    y = y + ts * dy;
meriton - en huelga
fuente
1
esto merece +1
dinámico
1
Siéntase libre de votar, entonces :-)
meriton - en huelga el
3
Dices eso muy temprano, At the moment of collision, the ball will be touching the cornerpero no veo una justificación de esta aproximación (y debe ser una aproximación porque no es cierto: la pelota se toca en dos lugares, ninguno de los cuales es la esquina).
Peter Taylor
1
@Peter Taylor: ¿Notó que el OP ha sacado la bola fuera del rectángulo, y la fórmula de detección de colisión dada en la pregunta también asume esto? Tienes que pensar fuera de la caja aquí :-)
meriton - en huelga
1
Me encanta esta respuesta, pero podría usar un marcado $ \ LaTeX $ de las matemáticas.
Martin Wickman el
13

Aquí hay una forma visual de ver un problema.

El conjunto de problemas original es círculo versus rectángulo (gris en la imagen a continuación). Esto es equivalente a punto vs. rectángulo redondeado (se muestra en negro).

Entonces este es un problema de varias partes. Está probando su colisión de puntos frente a 4 líneas (extruidas desde el borde de la caja por el radio del círculo original) y 4 círculos (en las esquinas del rectángulo con el mismo radio del círculo original).

Con la velocidad aproximada en su imagen original, el punto alcanzará el círculo de la esquina inferior derecha. Todo lo que tiene que hacer es calcular el punto en el círculo de la esquina que golpearía, calcular el ángulo de ese ángulo y reflejarlo.

ingrese la descripción de la imagen aquí

Dejaré la derivación de eso como un ejercicio para el lector.

Tétrada
fuente
2

Estoy trabajando en un juego y también atascado aquí. Pero supongo que va de esta manera:

ingrese la descripción de la imagen aquí

Hay otra opinión. Mi problema es que no sé cómo calcular rápidamente el nuevo dx, dy (para mí, usar las matemáticas tradicionales requiere demasiados cálculos).

Risa
fuente
Mi punto de vista es diferente al del segundo enlace, porque no creo que el nuevo vector de velocidad dependa así del centro del bloque. Mi hermano me dijo que la pelota volverá a la dirección anterior (dx = -dx && dy = - dy) pero no lo creo.
Risa
Si la bola golpea la esquina y la distancia de la bola X desde la esquina X es menor que 1/4 de la bola W, entonces rebotará hacia atrás, de lo contrario se desviará hacia la derecha. Este es un modelo simple que estoy usando en este momento, que no está ajustado para encontrar el ángulo exacto.
Lumis
0

La cinemática se trata de elegir el marco de referencia correcto, como el más conveniente para los cálculos.

Aquí definiremos primero la transformación T que resuelve nuestros ejes en componentes paralelos ( x ' ) y perpendiculares ( y' ) a una línea entre el centro de la pelota y la esquina. La transformación inversa T * restaurará nuestro sistema de coordenadas original.

En este nuevo marco de referencia, por reflexión (y la simetría del tiempo y el espacio de la física), tenemos la transformación de la velocidad del contacto M (un impulso puntual ) como la que invierte el componente x ' y deja sin cambios el componente y' . En términos de matriz , esta es la matriz diagonal con -1 y 1 en la diagonal.

Entonces la velocidad después de la colisión es simplemente: V ' = T * . M . T . Vo .

El momento del impacto t es entonces la solución para ( T . Do ) + ( X . T . Vo ) ( t ) = r , donde X es el operador de proyección del eje X y r es el radio de la bola. Reorganizado, obtenemos
t = ( r - ( T . Do )) / (( X . T . Vo ) ( t ))

Esto tiene la clara ventaja de enterrar todas las matemáticas complejas en bibliotecas de gráficos estándar rigurosamente escritas, probadas y depuradas. Esta solución también es idéntica para situaciones 2D y 3D: simplemente cambie la biblioteca de gráficos. Finalmente, destaca que uno debe pensar primero en los marcos de referencia apropiados antes de abordar cualquier problema de física. Siempre existe la tentación de los NIH, pero en realidad eso es solo una receta para errores cuando hay soluciones más concisas disponibles.

Pieter Geerkens
fuente