Download as pdf or txt
Download as pdf or txt
You are on page 1of 22

Sprawozdanie

Grafika komputerowa
Laboratoria 3-7

Jan Kościółek
Jakub Ciurkot
L04
Lab 3 Budowanie obiektu sterowanego
Temat zajęć:
Należy zbudować „robot rolniczy” (łazik) wykorzystując
wyłącznie prymitywy bazujące na trójkącie. Obiekt ten będzie
wykorzystywany na kolejnych zajęciach. W tworzonej grze
komputerowej użytkownik będzie miał możliwość sterowania
tym łazikiem.
Wymagania:
Obiekt łazika powinien być złożony z co najmniej 25 brył
elementarnych zbudowanych przy użyciu prymitywów
bazujących na trójkącie oraz projekt napisany obiektowo w
C++.
Przebieg i sprawozdanie z zajęć:
Stworzyliśmy nowy projekt w języku c++ aplikacji konsoli
windows za pomocą programu Visual studio 2022. Tam
przerobiliśmy przykładowy program sześcian z języka c,
zmieniając odpowiednie komendy i wykonując odpowiednie
rzutowanie typów.
W otrzymanym projekcie c++ tworzymy nową klasę projekt.
W pliku projekt.h definiujemy wszystkie metody tworzące
elementy łazika.
Rys 3.1 Plik projekt.h.

W klasie projekt znajdują się następujące metody prywatne:


➢ obudowa- metoda tworzy czerwony prostopadłościan
będący głównym elementem pojazdu. Ponadto w środku
prostopadłościanu znajduję się bryła imitująca moduł
pojazdu. [4 bryły]
➢ przy_kole_[1-4] - cztery metody tworzące
pomarańczowe obudowy wokół kół. [4 bryły]
➢ kolo_[1-4] - cztery metody tworzące czarne walce
będące kołami pojazdu. [4 bryły]
➢ lampka_[1-2]- dwie metody tworzące lampki z przodu
pojazdu. [6 brył]
➢ raczka_[1-2]- dwie metody tworzące rączki z przodu
pojazdu. [6 brył]
➢ grzbiet- metoda tworzaca szary prostopadłościan
będący grzbietem pojazdu. [1 bryła]
➢ antena- metoda tworząca antenę z tyłu pojazdu.
[2 bryły]
W klasie znajduję się metoda publiczna zbuduj(), w której
wywoływane są wszystkie metody budujące łazik [27 brył].

Rys 3.2 Fragment metody przy_kole_1().


Rys 3.3 Łazik.

Rys 3.4 Łazik.


Rys 3.5 Łazik

Rys 3.6 Łazik


Lab 4 Budowanie otoczenia
Temat zajęć:
Należy zbudować elementy otoczenia, w którym będzie
poruszał się robot rolniczy wykorzystując wyłącznie
prymitywy bazujące na trójkącie. Elementy te będą
wykorzystywane na kolejnych zajęciach i będą powiązanie z
fabułą gry.
Wymagania:
Import otoczenia z programu graficznego (otoczenie o
podłożu nieregularnym i minimum 1 obiekt dodatkowy).
Przebieg i sprawozdanie z zajęć:
Do projektu dodajemy klasę model w której tworzymy dwie
publicznie metody load() i draw().
W metodzie load pobieramy odpowiedni plik z rozszerzeniem
obj, pobieramy jego treść linijka po linijce zapisując
współrzędne w nim zawarte w odpowiednim formacie.
Rys 4.1 Fragment metody load w klasie model.

Metoda draw rysuje na ekranie nasz model.


Ponadto tworzymy klasę otoczenie, w której tworzymy
obiekty otoczenie w opengl.

Rys 4.2 Plik otoczenie.h.


W pliku otoczenie.h znajdują się metody publiczne:
➢ slup- metoda tworzy dwa słupy będące elementem
pojedynczego fragmentu płotu
➢ wypelnienie_plota_1- metoda tworzy wypełnienie
pojedynczego fragmentu płotu postawionego pionowo.
➢ plot_1- metoda rysuje pojedynczy płot ustawiony
pionowo, korzystając z metod słup i
wypelnienie_plota_1.
➢ wypelnienie_plota_2- metoda tworzy wypełnienie
pojedynczego fragmentu płotu postawionego poziomo.
➢ plot_2- metoda rysuje pojedynczy płot ustawiony
poziomo, korzystając z metod słup i
wypelnienie_plota_1.
➢ ogrodzenie- metoda za pomocą pętli for tworzy
ogrodzenie złożone z elementów płotu. Korzysta się z
metod plot_1 i plot_2.
W metodzie publicznej zbuduj wywołana jest metoda
ogrodzenie. Ponadto w projekcie użyta jest metoda publiczna
podloga, która stworzy prostokąt będący prostym podłożem.
Rys 4.3 Fragment metody ogrodzenie klasy otoczenie

Rys 4.4 Efekt zaimportowania modelu .obj i narysowania obiektów klasy otoczenie.
Lab 5 Teksturowanie
Temat zajęć:
Należy dokonać teksturowania obiektów projektu według
przedstawionych kryteriów.
Wymagania:
Teksturowanie obiektów otoczenia, powierzchni i łazika oraz
utworzenie autorskiego rozwiązania sterowaniem kamerą
Przebieg i sprawozdanie z zajęć:
Do projektu w funkcji RenderScene funkcję gluLookAt(), aby
umieścić kamerę na planszy.

Rys 5.1 Rozwiązanie ustawienia kamery.

Do klasy otoczenie dodajemy publiczną metodę GLuint


loadBMP_custom(const char* imagepath), której zadaniem
jest wczytanie obrazu tekstury. Do przekazania tekstury
posłużą pliki z rozszerzeniem bmp, o formacie kwadratu o
boku długości wielokrotności liczby 2.
Rys 5.2 Fragment metody loadBMP_custom klasy otoczenie

W funkcji RenderScene wczytujemy teksturę i ustawiamy ją


na wybranych obiektach.

Rys 5.3 Utworzenie obiektów tekstury i wywołanie metod ustawiających je na planszy.


Rys 5.4 Przykładowe teksturowanie obiektu.

Rys 5.5 Projekt po włączeniu tekstur.


Rys 5.6 Obiekt sterowany po teksturowaniu.

Lab 6 Sterowanie obiektem głównym


Temat zajęć:
Należy zaimplementować sterowanie obiektem głównym.
Wymagania:
Implementacja prostej fizyki sterowania oraz
zaimplementowanie podstawowych zagadnień fizycznych
takich jak pęd ciała.
Przebieg i sprawozdanie z zajęć:
Do projektu dodajemy 3 zmienne globalne xPojazdu i
yPojazdu, odpowiadające za położenie łazika oraz zRot
odpowiadającą za kąt obrotu łazika.
Do obsługi przycisków dodajemy wyłapywanie przycisków w,
s, a i d. Przyciski te odpowiadać będą za kierowanie łazika.

Rys 6.1 Obsługa przycisków w,s,a i d w case WM_KEYDOWN.

Modyfikujemy metody klasy projekt. Dodając do każdej


używanej metody 2 parametry określające współrzędne x i z
położenia obiektu na planszy (zmienna y jest stała).
Rys 6.2 Plik projekt.h po modyfikacji.

Tworzymy metodę publiczną ruch przyjmującą 3 zmienne


typu double pierwsza określa położenie współrzędnej x,
druga określa kąt obrotu łazika, a trzecia położenie
współrzędnej z. Metoda ta zastąpi w klasie głównej metodę
zbuduj.
Teraz przed narysowaniem obiektu na mapie musimy go
odpowiednio obrócić i przemieścić. Posłużą nam do tego
funkcję glRotatef oraz glTranslatef. Funkcja glRotatef obraca
obiekt zawszę względem punktu 0,0 dlatego musimy
wyrysować nasz obiekt w punkcie 0,0 obrócić go, a następnie
narysować w odpowiednim miejscu.
Rys 6.3 Metoda ruch w klasie projekt

Poza zaimplementowaniem podstawowego ruchu łazika po


mapie, dodaliśmy zasadę zachowania pędu.
Dodaliśmy zmienną globalną tarcie, która odpowiada za
stopniowy spadek prędkości łazika.

Rys 6.3 Fragment funkcji RenderScene odpowiedzialny za implementację zasady zachowania pędu
Rys 6.4 Łazik przemieszczony na mapie.

Rys 6.5 Łazik przemieszczony na mapie.

Lab 7 krywanie kolizji


Temat zajęć:
Należy zaimplementować proste wykrywanie kolizji pomiędzy
łazikiem, a obiektami otoczenia.
Wymagania:
Implementacja wykrycia kolizji z co najmniej dwiema
przeszkodami znajdującymi się w dwóch różnych obszarach
sprawdzania odległości (grupowanie przeszkód w mniejsze
obszary wykrywania kolizji).
Przebieg i sprawozdanie z zajęć:
Do projektu dodajemy klase Kolizje. W pliku .h deklarujemy
następujące pola składowe:
➢ promien- zmienną całkowitą odpowiedzialną za
przechowywanie promienia kolizji wokół łazika.
➢ dystans- metodę sprawdzającą wzorem euklidesa czy
nastąpiła kolizja pomiędzy dwoma podmiotami.
➢ kolizja- publiczna metoda, która sprawdza, w którym
obszarze znajduję się łazik i sprawdzająca czy nie
nastąpiła kolizja pomiędzy łazikiem, a obiektem
znajdującym się w danej strefię.
Planszę podzieliłem na dwie części detekcji kolizji, jedną dla
obiektów o współrzędnej z większej od 225 i drugą dla
obiektów o współrzędnych z środka mniejszych od 225.

Rys 7.1 Plik Kolizje.h


Rys 7.2 Fragment metody kolizja klasy Kolizje

W funkcji RenderScene tworzymy obiekt klasy Kolizje i


ograniczamy modyfikację położenia łazika do przypadków, w
których nie następuję kolizja.

Rys 7.3 Modifikacja kodu w funkcji RenderScene

Granice obszarów kolizyjnych oraz obiekty sprawdzane pod


kątem kolizji są zaznaczone na poniższym zdjęciu:
Rys 7.4 Zobrazowanie kolizji występującej w projekcie

Rys 7.5 Przykładowa kolizja łazika z obiektem.

Poza wykrywaniem kolizji z obiektami, została ustawiona


opcja kolizji z ogrodzeniem.
W tym przypadku po prostu sprawdzamy czy współrzędna
środka łazika nie jest w odległości mniejszej lub równej od
długości promienia łazika od współrzędnych granicznych
mapy użytkowej.

Rys 7.6 Sprawdzanie kolizji w funkcji RenderScene


Rys 7.7 Przykładowa kolizja z ogrodzeniem.

You might also like