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:

  1. Transformare spațială: maparea pixelilor din imaginea sursă în imaginea intermediară
  2. Transformare de culoare: calculul culorii fiecărui pixel din imaginea intermediară, prin amestecul culorilor din imaginea sursă și din cea destinație

Transformarea folosind o rețea de triunghiuri

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

  1. Pentru fiecare imagine intermediară
    1. 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
    2. pentru fiecare triunghi al imaginii intermediare
      1. se calculează culorile vârfurilor triunghiului prin interpolare liniară între culorile vârfurilor corespondente din imaginea sursă și cea destinație
      2. se determină adresele pixelilor interiori triunghiului (rasterizare triunghi)
      3. pentru fiecare pixel interior
        1. se determină adresele pixelilor corespunzători din imaginea sursă, $P_s$, și cea destinație, $P_d$, folosind coordonatele baricentrice ale lui $P_i$.
        2. 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:

  • Se calculează adresele pixelilor $P_s$ și $P_d$ care au aceleași coordonate baricentrice în triunghiurile corespondente din imaginea sursă și cea destinație:

$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

  • Mesh* createQuad(const char *name) 
  • în Update() se vor desena 3 astfel de quad-uri, fiecare pe o treime din viewport

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

  • bool Baricentric(glm::vec2 pos, glm::vec2 v0, glm::vec2 v1, glm::vec2 v2, float &u, float &v, float &w)
  • intoarce true dacă poziția punctului e în interiorul triunghiului
  • calculează coordonatele baricentrice

Calculul imaginii intermediare

  • void ModifyImage(int crt_iteration, int iterations)
  • calculează vârfurile rețelei intermediare prin interpolare
  • pentru fiecare pixel din imaginea intermediară
    • calculează triunghiul care îl conține
    • determină triunghiurile corespondente din imaginea sursă, respectiv din imaginea destinație
    • calculează coordonatele baricentrice
    • calculează pixelii corespondenți din imaginea sursă, respectiv din imaginea destinație
    • calculează culoarea pixelului curent prin interpolare între culorile pixelilor corespondenți din imaginea sursă, respectiv din imaginea destinație

Cerințe laborator

  1. 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
  2. Să se calculeze vârfurile rețelei intermediare prin interpolare, pentru imaginea intermediară curentă
  3. Să se determine vârfurile triunghiului care conține pixelul curent
  4. Să se calculeze vârfurile triunghiurilor corespondente triunghiului curent (din imaginea sursă și cea destinație)
  5. Să se calculeze coordonatele punctelor corespondente punctului curent (din imaginea sursă și cea destinație)
  6. Să se calculeze culoarea pixelului curent prin interpolare între culorile pixelilor corespondenți din imaginea sursă, respectiv din imaginea destinație

Bonusuri posibile

  • Optimizarea procesării pixelilor
    • în loc de parcurgerea pixel cu pixel și căutarea triunghiului care conține pixelul curent, ar trebui realizată parcurgerea triunghi cu triunghi și rasterizara fiecărui triunghi

Demo

vdvac/lab4.txt · Last modified: 2024/04/10 14:21 by anca.morar
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0