Projekt1 Glegoła 200811

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 9

Grafika komputerowa i

komunikacja z komputerem
Semestr letni 2021/22
Projekt nr 1

Implementacja wybranych algorytmów


grafiki komputerowej

Dominik Glegoła
Numer albumu: 200811

Inżynieria Systemów Informatycznych


Szkoła Główna Gospodarstwa Wiejskiego
22 kwietnia 2022
TERMIN ODDANIA: 24 kwietnia 2022

Pracę należy złożyć na stronie internetowej Moodle przedmiotu. Praca po-


winna być w postaci folderu skompresowanego do pojedynczego pliku (najlepiej
w formacie ZIP lub RAR). Folder powinien zawierać pliki przedstawiające:

ˆ Krótką charakterystykę zadania, rozważane warianty rozwiązań (jeśli było


kilka wariantów) oraz opis zrealizowanego rozwiązania.
ˆ Kod (źródłowy lub aplikacja, wraz z instrukcją umożliwiającą uruchomie-
nie).
ˆ Uzyskane wyniki.

Zalecana nazwa skompresowanego pliku:


Projekt1_<Nazwisko>_<nr.albumu>.zip/rar

1 Zadanie
Dane są dwa nieprzeźroczyste trójkąty umieszczone w przestrzeni trójwymiaro-
wej XYZ:

1. Narożniki trójkąta: (2, 0, 0) , (−1, −1, 2) , (−1, 1, −2). Kolor trójkąta czer-
wony: RGB = (255, 0, 0).
2. Narożniki trójkąta: (0, −2, 0) , (−1, 2, 1) , (1, 2, −1). Kolor trójkąta zielony:
RGB = (0, 255, 0).

Trójkąty te obserwowane są przez kamerę o ogniskowej f = 5.


Oś kamery pokrywa się z osią OZ, środek obrazu Oi umieszczony jest w punkcie
(0, 0, −10), a osie układu współrzędnych obrazu Oi Xi Yi skierowane są jak na
rysunku 1.

Rysunek 1: Oś kamery

1
1.1 CZĘŚĆ 1
Wygeneruj obraz cyfrowy pobrany przez kamerę. Rozdzielczość obrazu wynosi
640x480, a rozmiar pojedynczego pixela to 0.01x0.01.
Zakładamy, że tło sceny jest czarne, tzn. RGB = (0, 0, 0).

1.2 CZĘŚĆ 2
Oba trójkąty w sposób ciągły zmieniają swoje położenie. Każdy z nich obraca
się wokół środka układu współrzędnych (wartości kątów podane są w stopniach)
i przesuwa w następujący sposób:

Pierwszy trójkąt
ˆ Kąt ROLL zmienia się od ZERA do wielkości określonej liczbą złożoną
z piątej i szóstej cyfry Twojego numeru albumu (i z powrotem).

ˆ Kąt PITCH zmienia się od ZERA do wielkości określonej liczbą złożo-


ną z szóstej i piątej cyfry Twojego numeru indeksu (i z powrotem).
ˆ Kąt YAW pozostaje zerowy (brak obrotu).

ˆ Przesunięcie opisywane jest wektorem zmieniającym się od [0, 0, 0] (brak


przesunięcia) do [1, 1, 1] (i z powrotem).

Drugi trójkąt
ˆ Kąt ROLL pozostaje zerowy (brak obrotu).

ˆ Kąt PITCH zmienia się od ZERA do wielkości określonej liczbą złożo-


ną z piątej i szóstej cyfry Twojego numeru indeksu (i z powrotem).
ˆ Kąt YAW zmienia się od ZERA do wielkości określonej liczbą złożoną
z szóstej i piątej cyfry Twojego numeru indeksu (i z powrotem).

ˆ Przesunięcie opisywane jest wektorem zmieniającym się od [0, 0, 0] (brak


przesunięcia) do [1, 1, −1] (i z powrotem).
Wszystkie ruchy są ze sobą zsynchronizowane tak, że przejście z konfigura-
cji początkowej do konfiguracji końcowej realizowane jest w 100 krokach (dla
wszystkich parametrów
transformacji). Powrót do konfiguracji początkowej też realizowany jest w 100
krokach. Wygeneruj krótki cyfrowy film animowany wizualizujący trzy- lub czte-
rokrotne powtórzenie opisanej powyżej sekwencji ruchów obu trójkątów.
Zakładamy takie samo położenie kamery i parametry obrazu jak w Części 1,
tzn. rozdzielczość klatek filmu wynosi 640x480, a rozmiar pojedynczego pixela
to 0.01x0.01.

1.3 CZĘŚĆ 3 (opcjonalna)


Zrealizuj Część 1 oraz Część 2 przy założeniu, że trójkąty są półprzeźroczy-
ste, tzn. wyświetlany kolor danego pixela składa się w 75% z koloru bliższego

2
trójkąta oraz w 25% z koloru drugiego planu (który może być albo kolorem dal-
szego trójkąta, albo kolorem tła). Zwróć uwagę, że dalszy trójkąt również jest
półprzeźroczysty, a więc jego kolor też jest taką samą kombinacją jego własnego
koloru i koloru tła.
Dla urozmaicenia zrealizuj tę część zakładając inny niż czarny kolor tła (np.
niebieski, tzn. RGB = (0, 0, 255).

2 Wstęp teoretyczny
2.1 Transformacje 3-wymiarowe
Formalnie, 3D przemieszczenie obiektu można interpretować jako przekształce-
nie układu współrzędnych (przypisanego do tego obiektu) z początkowej kon-
figuracji X0 Y0 Z0 do docelowej konfiguracji X1 Y1 Z1 . Najpierw układ zmienia
orientację, a następnie przesuwa się o wektor

P01 = [tx , ty , tz ] (1)

Zmiany położenia obiektów we współrzędnych trójwymiarowych również naj-


wygodniej jest opisywać jednorodnymi macierzami transformacji .
Obrót opisywany jest częścią rotacyjną R3x3 macierzy transformacji, a przesu-
nięcie częścią pozycyjną (czwarta kolumna):
 
r11 r12 r13 tx
 r21 r22 r23 ty 
HT =  r31 r32 r33 tz 
 (2)
0 0 0 1

Jak wygodnie/intuicyjnie definiować orientację (obrót) obiektu w przestrzeni 3-


wymiarowej?
Należy zauważyć, że kolumny podmacierzy obrotu wyznaczają orientację wekto-
rów jednostkowych (wersorów) osi „nowego” układu współrzędnych w „starym”
układzie współrzędnych:

2.2 Notacja RPY


Notacja RPY (roll-pitch-yaw, czyli przechylenie-pochylenie-odchylenie) to intu-
icyjnie zrozumiała, a zarazem w pełni formalna metoda definiowania obrotów
trójwymiarowych. Obrót docelowego układu X3 Y3 Z3 w stosunku do począt-
kowego układu X0 Y0 Z0 jest realizowany jako sekwencja trzech obrotów wokół
wybranych osi:
ˆ Roll jest obrotem wokół osi Z0 (o kąt θ1 ). W wyniku otrzymujemy układ
X1 Y1 Z1 .
ˆ Pitch jest obrotem wokół osi Y0 (o kąt θ2 ). W wyniku otrzymujemy układ
X2 Y2 Z2 .
ˆ Yaw jest obrotem wokół osi X0 (o kąt θ3 ). W wyniku otrzymujemy układ
X3 Y3 Z3 .

3
Cały obrót jest sekwencją obrotów Roll, Pitch i Yaw, i jest reprezentowany
iloczynem poszczególnych macierzy obrotu:
 
cosθ1 −sinθ1 0
R (θ1 ) =  sinθ1 cosθ1 0  (3)
0 0 1
 
cosθ2 0 sinθ2
R (θ2 ) =  0 1 0  (4)
−sinθ2 0 cosθ2
 
1 0 0
R (θ3 ) =  0 cosθ3 −sinθ3  (5)
0 sinθ3 cosθ3
Po wymnożeniu macierzy obrotu, oraz połączeniu wyniku z przesunięciem otrzy-
mujemy pełną macierz transformacji we współrzędnych jednorodnych.
 
C1 C2 C1 S2 S3 − S1 C3 C1 S2 C3 + S1 S3 px
 S1 C2 S1 S2 S3 + C1 C3 S1 S2 C3 − C1 S3 py 
H=  −S2
 (6)
C2 S3 C2 C3 pz 
0 0 0 1

gdzie C1 = cosθ1 , S1 = sinθ1 , itd.

2.3 Transformacje z 3D do 2D
Reprezentacja świata w 2D wymaga transformacji z 3D do 2D. Takimi transfor-
macjami są rzutowania (np. rzutowanie w kierunku osi Z pewnego układu współ-
rzędnych). Najczęściej układ ten jest przypisany do (prawdziwej lub wirtualnej)
kamery. Oś kamery pokrywa się z osią Z (czyli współrzędna Z reprezentuje „głę-
bię” przestrzeni) a płaszczyzna XY jest płaszczyzną, na której tworzony jest
rzutowany obraz.
W praktyce, najczęściej stosuje się uproszczony model kamery (pomijamy śred-
nicę obiektywu) opisywany rzutowaniem perspektywicznym. Zakładamy, że obiek-
tyw (zredukowany do pojedynczego punktu) znajduje się na osi Z w odległości
f (ogniskowa kamery) od płaszczyzny obrazu. Taką kamerę we współrzędnych
jednorodnych opisujemy macierzą
 
1 0 0 0
 0 1 0 0 
H=  0 0 0 0 
 (7)
1
0 0 −f 1

Jeżeli chcemy odtworzyć rzeczywiste współrzędne to musimy skorzystać z


odwrotnego rzutowania perspektywicznego. Jeśli znamy głębie danego pixela
na obrazie, to jego współrzędne 3D można wyznaczyć stosując macierz

1 0 0 0
 
 0 1 0 0 
H=
 0 0 f fz  (8)
f −z

f
0 0 1 f −z

4
2.4 Eliminacja elementów zasłoniętych
Przy generacji obrazów przedstawiających obiekty 3D, każdy wielokąt powierzch-
ni obiektu może być zrzutowany na 2D obraz wg przedstawionych transformacji
z 3D do 2D. Problemem jest jednak to, że nie wszystkie takie wielokąty powinny
być rzeczywiście wyświetlone:
1. Niektóre z nich fizycznie zwrócone są w przeciwną stronę niż w stronę
kamery

2. Nawet jeśli są „właściwie” zwrócone, mogą być całkowicie lub częściowo


przysłonięte przez wielokąty znajdujące się bliżej kamery.
Usuwanie takich zbędnych fragmentów określamy mianem eliminacji elemen-
tów zasłoniętych.

Ad 1. Każdy wielokąt (np. trójkąt) ma zdefiniowany kierunek wektora normal-


nego do jego widocznej powierzchni.
Jeżeli składowa Z tego wektora skierowana jest w stronę kamery (tzn. jest ujem-
na) wielokąt może być wyświetlony na obrazku, w przeciwnym wypadku należy
go zignorować. Może on jednak nadal przysłaniać inne wielokąty znajdujące się
dalej od kamery

Ad . Wielokąty mogą się (częściowo) wzajemnie przesłaniać.


Powszechnie stosowaną metodą wyznaczania, które wielokąty lub ich fragmenty
powinny być wyświetlane, to tzw. algorytm z-bufora.

2.5 Algorytm z-bufora


Z-bufor, zwany czasem buforem głębi, jest metodą, w której kolor/jasność każ-
dego pixela na obrazie jest wyznaczany niezależnie od innych pixeli. Algorytm
używa dwóch kopii tworzonego obrazu:

ˆ „Właściwy” obraz

ˆ Obraz głębi

Liczba operacji wykonywanych dla każdego pixela jest proporcjonalna do liczby


wielokątów w wykorzystywanym modelu, tzn. złożoność obliczeniowa metody
jest O (NxK), gdzie jest N liczbą pixeli w obrazie, a K liczbą wielokątów

Pseudo-kod (dla jednego pixela o współrzędnych (i,j))


1. Ustaw początkową maksymalną głębię pixela (i, j) tzn, d(i, j) = ∞

2. Ustaw początkowy kolor (kolor tła) pixela (i, j) c(i, j) = kolor tła
3. Dla każdego wielokąta wykonaj następujące kroki:
(a) jeśli pixel (i, j) znajduje się wewnątrz rzutu wielokąta na obraz
i. znajdź w wielokącie głębię dla punktu (x, y) odpowiadającego
pixelowi (i, j)
ii. if (z < d (i, j))

5
A. d (i, j) = z;
B. c (i, j) = kolor wielokąta;

Istotne elementy

Ad 3a. Ponieważ wielokąty są najczęściej trójkątami, należy zastosować dowolny


algorytm sprawdzający, czy dany pixel znajduje się wewnątrz trójkąta.

Ad 3(a)iiiD. Równanie płaszczyzny w przestrzeni wynosi:

Ax + By + Cz + D = 0 (9)

Ponieważ odległość mierzona jest wzdłuż dodatniej części osi Z (od punktu dla
którego z = 0), wystarczy obliczyć (zauważ, że C nie ma prawa być równe zeru)
Axi + Byj + D
z= (10)
−C
Jeśli w przypadku rzutowania prespektywicznego płaszczyzna jest zdefiniowana
przez trzy punkty:

(x1 , y1 , z1 ) , (x3 , y3 , z3 ) , (x3 , y3 , z3 )

to równanie (9) jest równoważne równaniu:


 
x y z 1
 x1 y1 z1 1 
det 
 x2 y2 z2
=0 (11)
1 
x3 y3 z3 1

Dzięki temu możemy w łatwy sposób obliczyć parametry A, B, C, D równania.


Najłatwiej będzie wykorzystać rozwinięcie Laplace’a.

Jak numerycznie wyznaczyć, czy dany punkt (a, b) leży wewnątrz trójkąta?
Narożniki trójkąta:

P1 = (x1 , y1 ) , P2 = (x2 , y2 ) , P3 = (x3 , y3 )

Wyznaczamy trzy proste:

Ax2 + By2 + Cz2 = 0, prosta P1 P3

Ax1 + By1 + Cz1 = 0, prosta P2 P3


Ax3 + By3 + Cz3 = 0, prosta P1 P2
Punkt (a, b) leży wewnątrz (lub na krawędzi) trójkąta, jeśli spełnia poniższe
warunki:
(A1 x1 + B1 y1 + C1 ) (A1 a + B1 b + C1 ) ­ 0
(A2 x2 + B2 y2 + C2 ) (A2 a + B2 b + C2 ) ­ 0 (12)
(A3 x3 + B3 y3 + C3 ) (A3 a + B3 b + C3 ) ­ 0

6
Jak wyznaczyć punkt przecięcia płaszczyzny i prostej w 3D?

Prosta x = x0 + l ∗ t, y = y0 + m ∗ t, z = z0 + n ∗ t

Płaszczyzna Ax + By + Cz + D = 0

Punkt precięcia

x̄ = x0 − l ∗ ρ, ȳ = y0 − m ∗ ρ, z̄ = z0 − n ∗ ρ
gdzie
(13)
Ax0 + By0 + Cz0 + D
ρ=
Al + Bm + Cn
Trzeba pamiętać, że w przypadku rzutu perspektywicznego wektor kierunko-
wy jest to wektor od punktu (x, y) w kierunku środka obiektywu kamery,a w
przypadku rzutu równoległego jest to wektor jedsnotkowy osi Z.

3 Rozwiązanie zadania
Struktura algorytmu składa się z jednej głównej funkcji, którą wykorzystuje w
zadaniu 1.1 i 1.2 oraz funkcji pomocniczych dla mniejszych algorymtów.

Pseudo-kod algorytmu
1. Przygotowanie danych:
(a) współrzędne jednorodne wierzchołków trójkątów t1 oraz t2 w postaci
macierzy;
(b) kolory trójkątów t1 , t2 oraz kolor tła w postaci wektorów RGB;
(c) perspektywę kamery uwzględniającą ogniskową f ;
(d) rozdzielczość obrazu X × Y oraz rozmiar pixela;
(e) notacja RPY oraz przesunięcie w postaci wektorów dla trójkątów
t1 , t2 .
2. Przygotowanie VideoWriter.
3. Główna funkcja - funkcja generująca kaltki przesunięcia trójkątów oraz
zapisująca je w VideoWriterze:

(a) dla każdej klatki n wykonaj następujące kroki


i. wyznaczenie współrzędnych jednorodnych wierzchołków trójką-
tów;
ii. generowanie obrazów trójątów t1 , t2 ;
iii. zastosowanie zmodyfikowanego algorytmu z-bufora
A. Ustaw początkową maksymalną głębię pixela (i, j) tzn, d(i, j) = ∞
B. Ustaw początkowy kolor (kolor tła) pixela (i, j) c(i, j) = kolor tła
C. jesli pixel znajduje się wewnątrz rzutu obu trójkątów to:

7
ˆ znajdź w wielokątach głębię dla punktu (x, y) odpowiada-
jącego pixelowi (i, j)
ˆ ustaw kolor tła pixela na 25% tła oraz 75% tła dalszego
trójkąta
ˆ ustaw kolor tła pixela na 25% nowopowstałego tła oraz
75% tła bliższego trójkąta
D. jesli pixel nie znajduje się wewnątrz rzutu obu trójkątów to
powtórz dla obu trójkątów następujące kroki:
ˆ znajdź w wielokącie głębię dla punktu (x, y) odpowiadają-
cego pixelowi (i, j)
ˆ if (z < d (i, j))
– d (i, j) = z;
– c (i, j) = kolor wielokąta;
(b) zapisz klatkę w VideoWriter.
4. Ćwiczenie 1 - wykorzystując funkcję powyzej wygeneruj jedną klatkę oraz
wyświetl.
5. Ćwiczenie 2 - dla każdego powtórzenia wykonuj:
(a) wywołaj funkcję z parametrami przesunięcia do wybranego położenia
(b) wywołaj funkcję z parametrami przesunięcia do położenia początko-
wego

You might also like