Cómo implementar la fricción en un motor de física basado en "Física de caracteres avanzada"


8

He implementado un motor de física basado en los conceptos del texto clásico Advanced Character Physics de Thomas Jakobsen. La fricción solo se discute muy brevemente en el artículo y el propio Jakobsen señala cómo "otros y mejores modelos de fricción que esto podrían y deberían implementarse".

En general, ¿cómo podría uno implementar un modelo de fricción creíble sobre los conceptos del artículo mencionado? ¿Y cómo podría traducirse la fricción encontrada en rotación en un círculo?


No quiero que esta pregunta sea sobre mi implementación específica sino sobre cómo combinar las ideas de Jakobsens con un gran sistema de fricción en general. Pero aquí hay una demostración en vivo que muestra el estado actual de mi motor que no maneja la fricción de ninguna manera: http://jsfiddle.net/Z7ECB/embedded/result/


A continuación se muestra una imagen y un ejemplo de cómo la detección de colisión podría funcionar en un motor basado en el documento. En la integración de Verlet, la posición actual y la anterior siempre se almacenan. Sobre esta base se calcula una nueva posición. En cada cuadro calculo la distancia entre los círculos y las líneas. Si esta distancia es menor que el radio de un círculo, se produjo una colisión y el círculo se proyecta perpendicularmente fuera de la línea ofensiva de acuerdo con el tamaño de la superposición (desplazamiento en la imagen).

La velocidad está implícita debido a la integración de Verlet, por lo que cambiar de posición también cambia la velocidad. Lo que necesito saber es determinar de alguna manera la cantidad de fricción en el círculo y moverlo hacia atrás paralelo a la línea para reducir su velocidad. imagen que muestra cómo se produce la colisión


Muy buen artículo! ¿Cómo es tu fricción ahora?
Mikael Högström

Si. Es un gran articulo. Es muy simple, pero tengo un motor completo adecuado para mi propósito trabajando en base a él. Excepto fricción;)
paldepind

Y buen video también. ¡Parece prometedor!
Mikael Högström

Respuestas:


4

Deberías echar un vistazo al artículo de Mathias Mueller et all sobre la "dinámica basada en la posición". Básicamente es lo mismo que el documento de Jacobson y él podría darle más información sobre la fricción.

http://www.matthiasmueller.info/publications/posBasedDyn.pdf

Afirman que la fricción está básicamente amortiguando la velocidad de la partícula en el plano de la colisión en algún valor escalar.

Tenga en cuenta que esto no le proporciona ningún efecto de fricción de culombio (la cantidad de impulso en la colisión no afecta la magnitud de la fuerza de fricción), pero podría obtenerlo considerando la velocidad de la partícula en el plano de colisión.


1
¿Qué pasa si, al aplicar un impulso a un cuerpo estacionario, verifica un cierto umbral? Si el componente del impulso en la superficie de contacto es inferior a ese umbral, puede establecerlo en cero para imitar los efectos de la fricción estática . A partir de entonces, la fricción dinámica es exactamente como la describiste. +1
teodron

0

En un motor de cuerpo rígido "normal" modelaría la fricción como impulsos perpendiculares a lo normal. Supongo que, en este contexto, eso significaría, en lugar de impulsos, establecer la posición de la partícula afectada de manera apropiada. Con las restricciones establecidas, esto debería, si entiendo el artículo correctamente, alcanzar iterativamente un estado donde la fricción también haya afectado la rotación. Supongo que por "mejor modelo" el autor se refiere a una mejor manera de determinar la cantidad de fricción que una proyección lineal de interpenetración. Sin embargo, esto es una suposición de mi parte, ya que nunca he implementado la física con este enfoque.

EDITAR:

Para calcular el tamaño de las fuerzas de fricción, tiene el valor de desplazamiento en su imagen. Como está usando verlet con un paso de tiempo fijo, sabemos que este desplazamiento es en realidad la velocidad que tenía el contacto en la dirección del contacto normal (bueno, no exactamente, y creo que esto es lo que el autor quiere decir al hacer una mejor aproximación de la fricción ) Conocer la velocidad a lo largo del contacto normal es esencial, ya que podemos usarlo para determinar el impulso. La mejor manera es aplicar fricción en forma de impulsos en cada cuadro donde hay un contacto. El tamaño de la fricción en los ejes paralelos al plano de contacto está determinado por el coeficiente de fricción (determinado por los materiales, por ejemplo 0.7 para una fricción bastante alta). La fricción máxima que podría tener es el coeficiente de fricción multiplicado por el desplazamiento. Tenga en cuenta que este valor podría ser mayor que la velocidad real a lo largo de uno de los ejes. En ese caso, tiene fricción estática y la partícula no debe moverse en absoluto en ese eje. Si el valor es menor, la partícula se moverá un poco pero se ralentizará, es decir, la fricción dinámica.


Estás en lo correcto. La parte difícil, al menos para mí, es determinar cómo "establecer la posición de la partícula afectada adecuadamente".
paldepind

Ahh ok, entonces veo dónde estás. Tengo una idea para una solución, editaré la respuesta
Mikael Högström

Esa es exactamente la técnica descrita en el artículo;). Sin embargo, creo que intentaré implementarlo y ver si es lo suficientemente bueno para mi proyecto.
paldepind

Ahh, supongo que sí ... Parece que el método es casi el mismo que para un motor de cuerpo rígido, solo tenga en cuenta la integración de verlet y aplique impulsos a medida que cambia la posición.
Mikael Högström
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.