Uso il seguente approccio (simile all'algoritmo di divisione di massa di Tonge http://www.richardtonge.com/ ):
- rileva tutte le coppie in collisione nella tua scena / contesto. Sia (A, B) una tale coppia. Applica un'idea di divisione fantasma / di massa: se A è in contatto con M corpi e B è in contatto con N altri corpi, imposta temporaneamente la massa di A su
m_A/M
e quella di B sum_B/N
- calcolare i contributi della forza di reazione / restituzione per ciascuna coppia (A, B) e conservare questi contributi negli accumulatori propri di A e B
- calcola le velocità di restituzione dagli impulsi (come hai affermato) e memorizzali nello stesso modo (dei residui di velocità deltaV nei loro accumulatori per ciascuna coppia (A, B))
- calcolare gli spostamenti di penalità (di nuovo, accumulare spostamenti, non applicarli all'istante!)
- resettare le masse di tutti i corpi precedentemente designati come parti in coppie di collisione (
m_A = m_A * M
e m_B = m_B * N
)
Questo approccio è simile al modo in cui l'algoritmo iterativo Jacobi funziona con sistemi di equazioni lineari simultanei. E non è garantito che converga, ma nel mio simulatore fa il lavoro abbastanza agevolmente .. in 3D (sì, una dimensione aggiuntiva aggiunge il doppio della difficoltà!).
Avvertenza : correggere posizioni e velocità solo al termine della fase di rilevamento / gestione delle collisioni! In questo modo aggiorni simultaneamente i tuoi attori in collisione. Inoltre, le forze di restituzione devono essere prese in considerazione la prossima volta quando si integrano posizioni e velocità.
EDIT: Beh, immagino che tu stia utilizzando il metodo di integrazione Verlet già abusato (questo è diventato un nome familiare tra gli appassionati di Gamedev). In questo spettro di gestione e integrazione delle collisioni, potresti dare un'occhiata qui .
AGGIORNAMENTO: Alcune delle informazioni su come affrontare la collisione (e l'auto-collisione per questo motivo) possono essere trovate in questi documenti:
L'approccio che ho proposto non è di gran lunga un contributo originale, molti giochi lo usano con risultati plausibili ed è stato impiegato al meglio da Jakobsen nel suo motore di gioco Hitman.
Da un'esperienza in qualche modo pratica, le forze di penalità (simili alle molle lineari o esponenziali che ottengono il loro input dalla distanza di penetrazione) non risolvono adeguatamente le penetrazioni quando altre forze dei corpi che si scontrano riescono ad essere più grandi di loro. Ecco perché ho scelto di combinare tre approcci (quasi ridondanti): forze di reazione newtoniane (spingi il muro, il muro spinge indietro), velocità derivate dagli impulsi (palle da biliardo che si scontrano) e un non naturale "allontanano geometricamente i corpi l'uno dall'altro "soluzione. Insieme sembrano fornire tutto: sbarazzarsi di piùbrutti artefatti di compenetrazione, corpi in collisione tendono ad interagire tra loro nel lungo periodo (a causa delle velocità e delle forze di restituzione - almeno le forze che tendevano a trascinare i corpi in uno scenario di collisione vengono cancellate e i corpi rimbalzano l'uno dall'altro) . Infine, per un'ulteriore comprensione di questi concetti semplici ma comuni, suggerisco di analizzare queste diapositive .
Il mio epiteto del "metodo abusato" che descrive i passaggi dell'integrazione di Verlet è mirato alla credenza della cultura popolare che questo è il Santo Graal dei metodi di integrazione. È solo leggermente migliore del suo cugino Symplectic Euler (chiamato anche da alcuni Euler semi-implicito). Esistono metodi di integrazione più complicati (e tutti hanno il nome implicito in essi). Potenti motori di gioco li usano, ma gli sviluppatori indipendenti non hanno il tempo di sperimentare quelli dal momento che Verlet, quando sintonizzato su uno scenario specifico, fa davvero meraviglie. Inoltre, non esiste assolutamente alcun metodo di integrazione in grado di gestire i vincoli rigidi senza essere coinvolto in un piccolo imbroglio (non è possibile trovare il collegamento, ma il documento a cui mi riferisco dovrebbe essere chiamato "X.Provot -" Vincoli di deformazione in una massa modello a molla per descrivere il comportamento del tessuto rigido "