180 likes | 371 Views
Bouncing Balls. Obiettivo: creazione di un sistema particellare con simulazione di alcuni parametri fisici (gravità, attrito, urti tra particelle...). Impostazione lavoro. Adotteremo un approccio incrementale, aggiungendo feature ad ogni nuova versione Caratteristiche iniziali oggetti:
E N D
Bouncing Balls Obiettivo: creazione di un sistema particellare con simulazione di alcuni parametri fisici (gravità, attrito, urti tra particelle...) Bouncing Balls
Impostazione lavoro Adotteremo un approccio incrementale, aggiungendo feature ad ogni nuova versione Caratteristiche iniziali oggetti: Dimensione Posizione Velocità Caratteristiche iniziali ambiente: Gravità Bouncing Balls
Struttura sketch Classe Ball descrive le palline e i loro movimenti nello spazio Main definisce le proprietà dell'ambiente tiene traccia delle palline in esso contenute tramite una lista dinamica Alcune variabili di supporto: t: durata in s di un frame (1/frameRate) ppm: pixel per metro Bouncing Balls
Simulazione fisica - moto Presenza di gravità → moto accelerato In realtà conviene risolvere l'accelerazione come cambio di velocità istantanea, considerando uniforme il moto tra un frame e il successivo Bouncing Balls
La classe PVector Inserita nelle ultime versioni di Processing all'interno della libreria standard, permette di gestire in maniera facile e veloce i calcoli vettoriali (sia 2D che 3D) Moto pallina in 2 righe di codice! :) Void move(PVector field, float t) { vel.add(PVector.mult(field,t)); pos.add(PVector.mult(vel,ppm*t)); } Bouncing Balls
Versione 0: ultimi ritocchi Aggiunta di semplice interazione: Mouse click sx → crea pallina Definizione di un limite superiore al numero di palline presenti (maxBalls) CODICE Bouncing Balls
Gestione collisioni Due possibili approcci: A priori → Calcolo preciso dell'urto con equazioni differenziali PRIMA che esso avvenga A posteriori → Gestione urto DOPO che esso è avvenuto Ci concentreremo sul secondo poiché di più facile trattazione Bouncing Balls
Urto con le pareti Se la distanza tra il centro della pallina e la parete è inferiore al raggio, la componente della velocità perpendicolare alla parete viene invertita di segno e moltiplicata per un coeff. tra 0 e 1, che regola l'elasticità dell'urto Bouncing Balls
Fix up Fase fondamentale nella collision response a posteriori, corregge la compenetrazione tra oggetti (che è già avvenuta) Parte delicatissima, nonché fonte di instabilità e comportamenti indesiderati In genere si tratta di un processo per tentativi ed errori, alla ricerca di un risultato sufficientemente verosimile Bouncing Balls
Rotolamento contro le pareti Ogni volta che la pallina si trova in contatto con una parete, la componente della velocità parallela alla parete viene decrementata del suo valore moltiplicato per un coefficiente d'attrito tra 0 e 1 Bouncing Balls
Versione 1: ultimi ritocchi Aggiunta rotazione del campo gravitazionale Aggiunta di un semplice puntatore triangolare per indicare la direzione del campo gravitazionale CODICE Bouncing Balls
Urto tra particelle E' la parte più complessa, sia a livello concettuale che computazionale Per ogni pallina si calcola la distanza con ogni altra pallina, e se essa è minore della somma dei raggi c'è una collisione La complessa interazione tra gli oggetti è approssimata calcolando singolarmente gli urti per ogni coppia di palline Bouncing Balls
Urto elastico (masse uguali) E' la parte più complessa, sia a livello concettuale che computazionale Per ogni pallina si calcola la distanza con ogni altra pallina, e se essa è minore della somma dei raggi c'è una collisione La complessa interazione tra gli oggetti è approssimata calcolando singolarmente gli urti per ogni coppia di palline Bouncing Balls
Urto elastico (masse uguali) 1. E' comodo cambiare sistema di riferimento e considerare fermo uno dei due oggetti, sottraendo la sua velocità a entrambe le entità in gioco Bouncing Balls
Urto elastico (masse uguali) 2. La velocità dell'oggetto in moto viene scomposta rispetto all'angolo di incidenza dell'urto Bouncing Balls
Urto elastico (masse uguali) 3. La componente normale è la velocità finale dell'oggetto inizialmente fermo, mentre l'altra componente è la velocità finale dell'oggetto in collisione Bouncing Balls
Urto elastico (masse uguali) 4. Occorre infine tornare al vechio sistema di riferimento, aggiungendo a entrambi gli oggetti la velocità iniziale di quello che avevamo “fermato” CODICE Bouncing Balls
E se le masse non sono uguali? Se l'urto è elastico ma le masse non sono uguali, allora è il momento che si conserva, mentre consideriamo fermo il centro di massa Per ulteriori approfondimenti: http://en.wikipedia.org/wiki/Center_of_momentum_frame CODICE FINALE Bouncing Balls