Professional Documents
Culture Documents
Projekt1 Glegoła 200811
Projekt1 Glegoła 200811
Projekt1 Glegoła 200811
komunikacja z komputerem
Semestr letni 2021/22
Projekt nr 1
Dominik Glegoła
Numer albumu: 200811
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).
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).
Drugi trójkąt
Kąt ROLL pozostaje zerowy (brak obrotu).
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
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
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
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
„Właściwy” obraz
Obraz głębi
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
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:
Jak numerycznie wyznaczyć, czy dany punkt (a, b) leży wewnątrz trójkąta?
Narożniki trójkąta:
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:
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