Laboratorium elementów grafiki komputerowej, ćwiczenie 3b Wizualizacja obiektów przestrzennych w trybie krawędziowym Cel: Celem ćwiczenia jest zapoznanie z podstawowymi technikami stosowanymi przy generowaniu obrazu przestrzennego: opisem geometrii obiektów za pomocą reprezentacji brzegowej, transformacjami w układzie jednorodnym dla 3D oraz z najprostszymi technikami eliminacji niewidocznych fragmentów. Podstawy teoretyczne: Typowy algorytm wizualizacji składa się z dwóch faz: Wyznaczenie fragmentu powierzchni obiektu widzianego przez dany piksel obrazu, Wyznaczenie koloru tego fragmentu. Realizacja pierwszej fazy wymaga wykonania projekcji (rzutowania) wybranych punktów na powierzchniach elementów (najczęściej wierzchołków w reprezentacji brzegowej) z układu współrzędnych świata do układu współrzędnych 2D obrazu a następnie przeprowadzenia analizy widoczności rozpatrywanego fragmentu elementarnego powierzchni obiektu. Realizacja drugiej fazy wymaga wyliczenia postrzeganego z aktualnej pozycji obserwatora koloru w określonych punktach obiektu a następnie wyliczenia na tej podstawie koloru odpowiednich fragmentów obrazu. Wyliczenie koloru określonego punktu powierzchni zgodnie z przyjętym modelem oświetlenie jest zwykle czasochłonne i pomimo, że umożliwia odtworzenie takich efektów zależnych od pozycji obserwatora jak połyskliwość, refleksy świetlne czy odbicia zwierciadlane jest stosowane tylko gdy wymagany jest wysoki stopień realizmu generowanego obrazu. Najprostsze i najszybsze techniki wizualizacji pokazują tylko krawędzie bryły widoczne z punktu widzenia obserwatora pozostawiając wnętrze wieloboku – elementu powierzchni bocznej w kolorze tła lub wypełniając je jednorodnym kolorem. Taki tryb wyświetlania nazywany jest trybem krawędziowym. Tryb krawędziowy najczęściej stosowany jest w celu pokazania kształtu i wzajemnego położenia obiektów na scenie w takich przypadkach gdy realizm obrazu nie jest wymagany (np. do szybkiego pokazywania zarysów tworzonych obiektów w programach do budowy modelu sceny, w fazie ustawiania kamery do natychmiastowego wyświetlania przybliżonego obrazu sceny o dużej złożoności geometrycznej w czasie rzeczywistym itp.) lub stacja graficzna nie dysponuje wystarczająco efektywnym wspomaganiem sprzętowym. W ćwiczeniu tym zapoznamy się z elementarnymi technikami wizualizacji 3D w trybie krawędziowym. Potok wizualizacji w tym przypadku obejmuje następujące etapy: odczytanie opisu geometrii z pliku tekstowego w ustalonym formacie i zbudowanie odpowiedniej struktury danych w pamięci, odczytanie parametrów obserwatora i skonstruowanie na ich podstawie macierzy transformacji w układzie jednorodnym realizującej złożenie przekształcenia z układu świata do standardowego układu obserwatora, dla każdego trójkąta w reprezentacji brzegowej: o określenie statusu jego widoczności o jeśli trójkąt widoczny: o wyznaczenie położenia rzutu każdego z wierzchołków o obszarze obrazu, o wyświetlenie odcinków łączących rzuty wierzchołków w przestrzeni obrazu z odpowiednim przycinaniem do prostokąta obrazu (jeśli rzut któregoś z wierzchołków leży poza obszarem tworzonego obrazu). Transformacja z układu sceny do układu lokalnego standardowego obserwatora Dla uproszczenia i znormalizowania dalszych operacji geometrycznych zwykle zakłada się, ze obserwator znajduje się w standardowej pozycji tzn. obserwator znajdując się na osi OZ patrzy w stronę początku układu współrzędnych a kierunek pionowy w obrazie jest kierunkiem OY w układzie obserwatora. Aby umożliwić wizualizację sceny z dowolnymi parametrami położenia kamery w układzie świata należy dokonać transformacji obiektów sceny do układu lokalnego obserwatora. Założymy, ze w opisie sceny pozycja obserwatora bedzie określona przez podanie : położenia obserwatora PO, punktu PC który ma znaleźć się w centrum obrazu (wektor PC – PO wyznacza kierunek patrzenia), kierunku V w przestrzeni sceny, któremu ma odpowiadać kierunek pionowy (OY) w przestrzeni obserwatora, kata rozwarcia stożka widzenia , rozdzielczości obrazu wynikowego (xres, yres). Transformacja z układu sceny do układu obserwatora będzie wówczas musiała zapwenić spełnienie następujących zależności: punkt PO będzie odwzorowany na punkt (0, 0, -1) w układzie obserwatora, punkt PC będzie odwzorowany na punkt (0, 0, d-1) gdzie d jest długością wektora PC – PO punkt PO + Vn będzie odwzorowany na punkt (1, 0, -1) gdzie Vn jest wektorem jednostkowym uzyskanym przez normalizację wektora V. punkt PO + Hn będzie odwzorowany na punkt (0, 1, -1) gdzie Hn jest wektorem jednostkowym uzyskanym przez normalizację wektora prostopadłego do płaszczyzny wyznaczonej przez punkty PO, PC, PC+V. Macierz transformacji do układu obserwatora może być wyznaczone przez rozwiazanie czterech układów równań – każdy z czterema niewiadomymi. Układy równac uzyska się przez podstawienie do równań transformacji współrzędnych odpowiednich punktów zgodnie z wymaganiami określonymi powyżej. Może ona być tez uzyskana przez złozenie następujacyh przekształceń elementarnych: przesunięcie z punktu PC do punktu (0, 0, -1), obrót wokół osi OY o kąt jaki tworzy wektor PC – PO z płaszczyzną YOZ (po tym przekształceniu kierunek patrzenia kamery jest w płaszczyźnie YOZ), obrót wokół osi OX o kat jaki tworzy PC – PO z płaszczyzną XOY. Rzutowanie Rozważamy projekcję perspektywiczną obrazu na powierzchnię znormalizowanego prostokąta obrazu o wierzchołkach w przestrzeni świata: [-1 –1 0], [-1 1 0] [1 1 0], [1 –1 0] z pozycji obserwatora znajdującego się w punkcie [0 0 –d] gdzie d > 0.0. Współrzędne punktu P = [x, y, z] po przekształceniu do układu obrazu będą więc x’ = x * d / (z + d) y’ = y * d / (z + d) Należy pamiętać, że ostatecznie wyznaczamy pozycję w układzie współrzędnych ekranowych. Przy założeniu rozdzielczości xres i yres przekształcenie z układu współrzędnych obrazu do układu współrzędnych ekranowych wygląda następująco: xs = 0.5 * (xres – 1) * (x’ + 1.0) ys = 0.5 * (yres – 1) * (1.0 – y’) Eliminacja niewidocznych powierzchni Założymy, że obrazowane będą bryły zamknięte i wypukłe o reprezentacji brzegowej takiej, że wektor normalny dla każdej ściany skierowany jest na zewnątrz bryły. Można więc zastosować najprostszy algorytm eliminacji niewidocznych ścian o następujacej postaci. Niech N – wektor normalny skierowany na zewnątrz ściany a I wektor od środka analizowanej ściany do punktu obserwatora. Jeśli NI > 0 to ściana jest widoczna i należy ją narysować, w przeciwnym przypadku ścianę pomijamy. Format opisu sceny Przyjmiemy, że pełny opis sceny będzie umieszczony w pliku tekstowym zawierającym pełną informację o scenie oraz o parametrach kamery w następującym układzie: // Geometria sceny liczba wierzchołków współrzędne XYZ kolejnych wierzchołków liczba trójkątów trójki indeksów wierzchołków kolejnych trójkątów (indeksowanie od 0) // Parametry kamery xres yres współrzędne punktu PC współrzędne punktu PO wektor V Dla uproszczenia przyjmiemy, że w reprezentacji brzegowej występują tylko trójkaty. Zadanie do wykonania Należy zrealizować program, który wczytuje opis sceny w przedstawionym powyżej formacie oraz generuje obraz tej sceny do pliku w formacie RGBRes albo wyświetla go na ekranie. Obraz sceny ma być wygenerowany dla rozdzielczości i parametrów kamery zadanych w pliku wejściowym. Postać wywołania programu ma być następująca: texture <plik opisu sceny> [<nazwa pliku z utworzonym obrazem>] Jeśli program wyświetla utworzony obraz na ekranie to nie ma potrzeby tworzenia pliku z obrazem. Do przetestowania programu należy przygotować opis sceny zawierający modele brył w reprezentacji brzegowej o wybranych kształtach: np, prostopadłoscian, stożek, walec, kula. Literatura: [1] Foley, vanDamm, Feiner, Hughes - Computer Graphics - Principles and Practice, Addison Wesley, 1993 [2] Jankowski M. - Elementy Grafiki Komputerowej, PWN, 1990 [3] Zabrodzki J. - Grafika komputerowa - metody i narzędzia, WNT, 1994 Opracował: Jerzy Sas