Bouncing Balls Obiettivo: creazione di un sistema particellare con simulazione di alcuni parametri fisici (gravità, attrito, urti tra particelle...) Corso di Laurea in Bouncing Balls Comunicazione Digitale Impostazione lavoro Adotteremo un approccio incrementale, aggiungendo feature ad ogni nuova versione Caratteristiche iniziali oggetti: Dimensione Posizione Velocità Caratteristiche iniziali ambiente: Corso Gravità di Laurea in Bouncing Balls Comunicazione Digitale 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 Corso di Laurea in Bouncing Balls Comunicazione Digitale Simulazione fisica - moto Presenza di gravità → moto accelerato x= x 0 v 0 t 1 2 at 2 In realtà conviene risolvere l'accelerazione come cambio di velocità istantanea, considerando uniforme il moto tra un frame e il successivo v= v 0 at x= x 0 vt Corso di Laurea in Bouncing Balls Comunicazione Digitale 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)); } Corso di Laurea in Bouncing Balls Comunicazione Digitale 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 Corso di Laurea in Bouncing Balls Comunicazione Digitale 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 Corso di Laurea in Bouncing Balls Comunicazione Digitale 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 v n= − v n0⋅ k bounce Corso di Laurea in Bouncing Balls Comunicazione Digitale 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 Corso di Laurea in Bouncing Balls Comunicazione Digitale 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 v p= v p0 − v p0⋅ k roll Corso di Laurea in Bouncing Balls Comunicazione Digitale Versione 1: ultimi ritocchi Aggiunta rotazione del campo gravitazionale Aggiunta di un semplice puntatore triangolare per indicare la direzione del campo gravitazionale CODICE Corso di Laurea in Bouncing Balls Comunicazione Digitale 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 Corso di Laurea in Bouncing Balls Comunicazione Digitale 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 Corso di Laurea in Bouncing Balls Comunicazione Digitale 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 Corso di Laurea in Bouncing Balls Comunicazione Digitale Urto elastico (masse uguali) 2. La velocità dell'oggetto in moto viene scomposta rispetto all'angolo di incidenza dell'urto Corso di Laurea in Bouncing Balls Comunicazione Digitale 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 Corso di Laurea in Bouncing Balls Comunicazione Digitale 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 Corso di Laurea in Bouncing Balls Comunicazione Digitale 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_fram e CODICE FINALE Corso di Laurea in Bouncing Balls Comunicazione Digitale