Autor Tema: Simulación de choques desde atrás.

0 Usuarios y 1 Visitante están viendo este tema.

17 Noviembre, 2024, 07:52 am
Leído 829 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Barriles aparecen desde la izquierda, moviéndose a la derecha. Quiero que en vez de poder ocupar el mismo espacio (es un mundo 2d, los barriles están acostados y se ve su parte circular, como si fuese una rueda) y que uno pase al otro como si nada, se choquen, y que el de atrás pierda velocidad ¿se detenga? y el otro gane ¿lo mismo que la otra perdió? Pregunto porque no sé cómo sería más realista.

El principal problema que tengo es quizá más bien de Programación, pero es por no saber Física. Se me ocurre algo así:
Se mueve el barril que está más a la izquierda.
luego el siguiente, y así sucesivamente hasta el más derecho.
Luego se va mirando desde la izquierda, a ver si quedó tocando a uno de delante, en cuyo caso el de atrás pierde velocidad y el de delante gana.
El problema es que a altas velocidades puede ocurrir algo así:
O sea, son 2 momentos distintos. En el 1ero, arriba, no se chocaron.
Abajo, se movieron, como indiqué, pero el de más izquierda se movía mucho más rápido que el del medio, que era más rápido que la derecha, así que quedaron tocándose los 3. Si en el programa pongo que I se detenga por tocar a M, y M se detenga por tocar a D, entonces I y M van a quedarse tocando y quietos, lo cual no es físicamente posible, sería que estén ocupando el mismo espacio.

¿Cómo lo hago bien?

17 Noviembre, 2024, 11:52 am
Respuesta #1

JCB

  • $$\Large \color{#c88359}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 660
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Hola a tod@s.

Si los choques no son elásticos, se debe introducir el coeficiente de restitución (indicador de la fracción que se conserva de la energía cinética). El comportamiento dependerá de este coeficiente, donde \( 0\ (\text{totalmente inelástico})\leq\ e\leq 1\ (\text{totalmente elástico}) \).

Supongamos que los 3 barriles tienen la misma masa \( m \), y que solo tiene movimiento inicial, el barril A (el situado más a la izquierda), con una velocidad \( v_{A0} \).

1er choque) Barril A contra barril B (el central). Haciendo cálculos, las velocidades después del choque, son

\( v_{A1}=\dfrac{(1-e)v_{A0}}{2} \)

\( v_{B1}=\dfrac{(1+e)v_{A0}}{2} \)

Considerando \( e>0 \), \( v_{B1}>v_{A1} \). Es decir, el barril B alcanza antes al barril C.

2º choque) Barril B contra barril C (el de más a la derecha). Haciendo los mismos cálculos que en el primer choque,

\( v_{B2}=\dfrac{(1-e^2)v_{A0}}{4} \)

\( v_{C2}=\dfrac{(1+e)^2v_{A0}}{4} \)

Si las velocidades son grandes y la distancia de separación entre los barriles es pequeña, la situación se complica porque los choques ya no serían de un solo barril contra otro.

Saludos cordiales,
JCB.
"Lo consiguieron porque no sabían que era imposible", autor: Jean Cocteau.

18 Noviembre, 2024, 05:18 pm
Respuesta #2

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
¿Cómo lo hago bien?

Hola, Veamos

1) para que dos cilindros se choquen deben tener velocidad de aproximación , es decir que hay diferencia de velocidad relativa , el que va delante tiene que tener menor velocidad que el de detras.

Así \( \Delta V=V_{tras}-V_{del}>0 \)

2) como cada cilindro tiene un radio R habrá impacto cuando los centros de cada cilindro este a una distancia menor de 2 Radios, (1 de cada cilindro)

\( D_{min}=X_{del}-X_{tras}\leq 2R \)

3) en cualquier impacto se conserva la cantidad de movimiento  \( m_1v_{cil1inicial}+m_2v_{cil2inicial}=m_1v_{cil1final}+m_2v_{cil2final} \) Ec 1

Si las masas de todos los barriles es la misma en toces se simplifican \( v_{cil1inicial}+v_{cil2inicial}=v_{cil1final}+v_{cil2final} \)

4) Como te anticiparon  hay distintos tipos de choques, elásticos e inelásticos ideales puros, o algo mas real que son los tiene un coeficiente de restitución , algo así como que se puede predecir que parte de la energía se pierde en cada impacto.
 si es inelástico puro e=0 los cilindro se unes y rodaran juntos
si es elástico puro e=1 los cilindro se separan con la misma velocidad relativa que la que se acercaron (de nuevo aclaro que es cierto si las masas son iguales), pues se conserva la energía cinética.
Si no es puro 0<e<1 entonces luego de varios choques la energía se va perdiendo , hasta que algun barril no logre alcanzar al su predecesor en un tiempo finito.

5) de los tres anteriores el modelo que mas se asemeja a lo que propones es el elástico.  como se conserva la energía cinética   sucede  \( \dfrac 12m_1v_{cil1inicial}^2+\dfrac 12m_2v_{cil2inicial}^2=\dfrac 12m_1v_{cil1final}^2+\dfrac 12m_2v_{cil2final}^2 \)
de nuevo si las masas son iguales se cumple  \( v_{cil1inicial}^2+v_{cil2inicial}^2=v_{cil1final}^2+v_{cil2final}^2 \)

si reemplazas la EC1 en esta ecuación llegarás a la conclusión de que

\( v_{cil1final}=v_{cil2 inicial} \)

\( v_{cil2final}=v_{cil1 inicial} \)

Es decir los barriles intercambian velocidades, recuerda que esto es ideal, en la práctica  no sucede nunca, pero se puede aproximar bastante con la elección de los materiales, en un programa de PC puedes representarlo perfectamente.

el que viene detrás alcanza al de delante, le da su velocidad y continúa con la velocidad que traía el de delante... y el de delante adquiere la velocidad del de atrás y se aleja hasta alcanzar el siguiente barril mas adelante y el proceso se repite.

Saludos.
Saludos  \(\mathbb {R}^3\)

19 Noviembre, 2024, 06:19 am
Respuesta #3

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Anduve viendo videos sobre los tipos de choque pero no entendí bien porque unos parecen decir que los objetos quedan pegados y otros que se pierde movimiento debido a deformaciones.

Deformados no es la idea, al menos por ahora. Que queden "pegados" o no, depende de las velocidades, no sé, no veo por qué sea un caso relevante. Pegados se refiere a que queden con la misma dirección y velocidad, no a que se fusionen o mezclen, claro.

¿No es algo que se observa luego del choque, y que puede preverse? Pero JCB, me lo planteas como si fuese una variable anterior al choque, que debe definirse y lo determina, no sé.

Supongamos que elijo que sean elásticos, es dec¡r que la velocidad en suma se conserve.

Entonces: Velocidad del barril A queda en 0, así de simple.
Y la velocidad del B: V*2/2*¿Aceleración?

Tal vez usamos diferentes conceptos... En el juego cada barril se mueve cierta cantidad de píxeles por frame, que es una medida del tiempo, esa cantidad de píxeles es lo que llamo velocidad, aceletación no hay.

Con la fórmula que me diste la velocidad del 2ndo parece haber quedado igual, *2/2, no cambió, yo elegí que e sea 1 ¿está mal? Ah, porque decís que B no se está movimiento... ¡pero puede ser que sí!

No entiendo qué quieres decir con esto:
Citar
Considerando \( e>0 \), \( v_{B1}>v_{A1} \). Es decir, el barril B alcanza antes al barril C.

Luego pones que la velocidad de B será, bue, supongo que \( A_0 \) es velocidad inicial de A, no sé. Eso/4.

Y la velocidad de C, 4*V/4.

Básicamente uno le transmite la velocidad al otro, y él queda en 0.

Pero eso no me resuelve el problema...

19 Noviembre, 2024, 04:25 pm
Respuesta #4

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Luego sigo leyendo, sólo comento que avancé en el código, pero se notan los problemas en la izquierda a medida que avanza, pero el juego se volvió más aburrido, es como que sólo se mueve un barril a la vez :/
¿Así es realista o hice algo mal?


Código: [Seleccionar]
function MoveBarriles () {
// Empieza desde 2 porque el 1 no existe, porque cada objeto tiene una "profundidad" que determina cual aparece delante/atrás y se basa en el número del barril, para más facilidad, pero el número 1 está reservado para el personaje.
Moved = 1;
do {
Moved++;
// I es un objeto donde van las imágenes, es útil para eliminarlas todas a la vez, por ejemplo.
BarrilaMover = "I.Barril"+Moved;
BarrilSpeed = BarrilaMover+"Speed";
EvaluedBarrilSpeed = eval(BarrilSpeed);
// Aplicar rozamiento:
if (EvaluedBarrilSpeed > 0) {
EvaluedBarrilSpeed = EvaluedBarrilSpeed/1.0025;
if (EvaluedBarrilSpeed < 0.05) {
EvaluedBarrilSpeed = 0;
}
set(BarrilSpeed, EvaluedBarrilSpeed);
}
setProperty (BarrilaMover, _x, getProperty(BarrilaMover, _x)+EvaluedBarrilSpeed);
// Resumen:
Res = BarrilaMover+".Part";
// El barril no se gira sino que se gira una parte suya, porque como no es redondo no se ve bien cuando se gira. Lo copié de un juego y lo quiero así a pesar de sus defectos.
setProperty (Res, _rotation, getProperty(Res, _rotation)+EvaluedBarrilSpeed*2);
// Si tocan al personaje y él se está moviendo:
if (I.Player.hitTest(eval(BarrilaMover)) == true && I.Player.Action == "Walking") {
// Game over:
gotoAndStop (3);
break;
} else {
// Ver si tocó al barril anterior, que está delante:
BarrilAnterior = "I.Barril"+(Moved-1);
if (eval(BarrilaMover).hitTest(eval(BarrilAnterior)) == true) {
// Pasarle la velocidad:
set(BarrilAnterior+"Speed", eval(BarrilAnterior+"Speed")+EvaluedBarrilSpeed);
// Quedar sin velocidad:
set(BarrilSpeed, 0);
}
}
} while (Moved<Barriles);
}

Si hay algo del código que no entiendan pueden preguntar.

19 Noviembre, 2024, 05:49 pm
Respuesta #5

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada

Lo veo bastante realista

Si el barril a la derecha esta detenido, y el choque con el de la izquierda es elástico, entonces el de la derecha avanza con la velocidad que traía el de la izquierda y el de la izquierda se detiene. Es simple siempre intercambian sus velocidades si sus masas son exactamente iguales.


Saludos
Saludos  \(\mathbb {R}^3\)

21 Noviembre, 2024, 02:28 am
Respuesta #6

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Ok, pero algo tendré que cambiarle porque no me gusta  :(