Mapowanie sześcienne otoczenia (cubic environment mapping)

Podobne dokumenty
2 Przygotował: mgr inż. Maciej Lasota

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Aleksandra Zając. Raport. Blender. Pokemon: Eevee

Wykład 4. Rendering (1) Informacje podstawowe

1 Wstęp teoretyczny. Temat: Manipulowanie przestrzenią. Grafika komputerowa 3D. Instrukcja laboratoryjna Układ współrzędnych

1. Opis okna podstawowego programu TPrezenter.

Rysunek 1: Okno timeline wykorzystywane do tworzenia animacji.

IRONCAD. TriBall IRONCAD Narzędzie pozycjonujące

Trójwymiarowa grafika komputerowa rzutowanie

Misja#3. Robimy film animowany.

Wprowadzenie do rysowania w 3D. Praca w środowisku 3D

Spora część kodu programu jest dla nas nieprzydatna. Dokonaj zmian tak, aby kod miał postać:

Temat: Transformacje 3D

Tworzenie nowego rysunku Bezpośrednio po uruchomieniu programu zostanie otwarte okno kreatora Nowego Rysunku.

Transformacja współrzędnych geodezyjnych mapy w programie GEOPLAN

Zadanie 1. Stosowanie stylów

1. Prymitywy graficzne

GIMP. Ćwiczenie nr 6 efekty i filtry. Instrukcja. dla Gimnazjum 36 - Ryszard Rogacz Strona 18

DesignCAD 3D Max 24.0 PL

Co to jest wektor? Jest to obiekt posiadający: moduł (długość), kierunek wraz ze zwrotem.

Gry Komputerowe - laboratorium 2. Kamera FPP / TPP. mgr inż. Michał Chwesiuk 1/11. Szczecin, r

BLENDER- Laboratorium 1 opracował Michał Zakrzewski, 2014 r. Interfejs i poruszanie się po programie oraz podstawy edycji bryły

54. Układy współrzędnych

Grafika Komputerowa Materiały Laboratoryjne

Instrukcja obsługi funkcji specjalnych szablonu C01 v.1.0

Grafika Komputerowa Wykład 4. Synteza grafiki 3D. mgr inż. Michał Chwesiuk 1/30

Agrinavia MOBILE. Agrinavia MOBILE (wersja samodzielna) Logowanie

Autodesk 3D Studio MAX Teksturowanie modeli 3D

e-podręcznik dla seniora... i nie tylko.

Definicja obrotu: Definicja elementów obrotu:

Baltie 3. Podręcznik do nauki programowania dla klas I III gimnazjum. Tadeusz Sołtys, Bohumír Soukup

- biegunowy(kołowy) - kursor wykonuje skok w kierunku tymczasowych linii konstrukcyjnych;

Użycie przestrzeni papieru i odnośników - ćwiczenie

Sposób odwzorowania wymiarów w wypadku eksportowania z programu Revit do programu AutoCAD

Ćwiczenie 4 - Podstawy materiałów i tekstur. Renderowanie obrazu i animacji

Gry Komputerowe Laboratorium 4. Teksturowanie Kolizje obiektów z otoczeniem. mgr inż. Michał Chwesiuk 1/29. Szczecin, r

Podręczna pomoc Microsoft Power Point 2007

RYSUNEK TECHNICZNY I GEOMETRIA WYKREŚLNA INSTRUKCJA DOM Z DRABINĄ I KOMINEM W 2D

Ćwiczenie 1 Galeria zdjęć

Mobilne Aplikacje Multimedialne

Układy współrzędnych GUW, LUW Polecenie LUW

Opracował: mgr inż. Marcin Olech

Nadają się do automatycznego rysowania powierzchni, ponieważ może ich być dowolna ilość.

Notowania Mobilne wersja Java

Rzutowanie z 4D na 3D

5.4. Tworzymy formularze

Komputery I (2) Panel sterowania:

Instrukcja obsługi programu

Plan wykładu. Akcelerator 3D Potok graficzny

System Obsługi Zleceń

6.4. Efekty specjalne

Jedną z ciekawych funkcjonalności NOLa jest możliwość dokonywania analizy technicznej na wykresach, które mogą być otwierane z poziomu okna notowań:

INSTYTUT INFORMATYKI STOSOWANEJ MODELOWANIE CZĘŚCI Z WYKORZYSTANIEM PROGRAMU SOLID EDGE

2.1. Duszek w labiryncie

FIGURY I BRYŁY JEDNOSTKI MIARY KĄTY POLE I OBWÓD OBJĘTOŚĆ I POWIERZCHNIA TRÓJKĄT PROSTOKĄTNY

Prezentacja multimedialna MS PowerPoint 2010 (podstawy)

Systemy wirtualnej rzeczywistości. Podstawy grafiki 3D

Wstęp do GIMP wycinanie obiektu z obrazka, projekt napisu. Rozpoczynamy prace w GIMP-e

Zespół można utworzyć przez utworzenie nowego dokumentu na bazie szablonu zespołu (pliki z rozszerzeniem.iam). Tworzony jest pusty dokument zespołu.

Fuugo dla OSX Podręcznik użytkownika

Światła i rodzaje świateł. Dorota Smorawa

Edytor tekstu MS Word podstawy

Notowania Mobilne wersja Java. Instrukcja obsługi programu

Uruchamianie programu

Modelowanie i wstęp do druku 3D Wykład 1. Robert Banasiak

Rejestracja faktury VAT. Instrukcja stanowiskowa

Multimedia i interfejsy. Ćwiczenie 5 HTML5

Jeżeli pole Krawędź będzie zaznaczone uzyskamy obramowanie w całej wstawianej tabeli

7 Magazyn [ Magazyn ] Magazyn

Notowania Mobilne wersja Java dotykowa. Instrukcja obsługi programu

Skalowanie i ustawianie arkuszy/układów wydruku w AutoCAD autor: M. Motylewicz, 2012

Unity 3D - własny ekran startowy i menu gry

Rachunek wektorowy - wprowadzenie. dr inż. Romuald Kędzierski

GRK 2. dr Wojciech Palubicki

Ustawienia materiałów i tekstur w programie KD Max. MTPARTNER S.C.

Praca w programie Power Draft

Tworzenie prezentacji w MS PowerPoint

Notowania Mobilne wersja BlackBerry. Instrukcja obsługi programu

1. Przypisy, indeks i spisy.

5.4. Efekty specjalne

Operacje na gotowych projektach.

INSTRUKCJA UŻYTKOWNIKA. Spis treści. I. Wprowadzenie II. Tworzenie nowej karty pracy a. Obiekty b. Nauka pisania...

Grafika komputerowa Tekstury

Adobe InDesign lab.1 Jacek Wiślicki, Paweł Kośla. Spis treści: 1 Podstawy pracy z aplikacją Układ strony... 2.

Ustalanie dostępu do plików - Windows XP Home/Professional

Efekt Halla. Cel ćwiczenia. Wstęp. Celem ćwiczenia jest zbadanie efektu Halla. Siła Loretza

6.4. Efekty specjalne

Access - Aplikacja. Tworzenie bazy danych w postaci aplikacji

Włączanie/wyłączanie paska menu

Andrzej Frydrych SWSPiZ 1/8

Druga aplikacja Prymitywy, alpha blending, obracanie bitmap oraz mały zestaw przydatnych funkcji wyświetlających własnej roboty.

Prezentacja MS PowerPoint 2010 PL.

Animacja w prezentacji

Ćwiczenie 1: Pierwsze kroki

Grafika 3D program POV-Ray

Przewodnik po soczewkach

System Informatyczny Oddziału Wojewódzkiego NFZ

Edytor tekstu MS Word 2010 PL: grafika. Edytor tekstu MS Word umożliwia wstawianie do dokumentów grafiki.

KONSTRUKCJA TRÓJKĄTA 1 KONSTRUKCJA TRÓJKĄTA 2 KONSTRUKCJA CZWOROKĄTA KONSTRUKCJA OKRĘGU KONSTRUKCJA STYCZNYCH

Ćwiczenie dodatkowe - Wybrane narzędzia modelowania Zadanie Przygotować model stołu z krzesłami jak na rysunku poniżej(rys. 1).

Transkrypt:

Mapowanie sześcienne otoczenia (cubic environment mapping) Mapowanie środowiska jest techniką pozwalającą na odwzorowanie otoczenia na powierzchni przedmiotu przy użyciu specjalnie spreparowanej tekstury. Mamy dwa rodzaje mapowania środowiska: - sferyczne - tekstura zostaje przygotowana wcześniej w specjalnym programie graficznym (najlepszy rezultat uzyskuje się dla tekstur, na których zastosowano filtr "rybiego oka"). Współrzędne tekstury zmieniają się dynamicznie w trakcie działania programu w zależności od stanu macierzy widoku i przekształcenia świata. - sześcienne - otoczenie jest renderowane do specjalnych tekstur (nazywanych mapami sześciennymi) i nakładane na przedmiot. Renderowanie do tekstury Przed poruszeniem właściwego tematu należy wyjaśnić sposób renderowania sceny do tekstury, gdyż technika ta będzie później używana. Zwykle scena był renderowana do tylnego bufora a potem przerzucana na przedni w pętli wyświetlania. Analogicznie możemy zrobić z teksturą, najpierw jednak należy ją oczywiście utworzyć. Robimy to podobnie jak w przypadku zwykłych tekstur tworzonych na podstawie plików graficznych. Najpierw deklarujemy opis powierzchni DirectDrawSurface7, która będzie potem teksturą: Dim ddsd As DDSURFACEDESC2 Opis ten należy odpowiednio uzupełnić: With ddsd.lflags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH.ddsCaps.lCaps = DDSCAPS_TEXTURE Or DDSCAPS_3DDEVICE.lHeight = texture_height.lwidth = texture_width Najpierw uzupełniliśmy flagi - wartość DDSD_CAPS oznacza, że przy tworzeniu powierzchni będzie brane pod uwagę pole ddscaps, które okresliliśmy potem. Istotne są także rozmiary tekstury, które określimy sami (nie tworzymy tekstury z pliku graficznego, więc wymiary są nieznane). Oczywiście należy zaznaczyć, że tworzona powierzchnia będzie używana jako tekstura DDSCAPS_TEXTURE, a także, że będziemy do niej renderować obraz trójwymiarowy (DDSCAPS_3DDEVICE) Następnie określiliśmy rozmiary naszej tekstury. Teraz już możemy ją utworzyć: Set texture = DD.CreateSurface(ddsd) Uwaga! Jeśli nasza karta graficzna nie wspiera bezpośredniego renderowania do tekstury, to można próbować renderować obraz do tylnego bufora, a następnie skopiować go do tekstury. Rzecz jasna, będzie to trwało znacznie dłużej niż w pierwszym przypadku. Załóżmy jednak, że wszystko poszło dobrze. Teraz przyszedł czas na utworzenie ViewPortu skojarzonego z naszą teksturą. Strukturę tą określaliśm zwykle w inicjalizacji i dotyczyła ona tylnego bufora. Określała na jakiej części

bufora będzie renderowany obraz. Tą samą sytuacją mamy teraz - chcemy renderować obraz na całej strukturze, więc: With texture_viewport.lheight = texture_height.lwidth = texture_width.lx = 0.lY = 0.maxz = 1.minz = 0 Texture_height, texture_width - jak łatwo się domysleć to rozmiary naszej tekstury. Jeśli tylne bufor zawierał bufor głębokości, to powinno się go też dołączyć do tekstury. Zmianom uległa także procedura renderowania obrazu. Do określenia bufora, do którego jest renderowany obraz służy metoda: Device.SetRenderTarget surface W ten sposób można się przełączać pomiędzy buforami. Od tego momentu wszelkie polecenia rysujące odnoszą się do bufora surface. Kiedy przełączymy się na rysowanie do tekstury, należy też ustawić odpowiednio ViewPort - jeśli wymiary tekstury są inne niż wymiary ekranu. Załączony przykład pozwala obserwować model z dwóch stron - z punktu widzenia obserwatora i z punktu widzenia kamery (to co ona widzi, jest wyświetlane na teksturze). Sterowanie przy pomocy strzałek kursora i strzałek z klawiatury numerycznej. Mapowanie sześcienne - teoria Nasz przedmiot można umieścić w pewnym hipotetycznym sześcianie, którego ścianki będą odpowiednią leżeć na osiach +X, -X, +Z, -Z itd. Rozkładając ten sześcian w postaci płaskiej siatki otrzymamy:

Weźmy dla przykładu ściankę 0 (+X) i wyrenderujmy do niej odpiednio obraz. Najpierw należy skierować kamerę tak, aby patrzyła dokładnie w kierunku osi +X. Można ją ustawić w pozycji (0, 0, 0) i kazać patrzeć na punkt (1, 0, 0). Górę kamery ustawiamy jako (0, 1, 0) - wektor określający górę kamery i kierunek patrzenia powinny być prostopadłe do siebie. Dla ścianki -X będzie podobnie - zmieni się tylko punkt na który kamera patrzy (-1, 0, 0). Korzystając z powyższego rysunku można łatwo określić posotałe wektory. vfrom vat vup +X (0, 0, 0) (1, 0, 0) (0, 1, 0) -X (0, 0, 0) (-1, 0, 0) (0, 1, 0) +Y (0, 0, 0) (0, 1, 0) (0, 0, -1) -Y (0, 0, 0) (0, -1, 0) (0, 0, 1) +Z (0, 0, 0) (0, 0, 1) (0, 1, 0) -Z (0, 0, 0) (0, 0, -1) (0, 1, 0) Gdzie: vfrom - pozycja kamery. vat - punkt na jaki patrzy kamera vup - wektor określający górę kamery. Przemieszczamy kamerę, zmieniamy cel renderowania na odpowiednią mapę sześcienną, czyścimy ją, a następnie renderujemy do niej obraz. Sprzęt zadba o odpowiednie przeskalowanie powstałego obrazu, a także automatycznie wygeneruje współrzędne tekstury. Tworzenie map sześciennych Najpierw musimy zadecydować czy potrzebne będzie nam wszystkich sześć map sześciennych. Im więcej, tym dłużej będzie trwało wyświetlenia całej sceny. Załóżmy, że chcemy wykorzystać wszystkie sześć map sześciennych. Jak w przypadku każdej tekstury będziemy korzystać z powierzchni DirectDrawSurface7Potrzebujemy sześciu takich powierzchni, więc można zadeklarować tablicę. Public Face(5) As DirectDrawSurface7 Daklarujemy także: Dim ddsd As DDSURFACEDESC2 'opis powierzchni DirectDraw Dim caps As DDSCAPS2 'właściwości powierzchni Uzupełniamy strukturę ddsd: With ddsd.lflags = DDSD_CAPS Or DDSD_WIDTH Or DDSD_HEIGHT ddsd.lheight = height ddsd.lwidth = width.ddscaps.lcaps = DDSCAPS_TEXTURE Or DDSCAPS_COMPLEX Or DDSCAPS_3DDEVICE.ddscaps.lCaps2 = DDSCAPS2_CUBEMAP Or DDSCAPS2_CUBEMAP_ALLFACES Pole lflags jest dla nas zrozumiałe. Wymiary także. Należy jednak zaznaczyć, że powinny być one potęgami dwójki, zaś z ich wielkością nie należy za bardzo przesadzać, gdyż im większe mapy sześcienne, tym dłużej trwa renderowania, chociaż zwiększamy wtedy dokładność odbitego obrazu. Mamy dwie nowości - flagę DDSCAPS_COMPLEX w polu lcaps - oznacza to, że powierzchnia jest złożona i zawiera w sobie inne powierzchnie - jakie? To deklarujemy dalej.

Pole lcaps2 ustawione na powyższe wartości oznacza, ze nasza powierzchnia będzie mapą sześcienną oraz, że chcemy wygenerować wszystkich sześć map sześciennych. Poleceniem: Set.Face(0) = DD.CreateSurface(ddsd) Tworzymy podstawową mapę sześcienną. Jest to mapa patrzenia w dodatnim kierunku osi X. Pozostałe mapy sześcienne są zawarte w powierzchni Face(0) i musimy się do nich jakoś dostać, aby potem można było przełączać cel renderowania: caps.lcaps2 = DDSCAPS2_CUBEMAP_NEGATIVEX Or DDSCAPS2_CUBEMAP Set.Face(1) =.Face(0).GetAttachedSurface(caps) W powyższy sposób tworzymy mapę patrzenia w ujemnym kierunku osi X. Polecenie: Set.Face(1) =.Face(0).GetAttachedSurface(caps) wyciąga z podstawowej mapy powierzchnię wewnętrzną i kojarzy ją z powierzchnią Face(1) Podobnie postepujemy dla pozostałych map. Kiedy już nasza mapa sześcienna (czy raczej mapy) są stworzone, należy jeszcze utworzyć ViewPort z nimi skojarzony - ponieważ będziemy renderować na całych mapach, a nie na ich fragmentach, więc pola lheight i lwidth ustawiamy odpowiednio na wysokość i szerokość mapy sześciennej. Spójrzmy dalej na procedurę renderowania obrazu. Najpierw wywołujemy procedurę RenderEnvMap, która przygotowuje mapę sześcienną. Na początku zapamiętujemy ważniejsze ustawienia - np. macierz przekształcenia wodoku czy ViewPort zwiżany z tylnym buforem. Służą do tego serie wywołań device.gettransform i device.getviewport. Następnie ustawiamy wektor pozycji kamery na (0, 0, 0), bo nasz przedmiot ma środek właśnie w tym punkcie. Potem zmieniamy cel renderowania na kolejną mapę sześcienną, ustawiamy punkt na jaki patrzy kamera, górę kamery, tworzymy macierz widoku: DX.ViewMatrix MatView, vfrom, vat, vup, 0 I ustawiamy ją: Device.SetTransform D3DTRANSFORMSTATE_VIEW, MatView Kąt widzenia powinien być ustawiony na 90 stopni (w przeciwnym wypadku, obrazy na poszczególnych sciankach będą zachodzić na siebie). Jeśli tak nie jest, to należy zmodyfikować macierz projekcji: DX.ProjectionMatrix MatProj, near, far, PI / 2 Device.SetTransform D3DTRANSFORMSTATE_PROJECTION, MatProj Dalej renderujemy otoczenie, analogicznie jak przy renderowaniu do tylnego bufora. Gdy obsłużymy już wszystkie mapy sześcienne, ponownie przełączamy się na renderowanie do tylnego bufora. Ponieważ podane wartości wektorów w tabelce dotyczyły sytuacji, gdy kamera jest skierowana wzdłuż wektora (0, 0, 1), więc przy obrotach kamery musimy odpowiednio przetransformować wektory podane w tabelce. Korzystamy przy tym z kąta oboru kamery angle. Tworzymy macierz obrotu wzdłuż osi Y MatRotView (tylko wzdłuż tej osi obraca się kamera w przykładzie). Dla kąta obrotu 90 stopni wektory kierunkowe dla map sześciennych nie powinny być obrócone, dlatego odejmujemy 90 stopni. Aby przetransformować dany wektor, należy go zwyczajnie przemnożyć przez daną macierz. Służy do tego procedura VectorTransformCoord. Jeśli nasza kamera nie obracałaby się, to można od razu ustalić wektory kierunkowe dla kamery i nie zmieniać ich potem.

Następnie renderujemy już całą scenę, wraz z przedmiotem na którym mają być odbicia. Kiedy już wyświetliliśmy całe nasze otoczenia, to należy uczynić aktywną mapę sześcienną. Dokonujemy tego jak w przypadku zwykłej tekstury, przy czym nakładamy mapę podstawową: Device.SetTexture 0, Face(0) Należy jeszcze poinformować Direct3D, żeby automatycznie policzył współrzedne tekstury dla mapy sześciennej: Device.SetTextureStageState 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR Żeby przywrócić tradycyjne okreśolanie spółrzednyhc tekstur, czyli na podstawie danych tu I tv zawartych w wektorach wywołujemu: Device.SetTextureStageState 0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_PASSTHRU