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

Podobne dokumenty
OpenGL : Oświetlenie. mgr inż. Michał Chwesiuk mgr inż. Tomasz Sergej inż. Patryk Piotrowski. Szczecin, r 1/23

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

Wprowadzenie do QT OpenGL

Gry Komputerowe Laboratorium 3. Organizacja obiektów sceny Kolizje obiektów. mgr inż. Michał Chwesiuk 1/20. Szczecin, r

Shadery. Artur Staszczyk Bartłomiej Filipek

Gry Komputerowe Laboratorium 1. Zajęcia organizacyjne Animacja z uwzględnieniem czasu. mgr inż. Michał Chwesiuk 1/22. Szczecin,

Bartłomiej Filipek

Mapowanie tekstur Mip-mapy (level of detail) Filtrowanie Multiteksturowanie

Informacje i porady dotyczące pisania shaderów.

Potok graficzny i shadery. Hubert Rutkowski

1 Temat: Vertex Shader

Synteza i obróbka obrazu. Tekstury. Opracowanie: dr inż. Grzegorz Szwoch Politechnika Gdańska Katedra Systemów Multimedialnych

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Zaawansowana Grafika Komputerowa

Unity 2D - prosta gra

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

Unity 3D - efekty strzelania, koniec gry

Intro 4kb. sphere tracing. Maciej Matyka (maq / floppy) Dla koła naukowego Voxel

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

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

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

OpenGL : Prymitywy, obsługa klawiatury

Programowanie komputerowe. Zajęcia 7

Unity 3D - podpowiedzi w grze. System cząstek

OpenGL - tekstury Mapowanie tekstur

Programowanie Procesorów Graficznych

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

Język C++ zajęcia nr 2

Języki i techniki programowania Ćwiczenia 2

Programowanie strukturalne i obiektowe. Funkcje

Julia 4D - raytracing

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

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

RENDERING W CZASIE RZECZYWISTYM. Michał Radziszewski

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

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

Autodesk 3D Studio MAX Teksturowanie modeli 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 komputerowe. Zajęcia 1

Gry Komputerowe Interaktywna kamera FPP

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

6 Przygotował: mgr inż. Maciej Lasota

Plan wykładu. Akcelerator 3D Potok graficzny

Wyświetlanie terenu. Clipmapy geometrii

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Programowanie obiektowe - zadania

Wprowadzenie do WebGL

Programowanie gier komputerowych Tomasz Martyn Wykład 6. Materiały informacje podstawowe

Laboratorium 7 Blog: dodawanie i edycja wpisów

Lab 9 Podstawy Programowania

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Architektura gier komputerowych na wybranych przykładach. Krzysztof Rosiński

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

4. Projekt Bazy Danych

Tworzenie gier na urządzenia mobilne (zaoczne)

Poniżej pokazane są poszczególne etapy, w nawiasach kwadratowych znajdują się nazwy tekstur, które utworzymy w projekcie, a przy strzałkach nazwy

8 Przygotował: mgr inż. Maciej Lasota

Podłączanie bibliotek Zapis danych do pliku graficznego Generowanie promienia pierwotnego Import sceny z pliku Algorytm ray tracingu

Programowanie gier komputerowych. Tomasz Martyn. Wykład 3.

Programowanie gier 3D w HTML5. Andrzej P.Urbański Politechnika Poznańska

Gry komputerowe: efekty specjalne cz. 2

Do czego służą klasy?

1 DirectX Cell Shading

Uniwersytet Zielonogórski. Kurs: Autodesk 3D Studio MAX Komputerowa grafika 3D. 3dsmax Teksturowanie obiektów 3D

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Laboratorium 1 - Programowanie proceduralne i obiektowe

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

Klasy i obiekty cz II

Unity 3D - pierwsze skrypty

Pliki. Informacje ogólne. Obsługa plików w języku C

IX. Wskaźniki.(3 godz.)

Zaawansowane aplikacje WWW - laboratorium

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Struktury Struktura polami struct struct struct struct

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

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

Mapowanie sześcienne otoczenia (cubic environment mapping)

Instrukcja użytkowania

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

Wstęp Podstawy Pierwszy program Definiowanie sceny 3D Przekształcenia geometryczne... 47

OpenGL Światło (cieniowanie)

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Systemy wirtualnej rzeczywistości. Podstawy grafiki 3D

Zasoby. Musimy zaimportować zasoby dla gry z Asset Store

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

Unity. Platforma do tworzenia gier dla różnych systemów docelowych, m.in.: Windows, macos, ios, Android, Powstała w 2005 r., obecnie wersja 5.3.

Unity 3D - tworzenie sceny

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

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

2 Przygotował: mgr inż. Maciej Lasota

Deklaracja i definicja metod, zwracanie wartości z metod, przekazywania parametrów do metod

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Deklaracja struktury w C++

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Model oświetlenia. Radosław Mantiuk. Wydział Informatyki Zachodniopomorski Uniwersytet Technologiczny w Szczecinie

Wykład 4: Klasy i Metody

Transkrypt:

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

Klasa Stwórzmy najpierw klasę TextureManager, która będzie obsługiwała tekstury w projekcie. 2/29

Klasa Stwórzmy najpierw klasę TextureManager, która będzie obsługiwała tekstury w projekcie. Należy dodać plik brick.jpg do folderu resource. Plik może zostać znaleziony w internecie, nazwa może być dowolna, musi być ona jednak zgodna z tym w kodzie. 3/29

Klasa Użyjmy metody TextureManager::init() w celu wczytania tekstur do naszej gry wewnątrz funkcji GLWidget::InitializeGL() w glwidget.cpp. Do glwidget.cpp trzeba dodać #include TextureManager.h. 4/29

Teksturowanie - Pierwszym etapem implementacji teksturowania jest rozbudowa shaderów o wczytywanie współrzędnych tekstury, użycie samplera 2D i jego użycie. shader.vs attribute vec4 vertex; attribute vec3 normal; attribute vec2 uvcoord; uniform mat4 projmatrix; uniform mat4 viewmatrix; uniform mat4 modelmatrix; uniform highp int hastexture; uniform sampler2d texture; varying highp vec3 fragnormal; varying highp vec3 vertexworldspace; varying highp vec2 fraguv; struct Light { highp vec3 position; highp vec3 ambient; highp vec3 diffuse; }; uniform Light light; void main() { fragnormal = (modelmatrix * vec4(normal, 0)).xyz; fraguv = uvcoord; vertexworldspace = (modelmatrix * vertex).xyz; gl_position = projmatrix * viewmatrix * modelmatrix * vertex; } 5/29

Teksturowanie - shader.fs uniform highp vec3 modelcolor; uniform highp int hastexture; uniform sampler2d texture; varying highp vec3 fragnormal; varying highp vec3 vertexworldspace; varying highp vec2 fraguv; struct Light { highp vec3 position; highp vec3 ambient; highp vec3 diffuse; }; uniform Light light; void main() { highp vec3 N = normalize(fragnormal); highp vec3 L = normalize(light.position - vertexworldspace); highp float cosnl = dot(n, L); cosnl = clamp(cosnl, 0.0, 1.0); highp vec3 coloramb = modelcolor * light.ambient; highp vec3 colordif = modelcolor * light.diffuse * cosnl; highp vec3 colorfull = clamp(coloramb + colordif, 0.0, 1.0); highp vec3 tex = texture2d(texture, fraguv).xyz; } if(hastexture == 1) gl_fragcolor = vec4(colorfull * tex, 1.0); else { gl_fragcolor = vec4(colorfull, 1.0); } 6/29

Teksturowanie - shadery W klasie GLWidget w glwidget.h trzeba dodać zmienną m_hastextureloc typu int, która będzie przechowywać lokację zmiennej hastexture w shaderze. Trzeba także przypisać wartość tej zmiennej w GLWidget::initializeGL() w glwidget.cpp. 7/29

Teksturowanie - Klasa GameObject Dodajemy do klasy GameObject w gameobject.h QOpenGL_Texture* i ustawiamy je na nullptr. pole Należy dodać #include <QOpenGLTexture> do gameobject.h. typu 8/29

Teksturowanie - Należy rozwinąć klasę CMesh aby przechowywała obok pozycji wierzchołków i ich normalnych współrzędne tekstur. Do funkcji CMesh::add() trzeba dodać dodatkowy parametr const QVector2D &uv i dodać jego współrzędne do wektora m_data. 9/29

Teksturowanie - Aktualizacja VAO Należy zaktualizować funkcję CMesh::initVboAndVao(), aby rozszerzyła przekazywane atrybuty w VAO o współrzędne tekstur, a także włączyła ich przekazywanie. Należy zwrócić uwagę o zmianę niektórych parametrów! 10/29

Teksturowanie Mapowanie sześcienne i sferyczne Należy zaktualizować współrzędnych tekstury. Trzeba także zaktualizować funkcję CMesh::generateSphere() także o współrzędne tekstury (mapowanie sferyczne). funkcję CMesh::quad3() o dodanie 11/29

Teksturowanie Współrzędne tekstur modelu 3D Przy wczytywaniu modeli 3D w CMesh::generateMeshFromObjFile () do funkcji CMesh::Add() trzeba przekazać także wczytane współrzędne tekstury. 12/29

Teksturowanie Rendering Przy renderingu obiektów należy sprawdzić, czy obiekt ma teksturę. Jeśli ją posiada, należy włączyć teksturowanie i ustawić odpowiednią teksturę. W funkcji GLWidget::paintGL() do pętli renderującej obiekty należy dodać sprawdzenie czy obiekt ma teksturę i opcjonalne włączenie jej. 13/29

Teksturowanie Dodanie tekstury do obiektu Mając zaimplementowany w przedstawiony sposób menedżer teksturowania, aby dodać teksturę do obiektu należy do pola m_teksture przypisać wartość zwróconą z funkcji TextureManager::getTexture(). Przykład Cube : 14/29

Teksturowanie Efekt końcowy 15/29

Kolizje - struktura Triangle Aby zrobić kolizję obiektów ze środowiskiem, potrzeba będzie struktura przechowująca atomiczny element sceny, struct Triangle. Całość będziemy przechowywać w klasie GLWidget (glwidget.h). Oprócz tego w pliku glwidget.h dodajmy wektor trójkątów, siatkę (VAO), funkcję dodającą nowy trójkąt, a także funkcję inicjalizującą trójkąty. 16/29

Kolizje - Inicjalizacja oraz dodawanie Należy zaimplementować funkcje GLWidget::initCollisionTriangles() oraz GLWidget::addTriangleCollider() w pliku glwidget.h. Należy zwrócić uwagę na komentarz gdzie wstawić nowy kolider. Można wstawić dwa przykładowe kolidery (podłoga). W klasie CMesh będzie potrzebne przeniesienie kilku pól do public. 17/29

Kolizje - Inicjalizacja oraz dodawanie Należy uruchomić funkcję GLWidget::addTriangleCollider() GLWidget::initializeGL() w pliku glwidget.cpp. w 18/29

Kolizje - Poprzednia pozycja obiektów Do policzenia kolizji obiektów z trójkątami będzie potrzebna poprzednia pozycja obiektów. W tym celu należy dodać do klasy GameObject pola. Do pętli wykrywającej kolizje obiektów ze sobą dodajmy linijkę kodu przechowującą poprzednią pozycję obiektów, przed aktualizacją. Przy okazji możemy dodać grawitację, oraz lekko poprawić obsługę kolizji obiektów (odpychanie ich bez korzystania z energii). 19/29

Kolizje - Poprzednia pozycja obiektów 20/29

Kolizje - Wykrywanie Do funkcji GLWidget::updateGL() w pliku glwidget.cpp należy dodać wyszukiwanie kolizji z trójkątami. 21/29

Kolizje - Renderowanie Przed renderowaniem trzeba fragmentów geometrii siatki. zaimplementować renderowanie W klasie CMesh należy przeciążyć funkcję render(), tak by renderowała wskazany fragment (cmesh.h, cmesh.cpp). 22/29

Kolizje - Renderowanie Do funkcji GLWidget::paintGL() w pliku glwidget.cpp należy dodać renderowanie z trójkątami. 23/29

Kolizje - Przykładowa scena Poniższy kod można wstawić do GLWidget::initCollisionTriangles() w celu uzyskania przykładowej sceny. Kod pod adresem : http://mchwesiuk.pl/wp-content/uploads/2019/04/qtglgame-sample-scene.txt Należy dodać pliki grass.jpg i wood.jpg do folderu resources, a także wczytać je w funkcji TextureManager::init() Można poprawić oświetlenie ustawiając źródło światła za pozycję gracza (GLWidget::paintGL(), glwidget.cpp). 24/29

Kolizje - Efekt końcowy 25/29

Można wykorzystać mapę wysokości żeby wygenerować teren. Należy znaleźć taką mapę na internecie (lub stworzyć samemu) i zapisać do folderu resource. 26/29

- implementacja Należy dodać deklarację metody loadheightmap() do klasy GLWidget w pliku glwidget.h, oraz jej definicję w glwidget.cpp, oraz użyć tej metody wewnątrz GLWidget::initCollisionTriangles() (glwidget.cpp). Deklaracja GLWidget::loadHeightMap() (glwidget.h) : Użycie GLWidget::loadHeightMap() (glwidget.cpp) : Implementacja GLWidget::loadHeightMap() na kolejnym slajdzie. 27/29

- implementacja Implementacja GLWidget::loadHeightMap() (glwidget.cpp) : 28/29

- efekt końcowy 29/29