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

Podobne dokumenty
Gry Komputerowe Interaktywna kamera FPP

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

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

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

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

i = [ 0] j = [ 1] k = [ 0]

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

Wprowadzenie do QT OpenGL

Grafika Komputerowa Wykład 2. Przetwarzanie obrazów. mgr inż. Michał Chwesiuk 1/38

Ćwiczenie nr 2 - Rysowanie precyzyjne

Pong to dwuwymiarowy symulator tenisa sportowego. Gracz, poruszając prostokątem symulującym paletkę, stara się zdobyć punkt poprzez posłanie piłki

Przekształcenia geometryczne. Dorota Smorawa

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

2 Przygotował: mgr inż. Maciej Lasota

OpenGL : Prymitywy, obsługa klawiatury

Ćwiczenie nr 2 - Rysowanie precyzyjne

Zasoby. Musimy zaimportować zasoby dla gry z Asset Store

Rzutowanie DOROTA SMORAWA

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.

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

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

2.1. Duszek w labiryncie

Lekcja 5 - PROGRAMOWANIE NOWICJUSZ

Zakład Systemów Rozproszonych

Wykłady z Matematyki stosowanej w inżynierii środowiska, II sem. 2. CAŁKA PODWÓJNA Całka podwójna po prostokącie

Rysunek 1: Okno timeline wykorzystywane do tworzenia animacji.

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

54. Układy współrzędnych

Strzelanka dla dwóch graczy

I. Spis treści I. Spis treści... 2 II. Kreator szablonów Tworzenie szablonu Menu... 4 a. Opis ikon Dodanie nowego elementu...

Unity 2D - prosta gra

Modelowanie i obliczenia statyczne kratownicy w AxisVM Krok po kroku

Temat: Transformacje 3D

Mapowanie sześcienne otoczenia (cubic environment mapping)

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

Skróty klawiaturowe w systemie Windows 10

Organizacja zajęć. Wprowadzenie do programu AutoCAD

Wykłady z Matematyki stosowanej w inżynierii środowiska, II sem. 3. CAŁKA POTRÓJNA

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

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

ROBOTYKA. Odwrotne zadanie kinematyki - projekt.

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

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

Dokument hipertekstowy

Allegro5 3/x. Przykład wklejamy go do dev'a zamiast kodu domyślnego dal programu z allegro i kompilujemy.

1.1. Przykład projektowania konstrukcji prętowej z wykorzystaniem ekranów systemu ROBOT Millennium

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

Budowa i generowanie planszy

przedmiot kilka razy, wystarczy kliknąć przycisk Wyczaruj ostatni,

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

2017 Electronics For Imaging, Inc. Informacje zawarte w niniejszej publikacji podlegają postanowieniom opisanym w dokumencie Uwagi prawne dotyczącym

DARMOWA PRZEGLĄDARKA MODELI IFC

W powyższym kodzie utworzono wyliczenie dni tygodnia.

Obliczenie azymutu ze współrzędnych wersja C++ Builder

3. KINEMATYKA Kinematyka jest częścią mechaniki, która zajmuje się opisem ruchu ciał bez wnikania w jego przyczyny. Oznacza to, że nie interesuje nas

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

BOC INFORMATION TECHNOLOGIES CONSULTING. Zadania. Przykład bankowy

Obsługa programu Soldis

Zad. 7: Sterowanie robotami mobilnymi w obecności przeszkód

Politechnika Poznańska Instytut Technologii Mechanicznej. Laboratorium Programowanie obrabiarek CNC. Nr 2

Scenariusz lekcji Ozobot w klasie: Spacer losowy po układzie współrzędnych

Podstawy Programowania Obiektowego

Programowanie gry Smerf w labiryncie

Zad. 5: Rotacje 3D. 1 Cel ćwiczenia. 2 Program zajęć. 3 Opis zadania programowego

Słowem wstępu. Część rodziny języków XSL. Standard: W3C XSLT razem XPath 1.0 XSLT Trwają prace nad XSLT 3.0

Szczegółowy program szkolenia:

Zad. 6: Sterowanie robotem mobilnym

Advance CAD 2016 SP1. W tym dokumencie opisano ulepszenia w programie Advance CAD 2016 z dodatkiem Service Pack 1. Co nowego w Advance CAD 2016 SP1

Ping-Pong. Gra dla dwóch graczy.

Aplikacje geodezyjne

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Spadające jabłuszka. licencja CC-BY-SA Uznanie autorstwa Na tych samych warunkach 3.0 Polska. Strona 51

MODYFIKACJA OBIEKTÓW W AUTOCADzie Wybór obiektów do modyfikacji Wybór bezpośredni, okno, przecięcie, poprzednie (z ostatniej komendy), ostatni (jeden

Poziom 2. Pustynny wyścig

TEMAT: PRZEKSZTAŁCENIA WYKRESÓW FUNKCJI PRZESUNIĘCIE O WEKTOR

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Scenariusz zajęć. Moduł V. Projekt Gra zręcznościowa odbijanie piłeczki

1 Podstawy c++ w pigułce.

Grafika Komputerowa Materiały Laboratoryjne

Podstawy programowania w języku C i C++

Moduł Grafika komputerowa i multimedia 312[01].S2. Ćwiczenia Podstawy programu Autocad 2011 Prosta

Rys. 1. Brama przesuwna do wykonania na zajęciach

Informatyka II Laboratorium 3 : Programowania obiektowe C++ - dziedziczenie

Grafika 3D program POV-Ray - 1 -

Programowanie w Scratch robot mbot

Grafika Komputerowa, Informatyka, I Rok

Przykład integracji kalkulatora mbank RATY na platformie IAI

Opis środowiska Scratch

Podstawy elektromagnetyzmu. Wykład 1. Rachunek wektorowy

Laboratorium Maszyny CNC. Nr 4

P S E U D O K L A S Y I P S E U D O E L E M E N T Y

Notacja Denavita-Hartenberga

Programowanie strukturalne i obiektowe. Funkcje

Zadanie polega na zbudowaniu i wyświetleniu przykładowej animowanej sceny przedstawiającej robota spawalniczego typu PUMA.

Układy VLSI Bramki 1.0

Zajęcia z grafiki komputerowej Pov Ray część 2

Systemy wirtualnej rzeczywistości. Podstawy grafiki 3D

Prof. Danuta Makowiec Instytut Fizyki Teoretycznej i Astrofizyki pok. 353, tel danuta.makowiec at gmail.com

Wektory, układ współrzędnych

NARZĘDZIA DO ZAZNACZANIA

Transkrypt:

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

a model 2/11

Stwórz nową klasę Player a model Do stworzonej klasy Player w pliku player.h dodaj trzy pola (trzeba dodać #include <QVector3D>). QVector3D position; QVector3D direction; float speed; W ciele konstruktora ustaw te pola na domyślne wartości. position = QVector3D(0, 0, 0); direction = QVector3D(0, 0, -1); speed = 0.01f; Do klasy GLWidget dodaj pole typu player (należy także w pliku glwidget.h dodać #include<player.h>) Player m_player; 3/11

a model Funkcja lookat() pozwala na ustawienie macierzy widoku w taki sposób, że będziemy obserwować scenę z danego punktu w danym kierunku. Funkcja ta przyjmuje trzy parametry : Eye - pozycja kamery Target - punkt w który patrzy kamera Up - wektor góry Parametry eye i target ustawiamy w zależności od rodzaju kamery. First Person Perspective Eye = position Target = position + direction Third Person Perspective Eye = Position - Direction Target = Position Wektor góry ustawiamy na wektor, który symbolizuje górę na naszej scenie. Domyślna wartość : [0, 1, 0] 4/11

W funkcji GLWidget::paintGL() wyszukujemy poprzednie ustawienie kamery a model m_camera.settoidentity(); m_camera.translate(0, 0, -m_camdistance); m_world.settoidentity(); m_world.rotate(m_camxrot, 1, 0, 0); m_world.rotate(m_camyrot, 0, 1, 0); m_world.rotate(m_camzrot, 0, 0, 1); i zamieniamy na ustawienie kamery FPP m_camera.lookat( m_player.position, m_player.position + m_player.direction, QVector3D(0, 1, 0) ); bądź kamery TPP m_camera.lookat( m_player.position - m_camdistance * m_player.direction, m_player.position, QVector3D(0, 1, 0) ); Przed m_camera.lookat() dodajemy m_camera.settoidentity(); m_world.settoidentity(); 5/11

Sterowaniem graczem Należy zaimplementować poruszaniem się graczem za pomocą klawiatury zależnego od wektora direction. a model Przykład poruszania do przodu (wstawić do funkcji updategl() ) if(m_keystate[qt::key_w]) { m_player.position.setx(m_player.position.x() + m_player.direction.x() * m_player.speed); m_player.position.setz(m_player.position.z() + m_player.direction.z() * m_player.speed); } W podobny sposób można zaimplementować poruszanie się do tyłu, oraz na boki. Do tyłu : posx = posx - dirx * speed posz = posz - dirz * speed W lewo : posx = posx + dirz * speed posz = posz - dirx * speed W prawo : posx = posx - dirz * speed posz = posz + dirx * speed 6/11

Obrót kamery w jednej osii Obrót kamery według jednej osii można osiągnąć za pomocą współrzędnych biegunowych. Najczęściej podczas opisywania punktu w przestrzeni dwuwymiarowej wykorzystujemy współrzędne kartezjańskie, które opisują punkt za pomocą dwóch zmiennych : X i Y. Współrzędne biegunowe polegają na opisaniu tych współrzędnych za pomocą dwóch innych atrybutów : promień wodzący r - odległość punktu P od środka układu współrzędnych O amplituda punktu φ - kąt pomiędzy osią OX, a wektorem OP a model 7/11

Obrót kamery w jednej osii W funkcji updategl() dodać poniższe linie kodu : a model if(m_keystate[qt::key_q]) { float phi = atan2(m_player.direction.z(), m_player.direction.x()); phi = phi - 0.05; m_player.direction.setx(cos(phi)); m_player.direction.setz(sin(phi)); } Należy usunąć z funkcji keypressevent() : else if (e->key() == Qt::Key_Q) exit(0); Można dodać obrót w drugą stronę za pomocą klawisza E. 8/11

Obrót kamery w dwóch osiach Obrót kamery według dwóch osii można osiągnąć za pomocą współrzędnych sferycznych. a model Do przedstawienia tych współrzędnych bardzo pomocna jest wikipedia. Przekształcenie do układu sferycznego r = sqrt(x^2, Y^2, Z^2) // w naszym przypadku zawsze równe 1, nie trzeba liczyć phi = atan2(z, X) theta = acos(y / r) Przekształcenie z układu sferycznego X = r * sin(theta) * cos(phi) Y = r * cos(theta) Z = r * sin(theta) * sin(phi) Aby obracać kamerą za pomocą myszy, można wewnątrz funkcji mousemoveevent() użyć zadeklarowanych tam zmiennych dx oraz dy. // obliczenie phi i theta phi = phi + dx * 0.01; theta = theta + dy * 0.01; // ustawienie m_player.direction 9/11

Obrót kamery w dwóch osiach Przydatne funkcje do użycia : a model setmousetracking(true); w konstruktorze GLWidget. Powoduje ciągłe sprawdzanie przesunięć kursora. QCursor::setPos(mapToGlobal(QPoint(width()/2, height()/2))); w updategl() Ustawia co klatkę pozycję kursora na środek. Wymagana zmiana przeliczenia dx i dy w mousemoveevent() int dx = event->x() - width()/2; int dy = event->y() - height()/2; QCursor c = cursor(); c.setshape(qt::cursorshape::blankcursor); setcursor(c); w konstruktorze GLWidget. Ukryje kursor. Warto też sprawdzić czy obrót kamery w osii Y nie wychodzi po za bezpieczny obszar (w funkcji mousemoveevent() po edycji theta względem dy). if(theta < 0.01) theta = 0.01; if(theta > 3.14) theta = 3.14; 10/11

TPP a model gracza Można dodać poruszanie się robotem za pomocą zaimplementowanej klasy player. a model W miejscu gdzie był kod przesunięcia robota (wewnątrz jego bloku push/pop m_world.translate(m_robotposition); Wstawić translację o wektor m_player.position. m_world.translate(m_player.position); Aby robot był obrócony w kierunku wektora direction gracza, należy w tym samym miejscu po translacji wstawić obrót o kąt phi według osii Y wyliczony za pomocą konwersji do współrzędnych sferycznych, której używaliśmy do obrotu kamery. Ten kąt musi być skonwertowany w radianów na stopnie, oraz przemnożony przez -1, należy także dodać 90. float phi = atan2(m_player.direction.z(), m_player.direction.x()); m_world.rotate(-phi * 180.0f / M_PI + 90, 0, 1, 0); Przez wprowadzenie dynamicznego obrotu obiektów na scenie, należy zmienić przeliczenie wektorów normalnych w programach cieniujących (shaderach). W pliku shader.vs zamień linijkę fragnormal = normal; na fragnormal = (modelmatrix * vec4(normal, 0)).xyz; 11/11