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?
fuente
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.
fuente
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).
fuente
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.
fuente