View Full Version : Simulare una palla che rimabalza
Ciao a tutti, sto provando a simulare il comportamento di una palla che rimbalza dopo essere stata "sparata".
Per farlo utilizzo le classicje leggi orarie del moto eccelerato e non, ovvero la posizione Y=y0+Vy0*t-(g/2)*t^2 e la posizione sulle X=x0+Vx0*t
Queso fa bene fino a che tocca terra ma quando tocca terra cosa devo fargli fare?
Io ho pensato di riazzerare il tempo e risettare come posione inziale quella in cui si trova e quindi di invertire il segno della velocità Vy0.Questo va abb bene ma siccome il controllo della collisione sul terreno lo fa ogni ciclo, ma la palla può darsi che un attimo prima nn si in collisione mentre l'attimo dopo nn solo ha colliso, ma ha anche superato il terreno e quindi non funziona tanto bene.
Come si fa di solito?
grazie
AnonimoVeneziano
22-02-2006, 13:02
Mmm, se non devi fare una simulazione accurata una idea che mi viene in mente è quella di usare una funzione trigonometrica (sin(x) o cos(x) o il loro quadrato) per la posizione Y moltiplicata per un fattore di smorzamento da far avvicinare sempre più allo zero ogni volta che la palla tocca terra .
Altrimenti credo che la Y sia sufficiente calcolarla invertendo Vy0 e azzerando il tempo (come hai suggerito anche tu mi sembra)
Ciao
Mi sa che sto usando un approccio sbagliato.
Mmm, se non devi fare una simulazione accurata una idea che mi viene in mente è quella di usare una funzione trigonometrica (sin(x) o cos(x) o il loro quadrato) per la posizione Y moltiplicata per un fattore di smorzamento da far avvicinare sempre più allo zero ogni volta che la palla tocca terra .
Altrimenti credo che la Y sia sufficiente calcolarla invertendo Vy0 e azzerando il tempo (come hai suggerito anche tu mi sembra)
Ciao
Il fatto è che non posso utlizzare una funzione trigonometrica xkè voglio considerare anche l'urto contro una superficie obliqua.
La via più ovvia mi sembra quella di modificare le velocità che istante x istante agiscono sulla palla, ma non sto ottenendo buoni risultati...
alesnoce
23-02-2006, 09:30
Prova a utilizzare il modulo:
- lungo l'asse Y, ponendo il pavimento con ordinata 0, non ci dovrebbero essere particolari problemi, se non invertire il segno dell'accelerazione di gravità dopo ogni urto ( y = |.....|);
- lungo l'asse X bisogna fare attenzione all'ascissa degli ostacoli verticali, e quindi impostare un sistema con equazioni del tipo x-X0 = |......|, avendo cura questa volta di invertire il segno della velocità dopo ogni urto.
Spero di non aver detto troppe fesserie "dinamiche" :) (o cinematiche? :confused: )
repne scasb
23-02-2006, 09:32
Nell'ipotesi semplificativa che la palla non stia ruotando su se stessa, che non sia sottoposta ad attriti, che sia trascurabile il proprio raggio, che il tutto avvenga su di un piano perpendicolare al piano di lancio, si ha (a meno di errori grossolani):
v0=Velocita' iniziale con cui e' stata lanciata la palla.
a=alzo
g=accelerazione di gravita'
L'equazione della traiettoria della palla sara': y=x*tg(a)-x^2*g/(2*v0^2*Cos(a)^2)
La gittata sara': G=v0^2*Sin(2*a)/g
Il tempo di volo sara': 2*v0*Sin(a)/g
L'altezza massima raggiunta sara': v0^2*Sin(a)^2/(2*g)
Quando la palla tocca terra, l'angolo d'impatto sara' b=a (dall'equazione della traierroria), ma se l'impatto avviene ad un'altezza diversa o se la proiezione del piano d'impatto non e' parrallela alla proiezione piano di lancio, e' sufficiente derivare l'equazione della traiettoria nel punto d'impatto e sottrarre a derivata della retta costituente la proiezione del piano d'impatto.
Calcolato b (angolo d'impatto), e' necessario riapplicare tutto il procedimento da principio tenendo conto che:
a=b
v0=v0*f1-f2
f1 e f2 sono fattori di smorzamento il primo tiene conto della risposta elastica della palla ed e' una quantita minore di 1 (0.7 per esempio), il secondo tiene conto di uno pseudo-attrito (altrimenti la palla rimbalzerrebbe all'infinito (ed e' ad esempio 1/10 della velocita' iniziale).
La palla si ferma quanto v0<0.
P.S. Si tratta di un modello primitivo, spero ti sia d'aiuto.
EDIT: Corretta l'equazione della traiettoria della palla (e' una parabola, mancava un x^2)
alesnoce
23-02-2006, 09:46
P.S. Si tratta di un modello primitivo, spero ti sia d'aiuto.
Il mio allora è da australopithecus, se va bene :D :D
Grazie ragazzi ho risolto per quanto riguarda i rimbalzi, ora ad ogni collisione mi ricalcolo l'angolo di uscita dopo l'urto alpha (e betha xkè sono in uno spazio 3D) in relazione a l'angolo d'impatto e a quello della superficie dove si impatta ed il modulo della velocità, in questo modo riesco a ricalcolare tutte le componenti della velocità.Mi sembra che sia molto reale così.
Ora mi rimane da trovare un buon metodo per sapere quando ci sia una collisione.
Considerando che può impattare contro più superfici contemporaneamente, come posso fare?
Avevo pensato di calcolarmi a priori se la traiettoria della palla interseca o no un qualche oggetto, ma da cosa è descritta la traiettoria della palla?
Siccome sono in uno spazio 3D non mi basta la classica Y=x*tan(alpha)-(g/2*(Vo*cos(alpha))^2)*x^2) xkè in questo modo mi calcolo solo la Y, a me serve anche la Z.
Sono risucito a ricavarmi anche la Z ora provo a vedere se funziona.
se per te non è un problema potresti postare le sorgenti oppure anche solo l'exe ?
grazie
Ora mi rimane da trovare un buon metodo per sapere quando ci sia una collisione.
Avemdo le coordinate 3d xyz della palla e degli oggetti es.:
coordinate palla(10,10,10)
qualsiasi poligono a coordinate (10,10,10) significa che c'è collisione
che programma stai usando?
Sto usando labview non se lo conoscete, usa il linguaggio G che è grafico.
Per quanto riguarda le coordinate io so le coordiate del centro della sfera infatti per spostare la sfera sposto il suo centro, mentre per un poligono conosco solo i vertici, quindi nonnè così semplice la cosa.
Sto usando labview non se lo conoscete, usa il linguaggio G che è grafico.
Per quanto riguarda le coordinate io so le coordiate del centro della sfera infatti per spostare la sfera sposto il suo centro, mentre per un poligono conosco solo i vertici, quindi nonnè così semplice la cosa.
Lo spazio 3d è il tuo mondo. Ogni punto di questo spazio è formato da 3 coordinate appunto spazio 3d.
Se hai un poligono quadrato nel tuo mondo il poligono a 4 vertici cioè un piano con queste coordinate per esempio.
100.0........100.0
----------
|...........|
|.....S....| S = sfera che stà a coordinate (x, y, z ) = (50.0, 0.0, 50.0)
|...........|
----------
0.0.........100.0
coordinata z
^
|
|
|
|
----------> coordinata x
Tu dici di conoscre le coordinate della sfera quindi hai una sfera che nel tuo mondo 3d si trova a coordinate tot esempio:
sfera a coordinate (x, y, z) = (50.0, 0.0, 50.0) la y = 0 perchè attaccata al suolo.
se muvi la sfera e ti porti a coordinate (x, y, z) = (0.0, 0.0, 0.0)
la posizione della sfera sarà:
100.0........100.0
----------
|...........|
|...........|
|...........|
S--------
0.0.........100.0
S = sfera ora stà a coordinate (x, y, z ) = (0.0, 0.0, 0.0)
e c'è pure collisione con il poligono.
se vuoi scostarti (collision response) fai:
if (sfera<0.0)
sfera+=1.0
è solo un esempio, sfera potrebbe essere un D3DVECTOR che rappresenta un vettore di posizione io faccio così in directx.
Solo per farti capire il concetto.
cerca con google questi termini
- spazio 3d
- collision detection
- collision response
Ho capito quello che vuoi dire, ma mettiamo il caso che io ho un poligono simile al cubo con 4 vertici quindi ma con le facce non parallele tra loro e inclinate di alpha gradi rispetto al suolo, a me serve che quando ho una collisione abbia le informazioni della superficie contro cui sto collidendo tipo l'angola che ha con il suolo, lo smorzamento che provoca sulla palla ecc ecc.
Se io faccio una cosa come quella che dici te so solo (e con mooooolta approssimazione) quando la sfera mi interseca un poligono.
per il collision respone ho già risolto, sto cercando un buon collision detect ora
Considerando che io conosco l'equazione del moto della mia palla, posso sapere quando essa interseca un piano le cui coordinate generiche sono ax+by+cz+d=0
Il problema è che non riesco a ricavarmi l'equazione di ogni faccia dei miei poligono conoscendo solo i vertici.
Se qualcuno mi aiuta... :D
Considerando che io conosco l'equazione del moto della mia palla, posso sapere quando essa interseca un piano le cui coordinate generiche sono ax+by+cz+d=0
Il problema è che non riesco a ricavarmi l'equazione di ogni faccia dei miei poligono conoscendo solo i vertici.
Se qualcuno mi aiuta... :D
se prendi quel poligono che ho fatto e ne duplichi 5 e li attacchi tra loro avrai un cubo di 8 vertici 4 di questi pavimenti (piani) avranno coordinate:
(x, y z) = (0.0, 100.0, 100.0) ecc ecc... quindi basta calcolare la posizione (vettore 3d) della sfera e le posizioni (vettori 3d) degli 8 vertici.
... esatto calcolando il collision response con le formule trigonometriche ottieni il risultato che vuoi... + o - una fisica decente dipende da cosa vuoi e fare.
repne scasb è sempre mitica...
ciao
Ti ringrazio per l'interessamento, non ho capito cosa intendi per mettere insieme 5 poligoni non è che mi faresti un disegnino? :p
Comunque questa immagine mostra la palla che sta per impattare contro la superficie blu, come vedi la superficie non è regole in quanto è angolata rispetto al suolo.
http://img517.imageshack.us/img517/3817/espalla9ew.jpg
In questo caso come fai ad indivudare se la palla collide o no?
Ti ripeto che io conosco solo i 4 vertici della faccia e le coordinate del CENTRO della palla.
io purtroppo non so darti indicazioni precise perché non ho mai studiato geometria analitica a più di 2 dimensioni, comunque essenzialmente dovresti ricavare l'equazione del piano su cui giace la faccia (e per farlo ti bastano anche solo 3 vertici, uno è superfluo) e l'equazione della parabola descritta dalla sfera; poi le metti a sistema e così trovi il punto o i punti (se esistono) in cui la parabola e il piano coincidono. se questi punti esistono sono sicuramente solo due, magari coincidenti, quindi il massimo che devi fare è un'equazione di secondo grado :)
PS: non vorrei sparare una balla grossa così (oltre a quella della tua simulazione :p) ma credo che l'equazione del piano nello spazio sia una cosa tipo
ax + by + cz + d = 0
prendila con le pinze :stordita:
altra soluzione, sicuramente migliore: calcolare i punti di tangeza (se esistono) tra la sfera e il piano in questione, anche considerando che in certi casi il piano potrebbe avere dei punti di tangenza, ma siccome il poligono che ci interessa è limitato potrebbe non esserci comunque la collisione. non ho la minima idea di come fare :D
Considerando che io conosco l'equazione del moto della mia palla, posso sapere quando essa interseca un piano le cui coordinate generiche sono ax+by+cz+d=0 to', l'equazione me la ricordavo bene :D
io purtroppo non so darti indicazioni precise perché non ho mai studiato geometria analitica a più di 2 dimensioni, comunque essenzialmente dovresti ricavare l'equazione del piano su cui giace la faccia (e per farlo ti bastano anche solo 3 vertici, uno è superfluo) e l'equazione della parabola descritta dalla sfera; poi le metti a sistema e così trovi il punto o i punti (se esistono) in cui la parabola e il piano coincidono. se questi punti esistono sono sicuramente solo due, magari coincidenti, quindi il massimo che devi fare è un'equazione di secondo grado :)
PS: non vorrei sparare una balla grossa così (oltre a quella della tua simulazione :p) ma credo che l'equazione del piano nello spazio sia una cosa tipo
ax + by + cz + d = 0
prendila con le pinze :stordita:
heheh si è proprio quella l'equazione ma il problema è che non riesco a trovare l'equazione del piano che passa per 3 punti! avrei un sistema di 3 equazioni ma 4 incongnite, sto googlando un po' ma nn trovo nulla... :(
Mi potresti spiegare meglio il fatto delle tangenti che non l'ho capito molto?
heheh si è proprio quella l'equazione ma il problema è che non riesco a trovare l'equazione del piano che passa per 3 punti! avrei un sistema di 3 equazioni ma 4 incongnite, sto googlando un po' ma nn trovo nulla... :(
Mi potresti spiegare meglio il fatto delle tangenti che non l'ho capito molto?
Intanto per duplicare per 5 + 1 poligono che hai e metterli insieme intendevo di formare un cubo.
Ho capito cosa vuoi sapere io mi appoggio a directx con cui sviluppo videogame e adopero intrinsectMesh e altre funzioni delle DX.
Ora non sò che linguaggio usi tu cmq ho studiato e anche molto per passione personale pe capire come funzionana il 3d applicato al computer e ho sviluppato algoritmi personali miei a riguardo senza usare le funzioni di directx tipo il Dot-Product, intrinsecMesh, crossproduct ecc ecc.
si procede così:
devi passare le coordinate xz ad una funzione e farti ritornare la coordinata y della palla in confronto al piano, piano che si trovi in qualsiasi punto dello spazio 3d:
CoordinateXZ (CoordinatePuntoY(pos.x, pos.z));
quì (lo sai tu come sono le posizioni del poligono) io per esempio estraggo dall'IndexBuffer i punti 3d e avendo la posizione della palla faccio il calcolo in che punto mi interseco con i punti del'IB (IndexBuffer)
D3DXVECTOR3 v1,v2,v3;
MYVERTEX *pVertices;
m_pQuadVertexBuffer->Lock(0, m_dwNumOfIndicesTerreno * sizeof(MYVERTEX), (BYTE**)&pVertices, 0);
m_pQuadVertexBuffer->Unlock ();
per sapere a che quadrato della griglia mi trovo controllo se la posizione sta sul triangolo1 o triangolo2:
un quadrato è formato da 2 triangoli... lo sai questo...
if(qx<=qz){
s=cz;
v1=pVertices[s].position; //estraggo l'IB primo triangolo
v2=pVertices[s+1].position;
v3=pVertices[s+2].position;
}
else
{
s=cz+3;
v1=pVertices[s].position; //estraggo l'IB 2 triangolo
v2=pVertices[s+1].position;
v3=pVertices[s+2].position;
}
float a, b, c;
a=( (v1.y-v2.y)*(v2.z-v3.z)-(v2.y-v3.y)*(v1.z-v2.z))/
((v1.x-v2.x)*(v2.z-v3.z)-(v2.x-v3.x)*(v1.z-v2.z));
b=( (v1.y-v2.y)*(v2.x-v3.x)-(v2.y-v3.y)*(v1.x-v2.x))/
((v1.z-v2.z)*(v2.x-v3.x)-(v2.z-v3.z)*(v1.x-v2.x));
c=v1.y-a*v1.x-b*v1.z;
return a*x+b*z+c; // ritorna la y ovvero l'altezza della palla al piano
ora ...
CoordinateXZ (float AltezzaTerreno)
// a questo punto se sfera stà con la y a +3 dal poligono la riporto
// tenendola attaccata al terreno
sfera.y-=pos.y-AltezzaTerreno-2.0;
sfera.y=AltezzaTerreno+2.0;
}
In sostanza la formula te l'ho scritta la devi applicare alle tue esigenze il blocco dell'algoritmo vero è proprio è:
ax + by + cz + d = 0 ... questa mi ha sempre fatto inca**are
perchè per esmpio io sono autodidatta e tutti quei segni da scienziato no li capisco se mi avessere detto subito così:... sarei 10 anni avanti.
float a, b, c;
a=( (v1.y-v2.y)*(v2.z-v3.z)-(v2.y-v3.y)*(v1.z-v2.z))/
((v1.x-v2.x)*(v2.z-v3.z)-(v2.x-v3.x)*(v1.z-v2.z));
b=( (v1.y-v2.y)*(v2.x-v3.x)-(v2.y-v3.y)*(v1.x-v2.x))/
((v1.z-v2.z)*(v2.x-v3.x)-(v2.z-v3.z)*(v1.x-v2.x));
c=v1.y-a*v1.x-b*v1.z;
...ma mettiamo il caso che io ho un poligono simile al cubo con 4 vertici quindi ma con le facce non parallele tra loro e inclinate di alpha gradi rispetto al suolo...
... appunto il piano i piano possono stare nel tuo spazio in qualsiasi modo, inclinati dritti a rovesio, sottosopra...
se tu conosci le loro coordinate le controlli con quelle della tua sfera e con quell'algoritmo ci scivolerai sopra. Nel caso dei rimbalzi della palla dici che già lo hai fatto quindi ci sei quasi oppure migliorerai la sua fisica.
ciao
edit:
ora che rileggo... io intendo che il piano è costruito con dei triangoli (base del 3d computazionale)... dove magari a questo poligono puoi applicare delle texture ecc ecc... ma tu invece cosa hai fatto?? hai per caso fatto un piano infinito?? perchè in questo caso non ci sono triangoli quindi niente VB o IB ma solo un piano infinito.
cmq sia rimane il fatto che per sapere le incognite e sviluppare l'equazione del piano l'algoritmo che ti ho passato è giusto per la formula da te citata... ora lo sai tu cosa devi fare e sfruttarla.
heheh si è proprio quella l'equazione ma il problema è che non riesco a trovare l'equazione del piano che passa per 3 punti! avrei un sistema di 3 equazioni ma 4 incongnite, sto googlando un po' ma nn trovo nulla...?
Il "problema" è in effetti la quarta incognita, ma si risolve brillantemente con le matrici. L'equazione di un piano passante per tre punti, infatti, si ottiene calcolando il determinante della matrice:
/ \
|x y z 1|
|x1 y1 z1 1|
det |x2 y2 z2 1| = 0
|x3 y3 z3 1|
\ /
Calcolare il determinante di una matrice 4x4 non è una cosa dell'altro mondo, anzi. Puoi trovare algoritmi di calcolo determinante facilmente sul Web, o più semplicemente consultando un qualsiasi libro di geometria analitica o calcolo numerico (quest'ultimo consigliato dal momento che devi implementare un algoritmo software).
Ciao ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.