• Nie Znaleziono Wyników

Geometria obrazu

N/A
N/A
Protected

Academic year: 2021

Share "Geometria obrazu"

Copied!
32
0
0

Pełen tekst

(1)

Geometria obrazu

Wykład 9

Renderowanie.

Usuwanie niewidocznych powierzchni.

1. Z-bufor (bufor głębokości).

2. Algorytm malarza.

3. Binary Space Partition 4. Drzewa ósemkowe.

5. Portale.

6. CSG.

7. Niezgodność półpłaszczyznowa.

(2)

Renderowanie (rendering, obrazowanie) - to w grafice trójwymiarowej komputerowa analiza modelu danej sceny i utworzenie na jej podstawie dwuwymiarowego obrazu wyjściowego w formie statycznej lub w formie animacji.

[http://en.wikipedia.org/wiki/Cobalt_(CAD_program)] [http://en.wikipedia.org/wiki/POV-Ray]

(3)

Renderowanie jest wykonywane przez większość programów do grafiki 3D, np.

3D Studio Max (wykorzystany przy „Władcy Pierścieni”) http://www.autodesk.com/products/3ds-max/overview

Lightwave 3D (wykorzystany przy „Titanicu” i „Matrixie”) https://www.lightwave3d.com/

Unreal

https://www.unrealengine.com/what-is-unreal-engine-4 Blender

http://www.blender.org/

Unity

https://unity.com/

(4)

Podstawowe etapy renderingu:

1. Orientacja sceny.

2. Lokalizacja źródeł światła.

3. Rzutowanie na płaszczyznę.

4. Eliminacja niewidocznych powierzchni.

5. Dostosowanie obrazu.

6. Rasteryzacja.

(5)

Usuwanie niewidocznych powierzchni.

Aby stworzyć dwuwymiarowy obraz odpowiadający trójwymiarowej scenie, przede wszystkim musimy określić w każdym pikselu obrazu obiekt, który ma być widoczny w tym pikselu.

W tym celu musimy znaleźć obiekt, który znajduje się najbliżej

obserwatora wzdłuż prostej przechodzącej przez dany piksel (zakładamy, że możemy jednoznacznie przypisać obiekt pikselowi).

[de Berg et al.. „Geometria obliczeniowa. Algorytmy i zastosowania.”]

(6)

Z-bufor.

przekształć scenę tak, aby kierunek

patrzenia był dodatnim kierunkiem osi z;

{Nadaj wszystkim komórkom bufora B (odpowiadającym pikselom obrazu) wartość +}

B[x,y] := +;

for każdy obiekt O sceny do

if z-owa współrzędna punktu obiektu z[O] jest mniejsza od wartości

przechowywanej w odpowiedniej komórce bufora B[x,y]

then B[x,y] := z[O];

z y

x

(7)

W z-buforze przechowujemy informacje na temat położenia najbliższych punktów sceny odpowiadających poszczególnym pikselom obrazu.

W pomocniczym buforze ramki trzymamy informacje o intensywności barwy danego obiektu.

Złożoność algorytmu dla n obiektów wynosi O(n|S|), gdzie |S| określa docelowy rozmiar obrazu.

W celu przyspieszenia obliczeń można zastosować odcinanie tylnych powierzchni (pomijamy analizę ścian, których wektor normalny

skierowany jest przeciwnie do obserwatora).

(8)

Przykład.

W przypadku bliskich lub przecinających się powierzchni (np. kartka papieru na stole) mogą pojawić się zaburzenia obrazu (z-fighting) spowodowane błędami zaokrągleń.

[http://en.wikipedia.org/wiki/z-fighting]

(9)

Algorytm malarza.

uporządkuj elementy sceny względem ich odległości od obserwatora;

for najdalszy obiekt to najbliższy do każdemu pikselowi odpowiadającemu punktowi analizowanego obiektu

przypisz ten obiekt;

Złożoność algorytmu dla n obiektów i obrazu rozmiaru |S| wynosi O(n log n + n|S|).

z y

x

(10)

Niestety nie zawsze daje się uporząd- kować elementy sceny.

Wtedy rozwiązaniem jest podział

elementów sceny na mniejsze kawałki, które można już uporządkować.

(11)

Przykład.

Porównanie prezentowanych metod.

https://www.youtube.com/watch?v=kPxfIXaKKUI

Postarajmy się podzielić przestrzeń zawierającą scenę w taki sposób, aby móc zastosować algorytm malarza.

(12)

6

6 5

5 4

4 3

3 2

Binary Space Partition. 2

Załóżmy, że obiektami sceny są trójkąty a h(t) oznacza płaszczyznę zawierającą t.

Algorytm 3DBSP(S);

Dane: zbiór S={t1, ..., tn} trójkątów w R3. Wynik: drzewo BSP dla S.

if card(S)  1

then stwórz drzewo T, w którym pamiętamy S;

return T

else S+{t h(t1)+: t S}; T+ 3DBSP(S+);

S-{t h(t1)-: t S}; T- 3DBSP(S-);

Stwórz drzewo T z korzeniem v,

poddrzewami T+ i T- oraz S(v) = {t  T : t  h(T)};

return(T);

1

1

(13)

Możemy nieco zmodyfikować poprzedni algorytm.

Algorytm 3DRANDOMBSP(S);

Dane: zbiór S={t1, ..., tn} trójkątów w R3. Wynik: drzewo BSP dla S.

Wygeneruj losową permutację t1, ..., tn; for i := 1 to n do

użyj h(ti) do podziału każdej komórki, na którą podział ma wpływ;

(14)

Definicja.

Podział płaszczyzny prostymi nazywamy układem prostych. Obszary układu pro- stych sąsiadujące z daną prostą nazywa- my strefą tej prostej.

Twierdzenie (strefowe).

Złożoność strefy dla prostej w układzie m prostych wynosi O(m).

(15)

Twierdzenie.

Oczekiwana liczba obiektów tworzonych przez algorytm 3DRANDOMBSP wynosi O(n2).

Dowód.

Oszacujmy oczekiwaną liczbę fragmentów, na które jest rozcinany dany trójkąt tk  S. Niech dla trójkąta ti, gdzie i < k, li = h(ti)  h(tk).

Dla prostych li, które przecinają tk definiujemy si = li  tk.

Jeśli lk-1 dzieli tk, to nowe podziały powstają tylko w ścianach dotych-

czasowego podziału, które sąsiadują z krawędziami tk. Podobnie jest dla pozostałych prostych.

Z twierdzenia strefowego wynika, że liczba krawędzi w strefie wyznaczanej przez k prostych wynosi O(k). Zatem krawędzie trójkąta tk należą do ścian podziału mających w sumie O(k) krawędzi. Stąd średnia liczba podziałów ścian przecinanych przez si jest stała, czyli trójkąt tk jest

dzielony na średnio O(k) elementów. Stąd oczekiwana całkowita liczba fragmentów podziału jest kwadratowa.

(16)

Przykład.

https://www.youtube.com/watch?v=yTRzfKh4Tg0

(17)

Drzewo ósemkowe.

Konstrukcja drzewa ósemkowego jest podobna do konstrukcji drzewa

czwórkowego i polega na otoczeniu

całości trójwymiarowej sceny sześcianem (lub prostopadłościanem), który następnie dzielony jest na osiem przystających

części. Proces ten jest rekurencyjnie

powielany aż do otrzymania jednorodnych elementów.

Najczęściej boki sześcianu są równoległe do osi układu współrzędnych co ułatwia obliczenia.

(18)

Zastosowanie drzew ósemkowych.

1. Efektywna reprezentacja voxeli (przechowujemy grupy jednorodnych voxeli).

2. Odrzucanie niewidocznych obiektów (dla scen ograniczonych).

Algorytm.

Zacznij analizę od korzenia drzewa.

Jeśli sześcian odpowiadający danemu węzłowi drzewa jest niewidoczny z pozycji obserwatora, to niewidoczne jest całe poddrzewo.

Jeśli przynajmniej część sześcianu odpowiadającego danemu węzłowi drzewa jest widoczna, to analizuj węzły poddrzewa odpowiadające widocznym sześcianom.

Jest to inny sposób analizy niż w przypadku drzew BSP, gdyż nie korzysta się tu z algorytmu malarskiego.

(19)

3. Wykrywanie kolizji obiektów (badamy minimalne sześciany zawierające dane obiekty).

4. Kwantyzacja kolorów (algorytm Gervautz & Purgathofer 1988).

Kodujemy kolory na i-tym poziomie drzewa przez 4r+2g+b, gdzie r, g, b są i-tymi znaczącymi bitami odpowiednich barw. Tworzymy ścieżki do liści odpowiadających kolorom występującym w obrazie. Dostajemy drzewo o głębokości co najwyżej 8. Chcąc zmniejszyć liczbę kolorów postępujemy w następujący sposób:

- usuwamy pojedyncze liście o największej głębokości,

- łączymy sąsiadujące liście odpowiadające małej liczbie pikseli (minimalizujemy błąd),

- usuwamy liście odpowiadające największej liczbie pikseli (zaburzamy nieco kolor, ale zyskujemy na rozmiarze drzewa).

Kończymy, gdy liczba kolorów będzie zgodna z oczekiwaniami.

(20)

Portale.

Rozważmy podział przestrzeni na wielo- ścienne obszary (sektory).

Ściany wielościanów mogą być przepusz- czalne lub nie.

Przepuszczalne ściany nazywamy portalami.

Umożliwiają one przejście między obszarami (stanowią relację widzialności między

obszarami).

W celu renderowania sceny tworzymy graf sąsiedztwa dla obszarów podziału i badamy obiekty widoczne przez portale (badając kolejne obszary lub ich widzialne wycinki).

Jest to dość kosztowne rozwiązanie.

(21)

Portale mają tę własność, że jeśli portal jest niewidoczny, to niewidoczny jest również obszar za nim.

Z drugiej strony, umożliwiają analizę odbić lustrzanych.

Podczas renderowania można skorzystać z PVS (Potentially Visible Sets – można je używać również z drzewami BSP i OCT ) - w tym celu z

wyprzedzeniem renderujemy sąsiednie sektory (lub ich fragmenty), aby móc z nich szybko skorzystać w przypadku dojścia do nich.

Pozwala to na płynne przejścia między sektorami, ale zwiększa złożoność (nie wszystkie sąsiednie sektory muszą być odwiedzone.

Idealnym byłby podział na małe (mało obiektów do identyfikacji), wypukłe (łatwość obróbki) sektory.

Gdy obserwator widzi kolejne sektory poprzez portale, powstaje piramida widzenia.

(22)

procedure portal-render(S)

for każdy portal P należący do S do if P jest widoczny then

begin

S’ := sektor sąsiadujący z S przez P;

portal-render(S’);

end;

Algorytm

S := sektor, w którym znajduje się obserwator;

portal-render(S);

(23)

Przykłady.

PVS:

https://www.youtube.com/watch?v=TMeUxF4mHJA https://www.youtube.com/watch?v=oTNzjxlli0o

Pomijanie zbytecznych portali:

https://www.youtube.com/watch?v=cUAAqGlBYu0 Piramida widzenia:

https://www.youtube.com/watch?v=_SmPR5mvH7w

(24)

Renderowanie jest znacznie łatwiejsze, gdy scena jest opisana z pomocą CSG.

CSG (Constructive Solid Geometry) jest techniką definiowania nowych brył poprzez łączenie innych brył z pomocą regularyzowanych operatorów

boolowskich (sumy, iloczynu i różnicy).

Regularyzowany operator ma postać:

domknięcie(wnętrze(A op B)), gdzie op oznacza dany operator.

Wynikiem takich działań jest zawsze niezdegenero-

wana (posiadająca objętość) bryła lub zbiór pusty. [Wikipedia]

Przykład.

https://www.youtube.com/watch?v=QCrYXr0vJpE

(25)

Algorytm znajdywania różnicy.

Dane: Dwa wielościany wypukłe A, B.

Wynik: A-B.

1. Sprawdź, czy A  B. Jeśli tak – KONIEC (wynik jest zbiorem pustym).

2. Sprawdź, czy dana ściana B przecina A:

a) Nie – zbadaj kolejną ścianę,

b) Tak – podziel A płaszczyzną zawiera-jącą daną ścianę;

zachowaj część A w półprzestrzeni rozłącznej z B;

A:= A  półprzestrzeń zawierająca B;

zbadaj kolejną ścianę B;

c) Jeśli sprawdziłeś wszystkie ściany, to połącz zachowane fragmenty – KONIEC

http://warsztat.gd/wiki/text/Constructive%20Solid%20Geometry%20(CSG)%20part%20I

(26)

Algorytm znajdywania przecięcia.

Dane: Dwa wielościany wypukłe A, B.

Wynik: A  B.

1. Sprawdź, czy A  B. Jeśli tak – KONIEC (przecięciem jest A).

2. Sprawdź, czy dana ściana B przecina A:

a) Nie – zbadaj kolejną ścianę,

b) Tak – podziel A płaszczyzną zawiera-jącą daną ścianę;

odrzuć część A w półprzestrzeni rozłącznej z B;

A:= A  półprzestrzeń zawierająca B;

zbadaj kolejną ścianę B;

c) Jeśli sprawdziłeś wszystkie ściany – KONIEC.

http://warsztat.gd/wiki/text/Constructive%20Solid%20Geometry%20(CSG)%20part%20I

(27)

Zastosowania CSG.

1. Tworzenie obiektów o prostym kształcie (będących kompozycją obiektów bazowych tzw. prymitywów – np. prostopadłościan, kula, stożek, ostrosłup itp.).

2. Usuwanie niewidzialnych powierzchni.

3. Konstrukcja portali.

Przykłady.

https://www.youtube.com/watch?v=N1Vzv6AZYB0 https://libfive.com/examples/

(28)

Problemy renderowania.

Gdy dany piksel nie jest zawarty w całości w rzucie jednego z elementów sceny, powstaje problem, któremu z elementów sceny powinniśmy go przypisać.

Zwykle jest to obiekt, którego rzut zajmuje największą powierzchnię piksela. Ale tego nie da się stwierdzić z pomocą jednego promienia.

Również użycie dużej wiązki regularnie rozłożonych promieni nie daje dobrego rezultatu, gdyż pojawia się wtedy efekt aliasingu, który w

niekorzystny sposób oddziaływuje na zmysły obserwatora.

Zatem należy zastosować losową wiązkę promieni. Mając do dyspozycji kilka wiązek możemy zdecydować, którą wybrać posługując się miarą niezgodności półpłaszczyznowej.

(29)

Przykład.

Zbiór punktów próbnych Obraz Powiększenie obrazu

(30)

Niezgodność półpłaszczyznowa.

Chcemy sprawdzić, który z losowych układów promieni jest najlepszy.

Niech U = [0,1][0,1] oraz niech S będzie zbiorem punktów próbnych w U.

Niech H oznacza zbiór wszystkich domkniętych półpłaszczyzn przecina- jących U oraz h  H.

(h) = pole powierzchni h  U

S(h) = card(h  U  S) / card(S)

S(h) = |(h) - S(h)|

Niezgodność półpłaszczyznową definiujemy jako:

H(S) = suphHS(h) (h) = 0,25SS(h) = 0,3(h) = 0,05

(31)

Określanie niezgodności półpłaszczyznowej.

1.Wystarczy badać półpłaszczyzny, których brzeg zawiera punkty ze zbioru S.

2.Wartości S(h) są określane przez proste przechodzące przez pary

punktów ze zbioru S (punkty graniczne nie należą do badanego obszaru) . 3.Dla każdej z krawędzi łatwo można obliczyć wartość (h), a co za tym idzie S(h) i H(S).

Wniosek.

Dla danego zbioru n punktów próbnych S niezgodność półpłaszczyznową

H(S) można obliczyć w czasie O(n2).

Wybieramy te próbki, dla których niezgodność półpłaszczyznowa jest najmniejsza.

(32)

Dziękuję za uwagę.

Cytaty

Powiązane dokumenty

Jest to model wynikający z właściwości odbiorczych ludzkiego oka, w którym wrażenie widzenia dowolnej barwy można wywołać przez zmieszanie w ustalonych proporcjach trzech

Obraz dzieli się na obszary zatopione i nie, które wyznaczają podział „geodezyjny”.. W zależności od wybranej strategii otrzymujemy

gradientu (prostopadłego do szukanej krawędzi), dla których wartość gradientu nie jest większa (lub jednostronnie równa) od wartości gradientu sąsiadów.. W ten sposób

3.Wyznaczamy zbiór S’ lokalnych minimów w triangulacji Delaunay oraz podzbiór E’ zbioru E krawędzi, które łączą punkty z S’ z punktem o..

Drzewo, które pozostanie na liście, jest nazywane drzewem Huffmana – prawdopodobieństwo zapisane w korzeniu jest równe 1, natomiast w liściach drzewa zapisane są symbole.

dla każdego źródła światła sprawdź, czy istnieje promień odbijający się w danym punkcie w kierunku obserwatora, jeśli tak, to oblicz parametry odbicia;.. jeśli promień

Punkt p znajduje się w półcieniu, gdy źródło światła jest częściowo widoczne z tego punktu.. Punkt p znajduje się w antycieniu, gdy całe źródło światła jest widoczne

- bottom-up : najpierw znajdujemy bryły ograniczające małe grupy bliskich obiektów, a następnie łączymy je w coraz większe zbiory, - top-down : znajdujmy bryłę