Come implementare l'attrito in un motore fisico basato su "Advanced Character Physics"


8

Ho implementato un motore fisico basato sui concetti del testo classico Advanced Character Physics di Thomas Jakobsen. L'attrito è discusso molto brevemente nell'articolo e lo stesso Jakobsen nota come "altri e migliori modelli di attrito di questi potrebbero e debbano essere implementati".

In generale, come si potrebbe implementare un modello di attrito credibile in aggiunta ai concetti dell'articolo citato? E come si può tradurre l'attrito trovato in rotazione su un cerchio?


Non voglio che questa domanda riguardi la mia specifica implementazione, ma su come combinare le idee di Jakobsens con un ottimo sistema di attrito più in generale. Ma ecco una demo live che mostra lo stato attuale del mio motore che non gestisce in alcun modo l'attrito: http://jsfiddle.net/Z7ECB/embedded/result/


Di seguito è riportata un'immagine che mostra un esempio di come il rilevamento delle collisioni potrebbe funzionare in un motore basato sul documento. Nell'integrazione Verlet la posizione corrente e precedente viene sempre memorizzata. Sulla base di questi viene calcolata una nuova posizione. In ogni fotogramma calcolo la distanza tra i cerchi e le linee. Se questa distanza è inferiore al raggio di un cerchio, si è verificata una collisione e il cerchio viene proiettato perpendicolarmente dalla linea offensiva in base alle dimensioni della sovrapposizione (offset sull'immagine).

La velocità è implicita a causa dell'integrazione di Verlet, quindi cambiare posizione cambia anche la velocità. Quello che devo sapere è determinare in qualche modo la quantità di attrito sul cerchio e spostarlo indietro parallelamente alla linea per ridurne la velocità. immagine che mostra come si verifica la collisione


Articolo molto bello! Qual è il tuo attrito in questo momento?
Mikael Högström,

Sì. È un ottimo articolo. È molto semplice, ma ho un intero motore adatto al mio scopo, basato su di esso. Tranne l'attrito;)
paldepind

E anche un bel video. Sembra promettente!
Mikael Högström,

Risposte:


4

Dovresti dare un'occhiata a Mathias Mueller e a tutti gli articoli sulla "dinamica basata sulla posizione". È praticamente lo stesso del documento di Jacobsons e potrebbe darti maggiori informazioni sull'attrito.

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

Affermano che l'attrito in sostanza smorza la velocità della particella nel piano della collisione di un valore scalare.

Nota che questo non ti dà alcun effetto di attrito coulomb (la quantità di quantità di moto nella collisione non influisce sull'entità della forza di attrito) ma potresti essere in grado di ottenerla considerando la velocità della particella nel piano di collisione.


1
E se, quando si applica un impulso a un corpo altrimenti stazionario, si verifica una determinata soglia. Se il componente dell'impulso sulla superficie di contatto è inferiore a tale soglia, è possibile impostarlo su zero per imitare gli effetti dell'attrito statico . Da quel momento in poi, l' attrito dinamico è esattamente come l'hai descritto. +1
teodron,

0

In un "normale" motore a corpo rigido modelleresti l'attrito come impulsi perpendicolari alla normale. Immagino che in questo contesto ciò significherebbe invece che gli impulsi impostare la posizione della particella interessata in modo appropriato. Con i vincoli in atto questo dovrebbe, se capisco l'articolo correttamente, quindi raggiungere iterativamente uno stato in cui anche l'attrito ha influito sulla rotazione. Immagino che per "modello migliore" l'autore significhi un modo migliore per determinare la quantità di attrito rispetto a una proiezione lineare di compenetrazione. Questa è tuttavia un'ipotesi da parte mia poiché non ho mai implementato la fisica con questo approccio da solo.

MODIFICARE:

Per calcolare la dimensione delle forze di attrito hai il valore di offset nell'immagine. Mentre stai usando il verlet con timestep fisso sappiamo che questo offset è in realtà la velocità che il contatto aveva nella direzione del contatto normale (bene non esattamente, e penso che questo sia ciò che l'autore intende facendo una migliore approssimazione dell'attrito ). Conoscere la velocità lungo il normale contatto è essenziale in quanto possiamo usarlo per determinare l'impulso. Il modo migliore è applicare l'attrito sotto forma di impulsi in ciascun telaio in cui è presente un contatto. La dimensione dell'attrito negli assi parallela al piano di contatto è determinata dal coefficiente di attrito (determinato dai materiali, ad esempio 0,7 per attrito piuttosto elevato). L'attrito massimo che si può avere è il coefficiente di attrito moltiplicato per l'offset. Si noti che questo valore potrebbe essere maggiore della velocità effettiva lungo uno degli assi. In tal caso si ha attrito statico e la particella non dovrebbe muoversi affatto in quell'asse. Se il valore è inferiore a quello la particella si sposterà leggermente ma verrà rallentata, ovvero attrito dinamico.


Hai ragione. La parte difficile, almeno per me, è determinare come "impostare in modo appropriato la posizione della particella interessata".
paldepind,

Ahh ok, allora vedo dove sei. Ho un'idea per una soluzione, modificherò la risposta
Mikael Högström

Questa è esattamente la tecnica descritta nel documento;). Penso che proverò a implementarlo e vedere se è abbastanza buono per il mio progetto però.
paldepind,

Ah, immagino di sì ... Sembra che il metodo sia quasi lo stesso di un motore a scocca rigida, basta prendere in considerazione l'integrazione del verlet e applicare invece gli impulsi come cambio di posizione.
Mikael Högström,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.