Laboratorul 4
Animații prin transormări spațiale de imagini
Animația prin transformări spațiale de imagini calculează o secvență de imagini care redau transformarea treptată a imaginii sursă în imaginea destinație. Fiecare imagine este un cadrul al filmului animației.
Concepte teoretice
Generarea unei imagini intermediare presupune:
Transformare spațială: maparea pixelilor din imaginea sursă în imaginea intermediară
Transformare de culoare: calculul culorii fiecărui pixel din imaginea intermediară, prin amestecul culorilor din imaginea sursă și din cea destinație
Intrarea algoritmului:
imaginea sursă și imaginea destinație
2 seturi de puncte de control care formează 2 rețele de triunghiuri
pozițiile punctelor de control în cele 2 imagini
corespondența punctelor în imaginea sursă și imaginea destinație
în cadrul laboratorului - dam ca intrare și corespondența între triunghiurile dintre cele două rețele
numărul de imagini de generat
Pașii algoritmului
Pentru fiecare imagine intermediară
se determină o rețea de triunghiuri, ale cărei vârfuri se obțin prin interpolarea liniară între vârfurile rețelelor din imaginea sursă și imaginea destinație
pentru fiecare triunghi al imaginii intermediare
se calculează culorile vârfurilor triunghiului prin interpolare liniară între culorile vârfurilor corespondente din imaginea sursă și cea destinație
se determină adresele pixelilor interiori triunghiului (rasterizare triunghi)
pentru fiecare pixel interior
se determină adresele pixelilor corespunzători din imaginea sursă, $P_s$, și cea destinație, $P_d$, folosind coordonatele baricentrice ale lui $P_i$.
se calculează culoarea pixelului $P_i$ prin interpolare liniară între culorile pixelilor $P_s$ și $P_d$
Calculul coordonatelor baricentrice ale unui pixel, $P_i$:
$V_0$, $V_1$, $V_2$ formează un contur orientat trigonometric
$V_0$ e vârful de $y$ minim, $V_2$ e vârful de $y$ maxim
Coordonatele baricentrice ale lui $P_i$
Calculul adresei unui pixel folosind coordonatele baricentrice:
$P_s = u \cdot V_{s_0} + v \cdot V_{s_1} + w \cdot V_{s_2} + 0.5$
$P_d = u \cdot V_{d_0} + v \cdot V_{d_1} + w \cdot V_{d_2} + 0.5$
Implementare
Atribute
texturile 2D pentru imaginea sursă, imaginea destinație și imaginea intermediară
Texture2D* sourceImage, * destImage, * interImage;
suprafețele triunghiulare ce reprezintă rețelele de triunghiuri în cele 3 imaigni
Mesh* sourceNet, * destNet, * interNet;
numărul de interații
int iterations;
int counter;
numărul imaginii intermediare curente
int counter;
Metode
Crearea unui quad mare cât NDC
Generarea rețelelor de triunghiuri din imaginile sursă și destinație
void createNet(const string &path, const char *fileName)
se citesc din fișier perechile pe puncte de control din cele două rețele (cu care se completează vectorii vertices
)
se citesc indicii pentru triunghiurile formate (cu care se completează vectorul indices
)
Calculul coordonatelor baricentrice
Calculul imaginii intermediare
Cerințe laborator
Să se completeze funcția Baricentric()
astfel încât să calculeze corect ariile din triunghi (aria totală și ariile parțiale determinate de punctul curent) și să se calculeze coordonatele baricentrice
Să se calculeze vârfurile rețelei intermediare prin interpolare, pentru imaginea intermediară curentă
Să se determine vârfurile triunghiului care conține pixelul curent
Să se calculeze vârfurile triunghiurilor corespondente triunghiului curent (din imaginea sursă și cea destinație)
Să se calculeze coordonatele punctelor corespondente punctului curent (din imaginea sursă și cea destinație)
Să se calculeze culoarea pixelului curent prin interpolare între culorile pixelilor corespondenți din imaginea sursă, respectiv din imaginea destinație
Bonusuri posibile
Demo