This shows you the differences between two versions of the page.
vdvac:tema2 [2024/05/18 18:47] anca.morar [Animația obiectelor rigide] |
vdvac:tema2 [2024/05/22 16:50] (current) anca.morar [Barem (Total 250 puncte)] |
||
---|---|---|---|
Line 10: | Line 10: | ||
* 4 puncte de control | * 4 puncte de control | ||
* Formula parametrică: $Q(u) = P_0 \cdot (1-t)^3 + P_1 \cdot 3 \cdot t \cdot (1-t)^2 + P_2 \cdot 3 \cdot t^2 \cdot (1-t) + P_3 \cdot t^3$ | * Formula parametrică: $Q(u) = P_0 \cdot (1-t)^3 + P_1 \cdot 3 \cdot t \cdot (1-t)^2 + P_2 \cdot 3 \cdot t^2 \cdot (1-t) + P_3 \cdot t^3$ | ||
- | * Curba de viteză corelează timpul cu distanța parcursă de la obiect pe curba traiectorie | + | * Curba de viteză corelează timpul cu distanța parcursă de obiect pe curba traiectorie |
* Distanța e măsurată prin lungimea arcului de curbă | * 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) | * Exemple: viteză constantă (curba este o linie dreaptă), accelerare lină la plecare și decelerare lină la sosire (curba ease-in ease-out) | ||
Line 20: | Line 20: | ||
* $T(u) = u$ | * $T(u) = u$ | ||
* Exemple pentru curba ease-in ease-out | * Exemple pentru curba ease-in ease-out | ||
- | * dacă $u<0.5$ atunci $S(u) = 2 \cdot u^2$, | + | * dacă $u<0.5$ atunci $S(u) = 2 \cdot u^2$, altfel $S(u) = - 2 \cdot u^2 + 4 \cdot u - 1$ |
- | * altfel $S(u) = - 2 \cdot u^2 + 4 \cdot u - 1$ | + | |
* $T(u) = u$ | * $T(u) = u$ | ||
* Corelația curbelor traiectorie și viteză | * Corelația curbelor traiectorie și viteză | ||
Line 45: | Line 44: | ||
* $Q(u_k)$ - poziții calculate cu formula parametrică a curbei (de ex, Bezier) | * $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)$. | * $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] | + | * 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ă//**: | **2.** **//Căutare binară//**: | ||
* determină poziția într-un vector ordonat, pentru care o valoare dată este egală (sau aproximativ egală) cu o valoare din vector | * determină poziția într-un vector ordonat, pentru care o valoare dată este egală (sau aproximativ egală) cu o valoare din vector | ||
+ | * se poate folosi pentru inspirație metoda prezentată în slide-urile 20 și 21 din cursul 9 (totuși, dacă vectorii corespunzători lui $T(u_i)$, $S(u_i)$, $S(u_k)$ și $Q(u_k)$ sunt deja populați, nu mai e nevoie să se calculeze timpul sau distanța. | ||
| | ||
| | ||
Line 54: | Line 54: | ||
* Se realizează asemanator cu animația de la laboratorul 5 (cu free form deformation) | * Se realizează asemanator cu animația de la laboratorul 5 (cu free form deformation) | ||
* Se stabileste timpul total al animației - timpul de parcurgere a curbei de către un obiect (in secunde) | * Se stabileste timpul total al animației - timpul de parcurgere a curbei de către un obiect (in secunde) | ||
- | * Se stabileste un numar de frame-uri intre care se realizează interpolare liniară (de exemplu, 10 sau 20) | + | * Se stabileste un numar de frame-uri intre care se realizează interpolare liniară (de exemplu, 10 sau 20) - sau se stabilește un interval de interpolare în milisecunde, și se verifică la fiecare frame dacă s-a atins acel interval |
* Când se ajunge la finalul unui interval de interpolare (adica într-un key frame), se determină timpul (cu GetElapsedTime()) | * Când se ajunge la finalul unui interval de interpolare (adica într-un key frame), se determină timpul (cu GetElapsedTime()) | ||
* Atât timp cât nu s-a finalizat animația (timpul curent este mai mic decât timpul total de parcurgere), se determină (prin căutare binară), $u_i$ astfel încât $T(u_i)$ calculat prin formula cubică polinomială să fie egal cu timpul curent | * Atât timp cât nu s-a finalizat animația (timpul curent este mai mic decât timpul total de parcurgere), se determină (prin căutare binară), $u_i$ astfel încât $T(u_i)$ calculat prin formula cubică polinomială să fie egal cu timpul curent | ||
Line 60: | Line 60: | ||
* Se determină $u_k$ (prin căutare binară), astfel încât $S(u_k)$ să fie egal cu $S(u_i)$ care fusese calculat mai devreme | * Se determină $u_k$ (prin căutare binară), astfel încât $S(u_k)$ să fie egal cu $S(u_i)$ care fusese calculat mai devreme | ||
* Dacă s-a determinat $u_k$, atunci se poate afla și $Q(u_k)$ | * Dacă s-a determinat $u_k$, atunci se poate afla și $Q(u_k)$ | ||
- | * Dacă nu suntem într-un key frame, atunci calculăm pozițiile prin interpolare liniară | + | * Dacă nu suntem într-un key frame, atunci calculăm pozițiile prin interpolare liniară între două key frame-uri |
Line 69: | Line 69: | ||
- Să se afișeze curba traiectorie în 3D | - 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 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 poată restarta animația (de exemplu, la apăsarea unei taste) | + | - Să se restarteze animația la apăsarea unei taste |
- | - Să se poată modifica fie curba traiectorie, fie curba de viteză (de exemplu, la apăsarea unei taste) și să se reia animația | + | - Să se modifice curba traiectorie sau curba de viteză la apăsarea unei taste și să se reia animația |
====Barem (Total 250 puncte)==== | ====Barem (Total 250 puncte)==== | ||
Line 80: | Line 80: | ||
- calculul unui parametru $u_k$ care corespunde unei distanțe $S(u_i)$, astfel încât $S(u_k) = 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)$ | - calculul poziției $Q(u_k)$ | ||
- | - Redarea și animația corectă unui obiect pe curba traiectorie (100 puncte) | + | - Redarea și animația corectă unui obiect pe curba traiectorie (60 puncte) |
- | - Restartarea animației: 25 puncte | + | - Restartarea animației: 20 puncte |
- | - Selecția altor curbe de traiectorie / viteză și restartarea animației: 25 puncte | + | - Selecția altor curbe de traiectorie / viteză și restartarea animației: 20 puncte |
====Bonusuri posibile==== | ====Bonusuri posibile==== | ||
- | - Să se modeleze interactiv curbele traiectorie / de viteză prin drag-and-drop pentru punctele de control | + | - Să se modeleze interactiv curbele traiectorie / de viteză prin drag-and-drop al punctelor de control |
- Alte elemente interesante | - Alte elemente interesante | ||
+ | ====Demo==== | ||
+ | |||
+ | <html> | ||
+ | <p style="text-align:center;margin:auto;"> | ||
+ | <iframe width="430" height="250" src="https://www.youtube.com/embed/vrkdHtfRvx0" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> | ||
+ | </p> | ||
+ | </html> | ||