¿Cómo calculo la rotación causada por la fricción de rebote?

15

Siguiendo con mi pregunta anterior : tengo la pelota rebotando de manera bastante realista desde las superficies que golpea. Ahora me gustaría hacerlo girar por la fricción del golpe .

Mostrar esto es bastante simple: giro la pelota por su velocidad angular cada tic y aplico la misma rotación cuando se procesa.

Cuando una pelota golpea una pared, sé que la velocidad de rotación se ve afectada por ...

  • la velocidad inicial de la pelota cuando golpea la superficie
  • Los coeficientes de fricción de la bola y la superficie (constantes físicas)
  • El ángulo de incidencia (el ángulo entre el vector de velocidad entrante de la pelota y la superficie normal).

El ángulo de incidencia se aproxima por el producto de punto de los vectores de velocidad de impacto y salida de la pelota. (1 significa giro alto, -1 significa no girar, y todo lo demás relativamente en el medio)

Multiplicando todo lo anterior y asegurándose de que luego se transformaron al rango 0-1, y se multiplicaron por la velocidad máxima de rotación, la pelota pareció responder en la velocidad de rotación como se esperaba. Excepto por una cosa: siempre rotaría en sentido horario (debido a valores positivos).


¿Es este un buen método? ¿Se te ocurre una manera más simple?

Si este método parece estar bien, ¿qué me estoy perdiendo? ¿Cómo sé cuándo la bola debe girar en sentido antihorario?

codemonkey
fuente

Respuestas:

2

Tu método es bueno, porque es muy simple. Una cosa que puede necesitar es la dependencia del giro anterior de la pelota, que no tiene en cuenta. La bola giratoria representa la energía rotacional, por lo que una simulación realista probablemente debería conservarla junto con las otras energías.

Sin embargo, si la bola no gira al impactar, no puedo imaginar una situación en la que comience a girar en la dirección del ángulo incidente. Es decir, "en sentido horario" o "en sentido antihorario" debe ser relativo a cualquier lado de la normalidad del ángulo incidente.

Creo que simplemente multiplicando el resultado por el vector de dirección x original (+1 si viaja de izquierda a derecha, -1 si viaja de derecha a izquierda) debería hacerlo.

Editar: puede usar el producto cruzado para esto. Incident cross normalproporciona un vector solo en la dirección Z (si estamos en el plano 2D xy). Mire el elemento z: si es positivo, el enfoque de la pelota debería hacer que gire en el sentido de las agujas del reloj. Si es negativo, la pelota debe girar en sentido antihorario.

eli
fuente
Hola, Eli. En primer lugar, estoy teniendo en cuenta el giro original de la pelota, solo olvidé mencionarlo en mi publicación. En segundo lugar, no creo que el sistema de dirección x funcione. He intentado eso, pero si la bola golpea la superficie desde abajo ir a la izquierda, el vector x sería -1, que significaría la rotación en sentido antihorario, mientras que en realidad debería estar girando en sentido horario
codemonkey
¿Cómo se tiene en cuenta el giro original de la pelota? Si está girando muy rápido, podría lanzarse en una dirección totalmente diferente. El problema con el producto punto en su caso es que usa el coseno (una función par). Necesita algo más para establecer el signo de la relación entre sus vectores (incidente y normal). Puede usar un producto cruzado (producto vectorial) para este propósito. He editado mi respuesta para incluir un método de productos cruzados.
eli
releyendo la respuesta después de la edición me gusta. Lo probé y funcionó bastante bien. Con respecto al giro original, solo estaba hablando de hacer que el cambio de rotación sea gradual ... en cuanto al giro original que afecta al vector de salida, bueno, ese es mi próximo paso :)
codemonkey
Ay, la edición fue una de las 3 soluciones diferentes que sugerí, y le expliqué por qué tenía que hacerlo (el punto solo da magnitud, no la dirección del ángulo). Por desgracia, debería ser más conciso, supongo.
Kaj
lo siento por eso Kaj, me deslizó ... sin ánimo de ofender :)
codemonkey
3

Primero obtenga la superficie tangente de la superficie normal: t = (ny, -nx)

Entonces puede obtener el componente de velocidad a lo largo de la superficie como vt = v dot t .

Ahora puedes calcular la rotación de la bola: w = | ( normal * r) cruza vt |, donde r es el radio de la bola.

Aquí supongo que la pelota no tiene inercia rotacional y comienza a girar instantáneamente a la velocidad que tendría si rodara a lo largo de la superficie. Puede usar un coeficiente de fricción para hacerlo más realista y, si lo desea, tener en cuenta la inercia rotacional de la pelota.

Danik
fuente
Gracias por la respuesta Danik. Ya estoy teniendo en cuenta la inercia rotacional de la bola (al agregarla a la nueva rotación) y también la fricción de la superficie como un coeficiente que se multiplicará por la velocidad de rotación total. Cuanto mayor es la fricción, mayor es la velocidad de rotación, ¿verdad?
codemonkey
2

Bueno, esto puede sonar estúpido, pero no estás usando el producto de puntos del vector de bola y la superficie normal y solo estás haciendo un arco para calcular el ángulo, ¿verdad? Porque entonces el ángulo sería positivo si fuera positivo (hasta 90 grados) o negativo (ídem) ya que el coseno es simétrico alrededor de 0.
Si este es el caso, en lugar de usar la normal del plano, use la dirección del plano en sí y reste 90 grados del ángulo, por lo que 0 a 180 se convertiría en -90 a +90 grados (o medio PI a + medio PI si está inclinado radialmente).

Kaj
fuente
Bueno, considere este caso: x + ve es correcto, y + ive está abajo; Vector de superficie S = (1,0); tenemos dos vectores de velocidad de impacto V1 = (3,4) golpeando desde arriba, debe girar la bola en sentido horario y V2 = (3, -4) golpeando desde abajo, debe girar la bola en sentido antihorario. Ahora las normales para ambos vectores serían (3 / 5,4 / 5) y (3/5, -4 / 5) respectivamente. Ahora el producto punto para ambos vectores sería 3/5. el ángulo generado sería arccos (3/5) = 53 grados para AMBOS vectores. Lo cual es cierto, ¡pero en lados opuestos! así que si uso este método, terminaré causando que ambos giren en sentido horario. ¿Ves mi dilema?
codemonkey
3 posibles soluciones. 1) No use la dirección normal sino lateral y reste 90 grados como se mencionó anteriormente. 2) Simule lo mismo intercambiando x e y de la normal e invirtiendo (multiplique por -1). 3) Multiplique el ángulo con el signo del producto cruzado de los dos vectores, ya que el producto cruzado representa el pecado del ángulo que no es simétrico alrededor de 0 grados.
Kaj
El producto de puntos no te da el ángulo, solo la magnitud del ángulo, también necesitas la dirección del ángulo. Las 3 formas anteriores simulan usar el seno que te da el lado. También podría usar trigonométrico básico para obtener el ángulo. Sin (alfa) = longitud del lado opuesto / longitud del lado inclinado (basado en un triángulo con un ángulo de 90 grados entre el lado opuesto y el lado inclinado). Eso y pitágoras para calcular las longitudes de los lados serán suficientes.
Kaj
Por cierto, relea mi respuesta original, ya que resuelve el dilema al tomar el ángulo con el plano en lugar del normal y restar 90 grados.
Kaj
0

Lo primero que debe abordar es alterar la velocidad de rotación o girar antes de golpear la pared; digamos Si; es mayor, igual o menor que el valor necesario para mantener el mismo giro después de golpear, digamos Ss. Con esto, puede obtener el giro real después de golpear, digamos Se, utilizando un valor de fricción entre la bola y la superficie.

Obtenga el componente de velocidad a través de la superficie de rebote Vxi = Vi dot Vx, siendo Vx un vector paralelo a la superficie con magnitud 1.

El valor que está buscando es Ss = Vxi / r, esto es para transformar Vxi en velocidad angular. Si Si es menor que Ss, la pelota debería ganar un giro positivo. Si Si es igual a Ss, la pelota debe mantener aproximadamente el mismo giro, más tarde sobre esto. Si Si es mayor que Ss, la bola debería perder el giro

las pérdidas y la ganancia de velocidad dependen del valor de fricción Fr. En realidad, es un cruce entre el radio y la fuerza de fricción, pero puede establecer ese valor como lo desee.

También debe notar que, además del coef de rebote, la pelota pierde algo de energía debido a una fricción entre la pelota y la superficie, por lo que Vxi se ve afectado negativamente. Yo diría que el coef de rebote afecta a Vy y la fricción afecta a Vx.

Debes tener en cuenta la deformación de la pelota. Esto afectará el tiempo o los marcos en los que la pelota se adhiere a la pared, por lo que la fuerza ficticia ejercerá durante más tiempo afectando la velocidad de giro y salida. Esta deformación depende de cómo quieras que sea tu modelo.

Aprah
fuente