Tema2
Animația obiectelor rigide
Să se implementeze corelația curbelor traiectorie și viteză (cursul 9).
Teorie
Curba traiectorie este o curbă parametrică 3D
$Q(u) = (X(u), Y(u), Z(u))$
Un exemplu - curbă Bezier
Curba de viteză corelează timpul cu distanța parcursă de obiect pe curba traiectorie
Distanța e măsurată prin lungimea arcului de curbă
Exemple: viteză constantă (curba este o linie dreaptă), accelerare lină la plecare și decelerare lină la sosire (curba ease-in ease-out)
$V(u) = (S(u), T(u))$, unde
Exemple pentru viteza constată:
Exemple pentru curba ease-in ease-out
Corelația curbelor traiectorie și viteză
Curbele sunt parametrizate în funcție de $u$, nu de $t$
Pentru fiecare moment de timp $t_i$, $t_{initial} <= t_i <= t_{final}$
Se determină $u_i$, astfel încât $T(u_i) = t_i$
Se calculează $s_i = S(u_i)$, lungimea arcului de curbă parcurs până la momentul $t_i$
Se determină $u_k$, astfel încât lungimea arcului de curbă de la $Q(0)$ la $Q(u_k)=s_i$
Se calculează poziția de pe curba traiectorie la momentul $t_i$: $(X(u_k), Y(u_k), Z(u_k))$
Detalii de implementare
Se poate folosi implementarea propusă mai jos, care este o combinație între metodele prezentate la curs
Se pot folosi si alte metode, atât timp cât ele sunt corecte și generale (adică funcționează pe orice formulă a curbelor traiectorie/viteză)
Metode importante
1. Popularea tablourilor corespunzătoare curbelor $V(u)$ și $Q(u)$: această metodă se apelează o singură data, în init()
Se calculează și se memorează în câte un tablou timpi și distanțe corespunzătoare curbei $V(u)$, eșantionând $u$ cu un pas foarte mic:
Se calculează și se memorează în câte un tablou lungimi de arce si pozitii care corespund unor valori discrete ale lui $u$ (nu trebuie să fie același pas ca mai devreme):
$Q(u_k)$ - poziții calculate cu formula parametrică a curbei (de ex, Bezier)
$S(u_k)$ - distanță calculată pe baza pozițiilor $Q(u_k)$ de pe curbă și a aproximării distanței parcurse pe arcul dintre $Q(u_k)$ și $Q(u_k - pas)$ prin lungimea segmentului dintre $Q(u_k)$ și $Q(u_k - pas)$.
Atenție!! Trebuie să existe o corespondență între distanța calculată cu formula cubică polinomială și distanța calculată pe curba traiectorie; adică distanța maximă calculată polinomial (obținută pentru $u_i=1$) trebuie să fie egală cu distanța totală parcursă pe curba traiectorie (obținută pentru $u_k=1$). Un mod de a obține această corespondență este prin normalizarea distanțelor în intervalul [0,1]
2. Căutare binară:
3. Animația efectivă: animația se realizează în funcția update()
Cerințe temă
Să se aleagă o curbă traiectorie (să se aleagă fie între mai multe curbe predefinite, care au punctele de control stabilite, sau să se modeleze interactiv - de exemplu prin deplasarea punctelor de control)
Să se aleagă o curbă viteză (să se aleagă fie între mai multe curbe predefinite, sau să se modeleze interactiv)
Să se afișeze curba viteză în 2D
Să se afișeze curba traiectorie în 3D
Să se afișeze o animație a unui obiect 3D (de exemplu, o sferă), care se deplasează pe curba traiectorie pe baza caracteristicilor mișcării stabilite prin curba de viteză
Să se restarteze animația la apăsarea unei taste
Să se modifice curba traiectorie sau curba de viteză la apăsarea unei taste și să se reia animația
Barem (Total 250 puncte)
Definirea și redarea curbei traiectorie: 25 puncte
Definirea și redarea curbei de viteză: 25 puncte
Calculul poziției corespondente momentului $t$ de timp: 100 puncte
calculul unui parametru $u_i$ care corespunde unui moment $t$ de timp astfel încât $T(u_i) = t$
calculul lui $S(u_i)$
calculul unui parametru $u_k$ care corespunde unei distanțe $S(u_i)$, astfel încât $S(u_k) = S(u_i)$
calculul poziției $Q(u_k)$
Redarea și animația corectă unui obiect pe curba traiectorie (60 puncte)
Restartarea animației: 20 puncte
Selecția altor curbe de traiectorie / viteză și restartarea animației: 20 puncte
Bonusuri posibile
Să se modeleze interactiv curbele traiectorie / de viteză prin drag-and-drop al punctelor de control
Alte elemente interesante
Demo