Cómo hacer que el objeto pierda menos velocidad a medida que aumenta su velocidad

11

Estoy desarrollando un juego en Flash y necesito un poco de ayuda. Se puede considerar un problema matemático.

Mi objeto está volando a gran velocidad Xy mi objeto puede chocar con piedras. Cuando choca con una piedra, necesito mi objeto para romper la piedra y continuar, pero con menos velocidad. Es fácil codificarlo y escribir algo como: myVelocity -= 10;pero mi problema principal es que quiero que pierda menos velocidad cuanto mayor sea la velocidad inicial.

Por ejemplo: si la velocidad es 300, quiero que pierda 10 y si fuera 200, quiero que pierda 20.

¿Se puede hacer esto con algún tipo de fórmula?

Afra
fuente
1
¿Qué tal algo simple como log(myVelocity + 1) * N?
Jonathan Connell

Respuestas:

6

Invertiría la velocidad y la multiplicaría por algo que te guste:

float velocity = 300.0f;
float collisionEffect = 3000.0f / velocity;
if (collisionEffect > velocity)
{
    // Choose which one you like: with or without restitution

    // No restitution
    collisionEffect = velocity;

    // Restitution
    collisionEffect = velocity + (collisionEffect - velocity) * 0.3f;
}
velocity -= collisionEffect;

Este ejemplo da estos efectos:

400 loses 7.5
300 loses 10
200 loses 15
100 loses 30
 50 loses 50  // Using no restitution
 50 loses 53  // Using restitution
 20 loses 20  // Using no restitution
 20 loses 59  // Using restitution
Martijn Courteaux
fuente
¿Qué es la "restitución"?
jprete
La restitución está rebotando. Lo cual es realista.
Martijn Courteaux el
30

los sistemas que usted y otros describen no generarán una física de aspecto real. la fórmula principal es disminuir 0.5 * m * v ^ 2 (energía cinemática) en un valor constante cada vez que el objeto golpea en alguna parte.

así que si un objeto con un peso de 2 kg golpea algún bloque, que necesita 16j de energía antes de romperse: la velocidad de movimiento del objeto cambiará de acuerdo con esta tabla:

4  m/s -> the block will not break
5  m/s -> 3   m/s
6  m/s -> 4.4 m/s
7  m/s -> 5.7 m/s
8  m/s -> 6.9 m/s
9  m/s -> 8   m/s
10 m/s -> 9.1 m/s
Ali1S232
fuente
77
Esto debe aceptarse: es correcto, realista, fácil de implementar y manejará todos los casos de objetos y bloqueará la masa y la velocidad.
Tesserex
3
A menos que tenga un efecto específico de 'física de dibujos animados' que espera lograr, usar un sistema más realista es casi siempre una buena idea; Hay algunas maneras mejores de asegurarse de que no obtendrá casos potencialmente innovadores.
Steven Stadnicki
1
Esta respuesta fue buena, lo sé. Pero mi juego se desarrolla en un mundo de dibujos animados y no necesita ser realista. Debería haber sido más específico al hacer la pregunta.
Afra
1
Este es un proyecto comunitario, la gente estaba aquí para responder la pregunta y para la pregunta formulada, esta es la mejor respuesta. El hecho de que prefiera la solución hacky para su caso particular no significa que esta respuesta no sea la mejor. Al seleccionar la respuesta hacky como la solución, cuando alguien más busca en el sitio la respuesta a este tipo de pregunta, asumirá que la respuesta no realista es la mejor.
Richard Fabian el
1
@Richard La otra solución no es hacky simplemente porque no usa física realista, ¿es Tetris hacky porque los bloques no caen suavemente? Si las personas suponen que una respuesta aceptada es la "mejor" en lugar de asumir que es la respuesta que satisface al autor de la pregunta, es su culpa. Todas las respuestas y votos aún son evidentes.
CiscoIPPhone
2

Realmente no ha proporcionado suficiente información para saber qué tipo de rango desea, es decir, si está limitado, si desea progresión geométrica, etc.

Lo primero que debe hacer es obtener un número proporcional a la cantidad de velocidad que desea perder (no tiene que ser igual, pero debe disminuir a medida que aumenta la velocidad para que sea proporcional a su pérdida). La forma estándar de hacerlo es tomar el recíproco :

temp = 1 / currentVelocity;

Ahora, para 100 tendrá 0.01, para 200 tendrá 0.005, para 300 tendrá 0.0033 y así sucesivamente.

Ahora solo necesita ajustar ese número a lo que realmente quiera, multiplicándolo. Entonces

k = 3000;
newVelocity = temp * k;

le dará 20 por 300, pero le dará 15 por 200 en lugar de 10. Esto puede estar bien para usted, en ese caso no necesita leer más. Puede ajustar k como desee, pero es posible que no obtenga los números de la manera que lo desee a menos que haga un poco más, como implementar la progresión geométrica o cambiar la base para aumentar. No voy a entrar en progresiones geométricas aquí, pero si quieres cambiar la base, hazlo de la siguiente manera:

base = 100;
temp = 1 / (currentVelocity - base);
if (temp < 0) temp = 0; //adjust temp so never less than zero, cannot gain force!

k = 2000;
velocityLoss= temp * k;
if (velocityLoss > currentVelocity) //(1) or make currentVelocity an unsigned int
    velocityLoss = currentVelocity; //(2)

Esto le proporcionará el rango que solicitó originalmente en su pregunta, 300 -> pérdida de 10, 200 -> pérdida de 20. FYI 100 -> pérdida de 40 y 50 -> pérdida de 80 (!) Lo que significa que necesitaría restringir su resta, que es lo que hice en las líneas (1) y (2).

Hay otras formas de abordar este problema, por supuesto, que estoy seguro de que los más expertos matemáticamente que yo publicaremos aquí.

Ingeniero
fuente
0

Creo que puedes usar la división simple por velocidad. Por ejemplo: perdido = 3 000 / myVelocity. Cuando la velocidad es 300, perderá 10, cuando sea 200, perderá 15. Depende de usted elegir las constantes correctas.

Si lo desea, puede usar fórmulas más complejas, como: constante / (constante2 * velocidad ^ 2 + constante3 * velocidad). Una vez más, solo elija constantes, que se adaptarán a usted.

zacharmarz
fuente
está completamente invertido de lo que pidió y de lo que sucede en la física real.
Ali1S232
No te entiendo ¿Qué se invierte?
zacharmarz
Supongo que no entendí tu respuesta, mi mal.
Ali1S232