Systemy wirtualnej rzeczywistości. Podstawy grafiki 3D



Podobne dokumenty
Systemy wirtualnej rzeczywistości. Komponenty i serwisy

1. Prymitywy graficzne

2 Przygotował: mgr inż. Maciej Lasota

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

Plan wykładu. Akcelerator 3D Potok graficzny

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

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

Temat: Transformacje 3D

Wykład 4. Rendering (1) Informacje podstawowe

Rysunek 1: Okno timeline wykorzystywane do tworzenia animacji.

Transformacje obiektów 3D

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Programowanie telefonów z Windows Phone 7, cz. 3

Grafika Komputerowa Wykład 5. Potok Renderowania Oświetlenie. mgr inż. Michał Chwesiuk 1/38

Transformacje. dr Radosław Matusik. radmat

Grafika Komputerowa Materiały Laboratoryjne

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

Krystalochemia białek 2016/2017

Trójwymiarowa grafika komputerowa rzutowanie

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

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

RENDERING W CZASIE RZECZYWISTYM. Michał Radziszewski

Laboratorium 1. Część I. Podstawy biblioteki graficznej OpenGL.

Elementarne obiekty geometryczne, bufory. Dorota Smorawa

GLKit. Wykład 10. Programowanie aplikacji mobilnych na urządzenia Apple (IOS i ObjectiveC) #import "Fraction.h" #import <stdio.h>

Grafika Komputerowa Materiały Laboratoryjne

Karta przedmiotu. Podstawy programowania procesorów graficznych. realizowanego w ramach projektu PO WER

Oświetlenie. Modelowanie oświetlenia sceny 3D. Algorytmy cieniowania.

Ćwiczenia nr 4. TEMATYKA: Rzutowanie

GRK 2. dr Wojciech Palubicki

Informatyka II. Laboratorium Aplikacja okienkowa

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

OpenGL przezroczystość

Politechnika Warszawska Wydział Mechatroniki Instytut Automatyki i Robotyki

Politechnika Poznańska, Instytut Informatyki, SUM-TWO

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

Laboratorium grafiki komputerowej i animacji. Ćwiczenie V - Biblioteka OpenGL - oświetlenie sceny

Wybrane aspekty teorii grafiki komputerowej - dążenie do wizualnego realizmu. Mirosław Głowacki

Materiały. Dorota Smorawa

Architektura Procesorów Graficznych

Praktyczne przykłady wykorzystania GeoGebry podczas lekcji na II etapie edukacyjnym.

Dodatkowo klasa powinna mieć destruktor zwalniający pamięć.

3 Przygotował: mgr inż. Maciej Lasota

Przekształcenia geometryczne w grafice komputerowej. Marek Badura

Grafika trójwymiarowa

Grafika komputerowa Tekstury

Dokąd on zmierza? Przemieszczenie i prędkość jako wektory

TRYGONOMETRIA FUNKCJE TRYGONOMETRYCZNE KĄTA SKIEROWANEGO

DesignCAD 3D Max 24.0 PL

GRAFIKA KOMPUTEROWA 7: Kolory i cieniowanie

Bartosz Bazyluk SYNTEZA GRAFIKI 3D Grafika realistyczna i czasu rzeczywistego. Pojęcie sceny i kamery. Grafika Komputerowa, Informatyka, I Rok

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


Animowana grafika 3D Laboratorium 3

Rozdział 4 KLASY, OBIEKTY, METODY

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Rozdział 1 Podstawowe koncepcje grafiki 3D

0. OpenGL ma układ współrzędnych taki, że oś y jest skierowana (względem monitora) a) w dół b) w górę c) w lewo d) w prawo e) w kierunku do

Przekształcenia geometryczne. Dorota Smorawa

Mapowanie sześcienne otoczenia (cubic environment mapping)

SpriteKit. Biblioteka do tworzenia gier wbudowana w SDK. Wspiera grafikę 2D w oparciu o sprite y

Mobilne Aplikacje Multimedialne

Grafika Komputerowa Materiały Laboratoryjne

Ćwiczenie nr 5 i 6 Przygotowanie dokumentacji technicznej dla brył

Przekształcenia geometryczne. Mirosław Głowacki Wydział Inżynierii Metali i Informatyki Przemysłowej

Obiekt 2: Świątynia Zeusa

Grafika Komputerowa Materiały Laboratoryjne

1 Temat: Vertex Shader

Programowanie strukturalne i obiektowe. Funkcje

Zatem standardowe rysowanie prymitywów wygląda następująco:

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Symulacja samochodu z kamerą stereowizyjną. Krzysztof Sykuła 15 czerwca 2007

Rozdział 4 Komponenty gry na przykładzie prostopadłościanu

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

Zad. 6: Sterowanie robotem mobilnym

4. Podstawowa konfiguracja

Wizualne systemy programowania. Wykład 11 Grafika. dr Artur Bartoszewski -Wizualne systemy programowania, sem. III- WYKŁAD

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

4. Funkcje. Przykłady

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

Rys 3-1. Rysunek wałka

GRAFIKA CZASU RZECZYWISTEGO Podstawy syntezy grafiki 3D i transformacji geometrycznych

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

gdzie (4.20) (4.21) 4.3. Rzut równoległy

Język programowania zbiór reguł określających, które ciągi symboli tworzą program komputerowy oraz jakie obliczenia opisuje ten program.

Zadanie 1. Ściana. 1. Potrzebne zmienne w dołączonym do zadania kodzie źródłowym

Grafika Komputerowa Wykład 6. Teksturowanie. mgr inż. Michał Chwesiuk 1/23

Animowana grafika 3D. Opracowanie: J. Kęsik.

Programowanie Procesorów Graficznych

Plan wykładu. Wykład 3. Rzutowanie prostokątne, widoki, przekroje, kłady. Rzutowanie prostokątne - geneza. Rzutowanie prostokątne - geneza

= i Ponieważ pierwiastkami stopnia 3 z 1 są (jak łatwo wyliczyć) liczby 1, 1+i 3

Wprowadzenie do QT OpenGL

Projektowanie graficzne. Wykład 2. Open Office Draw

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Java. Wykład 9. Piotr Tronczyk

OPROGRAMOWANIE UŻYTKOWE

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

Autodesk 3D Studio MAX Teksturowanie modeli 3D

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

GRAFIKA CZASU RZECZYWISTEGO Wprowadzenie do OpenGL

Transkrypt:

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Systemy wirtualnej rzeczywistości Laboratorium Podstawy grafiki 3D Wstęp: W drugiej części przedstawione zostaną podstawowe mechanizmy tworzenia 3-wymiarowej grafiki czasu rzeczywistego, tworzenia buforów wierzchołków i indeksów, macierzy przekształceń i renderowania. 1. Bufory wierzchołków i indeksów oraz teksturowanie Celem niniejszej instrukcji jest stworzenie prostego terenu, po którym będzie mógł poruszać się czołg. Większość modeli 3D opisana jest za pomocą trójkątów. Trójkąty natomiast opisane są trzema wierzchołkami. Chcielibyśmy aby nasz teren był kwadratem o zadanej wielkości. Do zbudowania kwadratu potrzeba 2-ch trójkątów, a zatem 6 wierzchołków (rys. 3a). Łatwo zauważyć, że 2 wierzchołki z pierwszego trójkąta pokrywają się z 2-ma wierzchołkami drugiego trójkąta. Aby ograniczyć powtarzanie zbędnych danych stworzono indeksowanie. Każdy wierzchołek podawany jest tylko raz, a strukturę trójkątów opisujemy w buforze indeksów. Mechanizm ten ilustruje rys. 3b. Należy pamiętać, że domyślnie każdy trójkąt jest widoczny tylko z jednej strony. DirectX uznaje trójkąt za widoczny jeśli jego wierzchołki układają się zgodnie z ruchem wskazówek zegara (rys. 4), w przeciwnym razie trójkąt jest niewidoczny. 1 2 4 1 2 bufor indeksów = [1,2,4,2,3,4] 1 2 2 widoczny niewidoczny 3 6 5 4 3 Rys. 1 - a) kwadrat złożony z 6 wierzchołków, b) kwadrat złożony z 4 wierzchołków i bufor indeksów 1 3 3 1 Rys. 2 - Widoczność trójkąta

Dodatkowo chcielibyśmy aby nasz teren pokryty był uprzednio dodaną teksturą trawy. Aby poprawnie teksturować obiekt 3D potrzeba dodatkowych danych zwanych współrzędnymi UV lub po prostu współrzędnymi tekstury. Górnemu lewemu rogowi tekstury przypisuje się współrzędne (0, 0), a dolnemu prawemu (1, 1). Następnie dodając do wierzchołków siatki odpowiednie współrzędne UV można opisać jak tekstura ma być nałożona na trójkąt (rys. 5). (0,0) (1,0) (0,0) (2,0) (0.3,0.3) (1,0.3) (0,0) (2,0) (0,1) (1,1) (0,2) (2,2) (0.3,1) (1,1) (1,0) (2,1) Rys. 3 - Tekstura nałożona na kwadrat przy różnych wartościach UV Potrzebny jest zatem bufor wierzchołków i indeksów. Deklarujemy dwie zmienne w klasie głównej gry: VertexBuffer terenwierzcholki; IndexBuffer terenindeksy; Stwórzmy też metodę, która zainicjuje oba bufory: protected void StworzTeren() { } Najpierw utworzymy wierzchołki. Posłuży nam do tego tablica typu VertexPositionTexture. Typ ten reprezentuje wierzchołek zawierający współrzędne pozycji i tekstury. Dodatkowe dwie zmienne typu float pomogą nam w prawidłowym zainicjowaniu wierzchołków. Pierwsza z nich określa wielkość terenu, natomiast druga określa stopień rozciągnięcia tekstury na płaszczyźnie terenu. VertexPositionTexture[] wierzcholki = new VertexPositionTexture[4]; float skala = 10.0f; float skalatekstury = 1.0f; Następnie wypełniamy tablicę wierzchołków odpowiednimi wartościami współrzędnych: 2

wierzcholki[0].position = new Vector3(-skala, 0.0f, -skala); wierzcholki[0].texturecoordinate.x = 0.0f; wierzcholki[0].texturecoordinate.y = 0.0f; wierzcholki[1].position = new Vector3(skala, 0.0f, -skala); wierzcholki[1].texturecoordinate.x = skalatekstury; wierzcholki[1].texturecoordinate.y = 0.0f; wierzcholki[2].position = new Vector3(-skala, 0.0f, skala); wierzcholki[2].texturecoordinate.x = 0.0f; wierzcholki[2].texturecoordinate.y = skalatekstury; wierzcholki[3].position = new Vector3(skala, 0.0f, skala); wierzcholki[3].texturecoordinate.x = skalatekstury; wierzcholki[3].texturecoordinate.y = skalatekstury; Wreszcie tworzymy i wypełniamy bufor wierzchołków: terenwierzcholki = new VertexBuffer(graphics.GraphicsDevice, typeof(vertexpositiontexture), 4, BufferUsage.WriteOnly); terenwierzcholki.setdata<vertexpositiontexture>(wierzcholki); W analogiczny sposób stworzymy bufor indeksów: short[] indeksy = new short[6]; indeksy[0] = 0; indeksy[1] = 1; indeksy[2] = 2; indeksy[3] = 1; indeksy[4] = 3; indeksy[5] = 2; terenindeksy = new IndexBuffer(graphics.GraphicsDevice, typeof(short), 6, BufferUsage.WriteOnly); terenindeksy.setdata<short>(indeksy); Na koniec pozostaje jedynie wywołanie napisanej właśnie metody w metodzie LoadContent klasy gry: StworzTeren(); 2. Macierze transformacji Przed przystąpieniem do renderingu musimy jeszcze zdefiniować macierze transformacji. Posłużą one do określenia gdzie znajdują się obiekty w scenie, jak są zorientowane, gdzie jest kamera, w którą stronę jest zwrócona oraz w jaki sposób obiekty 3D są rzutowane na 2- wymiarowy ekran. W zależności od pełnionej funkcji rozróżnia się trzy rodzaje macierzy: 3

macierz świata opisuje przesunięcie obiektu w przestrzeni, jego obrót oraz skalę macierz widoku reprezentuje obserwatora, w którym miejscu się znajduje oraz na co patrzy macierz projekcji opisuje w jaki sposób 3-wymiarowy obiekt jest rzutowany na płaszczyznę ekranu Ważną właściwością macierzy transformacji jest to, że można je łączyć wymnażając je ze sobą. Np. posiadając macierz translacji A i macierz obrotu B można utworzyć jedną macierz reprezentującą jednocześnie translację i obrót wykonując następujące działanie: 1 0 0 2.3 0.7 0.7 0 0 0.7 0.7 0 1.6 0 1 0 0 0.7 0.7 0 0 0.7 0.7 0 1.6 = = 0 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 1 Należy jednak pamiętać o zachowaniu odpowiedniej kolejności mnożenia. Działanie A*B da inny efekt niż B*A (rys. 6). przesunięcie obrót obrót przesunięcie Rys. 4 - Wynik zastosowania tych samych transformacji w różnej kolejności Macierze transformacji są bardzo istotnym elementem zagadnień związanych z grafiką trójwymiarową. Więcej informacji na temat macierzy transformacji można znaleźć w literaturze związanej z grafiką 3D. Deklarujemy zatem trzy macierze: Matrix projekcja; Matrix widok; Matrix swiat; Następnie przypisujemy im wartości korzystając z pomocniczych metod klasy Matrix. Metoda CreatePerspectiveFieldOfView pobiera jako parametr pole widzenia (w radianach), proporcje obrazu, przednią i tylną płaszczyznę (rys. 7). Pole widzenia oraz płaszczyzny 4

przednia i tylna określają obszar widzenia kamery. Wszystkie obiekty znajdujące się bliżej niż przednia płaszczyzna lub dalej niż tylna płaszczyzna są obcinane. CreateLookAt tworzy macierz widoku po podaniu położenia kamery, punktu na który jest zwrócona oraz wektora wskazującego górę. Chcemy aby teren znajdował się w środku sceny bez żadnych transformacji dlatego macierz świata ustawimy na macierz jedynkową. tylna płaszczyzna obserwator przednia płaszczyzna Rys. 5 - Przednia i tylna płaszczyzna projekcja = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(50), graphics.graphicsdevice.viewport.aspectratio, 0.1f, 1000.0f); widok = Matrix.CreateLookAt(new Vector3(24.0f, 20.0f, 10.0f), new Vector3(0.0f, 0.0f, 0.0f), Vector3.Up); swiat = Matrix.Identity; 3. Rendering Ostatnim brakującym elementem potrzebnym do narysowania sceny jest shader. Shader y to małe programy odpowiedzialne za cieniowanie obiektów. Inaczej mówiąc shader y obliczają gotowy obraz na podstawie danych o wierzchołkach, oświetleniu, teksturach, itd. Rozwój sprzętu spowodował, że wykonywane na procesorze karty graficznej shader y służą już nie tylko cieniowaniu ale również rozmaitym efektom i obliczeniom nie związanym bezpośrednio z obliczaniem grafiki. W XNA klasą reprezentującą zbiór shader ów jest klasa Effect. My jednak skorzystamy z uproszczonej jej wersji BasicEffect, która zawiera wbudowane podstawowe mechanizmy renderowania. Deklarujemy zmienną typu BasicEffect: BasicEffect basiceffect; Następnie w LoadContent tworzymy nowy efekt i ustawiamy w nim macierze transformacji: basiceffect = new BasicEffect(graphics.GraphicsDevice, null); basiceffect.projection = projekcja; 5

basiceffect.view = widok; basiceffect.world = swiat; Wreszcie możemy przystąpić do rysowania sceny. Przechodzimy do metody Draw. Usuwamy kod rysujący obraz trawy, nie będziemy go już potrzebować. W podobny do rysowania 2- wymiarowych obrazów sposób rozpoczynamy i kończymy rysowanie metodami Begin oraz End ale na rzecz obiektu basiceffect. Określamy typ wierzchołków (VertexDeclaration) jakich zamierzamy używać w naszym przypadku będą to wierzchołki zawierające współrzędne 3D oraz współrzędne tekstury (VertexPositionTexture). Następnie ustawiamy na urządzeniu nasze bufory wierzchołków i indeksów. Każda siatka 3D może mieć przypisane różne materiały wymagające różnych shader ów. Dlatego efekt może zawierać różne techniki, a każda z technik może składać się z kilku przebiegów. W naszym przypadku wykorzystujemy tylko podstawowe mechanizmy, jedną technikę i jeden przebieg. Rozpoczynamy zatem rysowanie metodą Begin pierwszego przebiegu pierwszej techniki i rysujemy teren metodą DrawIndexedPrimitives. Po narysowaniu obiektu zamykamy przebieg metodą End. basiceffect.begin(); graphics.graphicsdevice.vertexdeclaration = new VertexDeclaration( graphics.graphicsdevice, VertexPositionTexture.VertexElements); graphics.graphicsdevice.vertices[0].setsource(terenwierzcholki, 0, VertexPositionTexture.SizeInBytes); graphics.graphicsdevice.indices = terenindeksy; basiceffect.techniques[0].passes[0].begin(); graphics.graphicsdevice.drawindexedprimitives(primitivetype.trianglelist, 0, 0, 4, 0, 2); basiceffect.techniques[0].passes[0].end(); basiceffect.end(); Po skompilowaniu powinniśmy otrzymać wynik jak na rys. 8. Ostatnią rzeczą jaką chcielibyśmy zrealizować jest nałożenie na teren tekstury trawy. Wracamy więc do metody LoadContent i określamy dwa dodatkowe parametry efektu: basiceffect.textureenabled = true; basiceffect.texture = trawa; Rys. 6 - Teren bez tekstury Rys. 8 - Teren bez tekstury 6

Teraz obraz powinien wyglądać jak na rys. 9. Tekstura wydaje się być zbyt rozciągnięta. Możemy to bardzo prosto naprawić zmieniając wartość zmiennej skalatekstury w metodzie StworzTeren. Jeżeli zmienimy ją na 10 uzyskamy efekt jak na rys. 10. Rys. 8 - Teren z teksturą dla skalatekstury = 1 Rys. 7 Teren z teksturą dla skalatekstury = 10 7