POLITECHNIKA CZĘSTOCHOWSKA WYDZIAŁ INŻYNIERII MECHANICZNEJ I INFORMATYKI PRACA INŻYNIERSKA

Wielkość: px
Rozpocząć pokaz od strony:

Download "POLITECHNIKA CZĘSTOCHOWSKA WYDZIAŁ INŻYNIERII MECHANICZNEJ I INFORMATYKI PRACA INŻYNIERSKA"

Transkrypt

1 POLITECHNIKA CZĘSTOCHOWSKA WYDZIAŁ INŻYNIERII MECHANICZNEJ I INFORMATYKI PRACA INŻYNIERSKA Zastosowanie technik programowania 3D do implementacji gry zręcznościowej Adapting techniques of 3D programming for implementation arcade game Bartosz Kiebdaj Nr albumu: Kierunek: Informatyka Promotor pracy: dr inż. Andrzej Grosser Praca przyjęta dnia: Podpis promotora: Częstochowa, 2012

2

3 Spis treści 1 Wstęp Cel i zakres pracy Struktura pracy Wprowadzenie do grafiki trójwymiarowej Biblioteka SDL Krótka historia Charakterystyka SDL Gry wykorzystujące SDL Biblioteka OpenGL Krótka historia Charakterystyka OpenGL Zalety OpenGL Bilioteka OpenAL Krótka historia Charakterystyka OpenAL Gry wykorzystujące OpenAL Oświetlenie Oświetlenie w grafice trójwymiarowej Oświetlenie w OpenGL Formaty OBJ i MTL Wprowadzenie Opis formatu Przykładowy obiekt Transformacje obiektów w OpenGL Translacja

4 Spis treści Rotacja Skalowanie Stos macierzy Kolizje Sposoby wykrywania kolizji Projekt gry komputerowej Battle City INŻ Opis gry Wykorzystane Techniki Diagram UML Diagram klas Opis najważniejszych klas Implementacja najważniejszych elementów aplikacji Inicjalizacja OpenGL i SDL Implementacja modelu 3D Implementacja tekstur Implementacja oświetlenia Obsługa klawiatury Implementacja czcionek Implementacja kolizji Implementacja transformacji i renderowania Główna pętla gry Efekt końcowy Podsumowanie 68 Literatura 69

5 1. Wstęp Gry komputerowe od początku swego istnienia cieszą się niemalejącą popularnością. Wszystko zaczęło się od prostych gier tekstowych, platformowych i zręcznościowych, gdyż możliwości ówczesnych komputerów nie pozwalały ich twórcom myśleć o zaawansowanej grafice. Jednakże wraz z postępem techniki komputerowej, na rynku pojawiał się coraz wydajniejszy sprzęt. Efekt widoczny był również na rynku gier. Gry wraz z upływem lat stawały się coraz bardziej zaawansone. W dzisiejszych czasach coraz częściej trudno odróżnić grafikę generowaną przez komputer od świata rzeczywistego. Efekty pracy twórców gier są tak imponujące, że coraz więcej ludzi postanawia spróbować swoich sił w programowaniu grafiki komputerowej. Jest to o tyle problematyczne, że ta dziedzina programowania należy do jednej z najtrudniejszych. Oprócz umiejętności programistycznych konieczna jest równiez wiedza matematyczna. W internecie można znaleźć wiele książek oraz kursów na temat tworzenia grafiki 3D. Można również znaleźć wiele materiałów na temat ich implementacji w różnych aplikacjach, najczęściej grach komputerowych. Ich twórcy pisząc swoje poradniki wykazują zainteresowanie głównie programowaniem na platformę Windows. W przypadku biblioteki DirectX to w pełni uzasadnione, gdyż jest ona napisana z myślą o systemach Microsoftu. Jednakże, również w przypadku OpenGL, ciężko szukać literatury, która umożliwiłaby naukę programowania gier trójwymiarowych pod środowiska Unix-owe Cel i zakres pracy Celem pracy było praktyczne zaprezentowanie najważniejszych technik programowania 3D. Pokazano podstawowe metody implementacji oświetlenia, wczytywania i transformacji obiektów trójwymiarowych a także wykrywania kolizji. Zakres pracy obejmował implementację gry zręcznościowej pokazującej wyżej wymienione techniki. Zaimplementowano w niej najważniejsze elementy niezbędne w każdym silniku graficznym, będące wprowadzeniem do zaawansowanego programowania gier. 5

6 1.2. Struktura pracy 6 Dokonano tutaj wyboru bibliotek w taki sposób, że możliwy jest zapis przenośnego kodu zarówno na platformy rodziny Windows jak i Linux. Całość umożliwiła dostarczenie materiałów szkoleniowych do wyżej wymienionych zagadnień Struktura pracy Praca składa się z pięciu rozdziałów. Pierwszy z nich to wstęp zawierający krótkie wprowadzenie, cel i zakres pracy oraz jej strukturę. Kolejny rozdział zatytułowany Wprowadzenie do grafiki trójwymiarowej zawiera opis bibliotek wykorzystywanych w programowaniu grafiki 3D: OpenGL, SDL i OpenAL oraz opis najważniejszych zagadnień związanych z tematem. W trzecim rozdziale zawarto projekt gry komputerowej, która posłużyła jako przykładowa aplikacja wykorzystująca grafikę trójwymiarową. Zaprezentowano w nim fragmenty diagramu klas oraz opis najważniejszych obiektów, w które został opakowany OpenGL. W rozdziale czwartym znajduje się implementacja najważniejszych i najciekawszych elementów silnika graficznego aplikacji. Zaprezentowano: inicjalizacje bibliotek, implementacje modeli 3D, oświetlenia, oteksturowania, wykrywanie kolizji, tranformacje obiektów w przestrzeni oraz obsługę klawiatury. Na końcu tego rozdziału zamieszczono zrzuty ekranu przedstawiające efekt końcowy gry. Ostatni rozdział zawiera podsumowanie pracy.

7 2. Wprowadzenie do grafiki trójwymiarowej W niniejszym rozdziale znajduje się krótkie wprowadzanie do programowania grafiki trójwymiarowej. Opisano w nim biblioteki, które wykorzystano do napisania przykładowej aplikacji: SDL, OpenGL oraz OpenAL. W dalszej części przedstawiono charakterystykę najważniejszych zagadnień związanych z grafiką komputerową. Ukazano, jak rozwiązano problem oświetlenia, w jaki sposób wczytywane są modele do aplikacji, w jaki sposób wykrywane są kolizje pomiędzy obiektami oraz jak przeprowadzane są transformacje obiektów w przestrzeni Biblioteka SDL Krótka historia Biblioteka SDL [4] powstała w 1998 roku. Jej twórcą jest Sam Lantinga, jeden z głównych programistów Blizzard Entertainment. Jej pierwotnym celem była możliwość przeportowania gier Windowsowych na inne platformy takie jak Macintosh. I tak niedługo po udostępnieniu biblioteki SDL powstała wersja gry DOOM pod system operacyjny Mac Os. Dzisiaj biblioteka wykorzystywana jest głównie w grach, których twórcy chcą zachować przenośność na różne systemy operacyjne. Największą popularnosć uzyskała w środowiskach UNIX owych Charakterystyka SDL SDL, a właściwie Simple DirectMedia Layer, to darmowa, wieloplatformowa biblioteka graficzna wspomagająca tworzenie gier i programów multimedialnych. Biblioteka ta w całości zaimplementowana jest w C, nie ma jednak problemów, żeby wykorzystywać ją również w C++. SDL posiada pełny mechanizm pozwalający generować grafikę 2D. Do tego zaimplementowano w nim wiele przydatnych mechaniznów takich jak wątki, obsługa zdarzeń. W bardzo prosty sposób można skorzystać z obsługi urządzeń wejścia/wyjścia 7

8 2.2. Biblioteka OpenGL 8 czy elementów sieciowych. Najważniejszą jednak cechą SDL, z punktu widzenia niniejsze pracy, jest możliwość wykorzystania OpenGL - SDL służy wtedy dla OpenGL jako API, zapewniające obsługę klawiatury, myszy, wczytywanie tekstur itp Gry wykorzystujące SDL Mimo tego, że SDL jest biblioteką darmową i ogólnodostępną wiele komercyjnych firm, zdecydowało się napisać gry korzystając właśnie z niej. Najpopularniejsze z nich to: Neverwinter Nights Angry Birds Heroes of Might and Magic 3 (tylko w wersji na Linuxa) 2.2. Biblioteka OpenGL Krótka historia Początki biblioteki OpenGL sięgają 1992 roku. Stworzyła ją grupa Silicon Graphics. Od tego czasu rozwijana jest praktycznie bez przerwy. Do 2006 roku nad rozwojem czuwała organizacja ARP zrzeszają 10 z największych firm informatycznych. Następnie projekt OpenGL wcielono do grupy Khronos, która prowadzi do dnia dziszejszego rozwój nad nim oraz kilkoma innymi bibliotekami [2] Charakterystyka OpenGL OpenGL czyli Open Graphics Library jest obok DirectX najpopularniejszym narzędziem wykorzystywanym w grafice 3D. Jest w pełni przenośna. Początkowo napisana w C doczekała się wielu portów na inne języki jak Java czy Perl. Umożliwia pełne programowanie grafiki, zarówno 2D jak i 3D. Pozwala to wczytać modele graficzne z takich programów jak Autodesk 3DS Max lub Blender. Mimo, że OpenGL kojarzy się głównie z programowaniem gier komputerowych jest wykorzystywany w wielu innych projektach - jest bardzo popularny w programach typu CAD (np. AutoCAD).

9 2.3. Bilioteka OpenAL Zalety OpenGL Stabilność - Obecna implementacja OpenGL jest dostępna na wielu platformach od wielu lat. Każda, nawet najdrobniejsza zmiana, jest bardzo dokładnie sprawdzana i kontrolowana aby wykluczyć możliwość wystąpienia błędów. Nowe wersje biblioteki są w pełni kompatybilne wstecz. Łatwy w użyciu - Biblioteka OpenGL jest bardzo łatwa do wykorzystania. Jest to spowodowane bardzo intuicyjnym systemem funkcji i metod. Programista wykorzystuje mniej linii kodu, w porównaniu z innymi bibliotekami graficznymi. Do tego sterowniki OpenGL posiadają informacje o warstwie sprzętowej przez co zwalniają użytkownika od programowania pod konkretne platformy sprzętowe. Przenośność - OpenGL jest w pełni przenośni pomiędzy systemami. Implementacja biblioteki jest dostępna w systemach z rodziny Windows, Unix czy MacOs X. Swoją wersję OpenGL posiada również system na urządzenia mobilne - Android. Dokumentacja - Jedną z największych zalet OpenGL jest jego dokumentacja. Na stronie projektu można znaleźć dokładny i bardzo szczegółowy opis każdej funkcji [2] Bilioteka OpenAL Nie jest to biblioteka graficzna, lecz dźwiękowa. Warto jednak wspomnieć o niej, gdyż umożliwia programowanie dźwięku przestrzennego, co niejako wiąże się z programowaniem 3D Krótka historia Biblioteka OpenAL - podobnie jak SDL - została zaprojektowana aby umożliwić portowanie gier z platformy Windows na Linux. Jej twórcą jest firma Loki Software. Początki sięgają roku 1998, kiedy to zaczęto rozmawiać o potrzebie implementacji biblioteki dźwiękowej, która byłaby uzupełnieniem OpenGL. I tak rok później zaczęły się prace, które zakończono w 2000 roku. Opisano wtedy pierwszą specyfikacje OpenAL. Postarano się,

10 2.3. Bilioteka OpenAL 10 aby była ona dostępna na każdym popularniejszym systemie(windows, Linux, Mac OS X itp.) Charakterystyka OpenAL OpenAL - Open Audio Library - jest biblioteką dźwiękową będącą interfejsem dla urządzeń audio. Jest pierwszym oprogramowaniem, które Creative-Technology objęło swoim wsparciem. Bilioteka, która powstała aby umożliwić portowanie gier na różne platformy, zyskała bardzo dużą popularność dzięki swojej prostocie. Programista może skupić się jedynie na implementacji podstawowych obiektów, same obliczenia dźwięku w przestrzeni odbywają się automatycznie. Zaimplentowano w niej wiele efektów dźwiękowych np. efekt Doplera. Wykorzystywanie kolejnych opcji nie wymaga od programisty wiedzy z zakresu obróbki dźwięku. Wystarczy w odpowiednim miejscu wywoływać kolejne funkcje. Wykorzystywana jest przez największych producentów gier np. ID Software Gry wykorzystujące OpenAL Prostota i wysokie możliwości OpenAL sprawiły, że stałą się ona popularna wśród producentów gier. Najsławniejsze gry wykorzystujące OpenAL: Doom 3 Enemy Territory: Quake Wars Wolfenstein Quake 4 Prey BattleField 2 1

11 2.4. Oświetlenie Oświetlenie Oświetlenie w grafice trójwymiarowej Punktem przełomowym w programowaniu grafiki 3D było uwzględnienie w obliczeniach oświetlenia obiektów. To właśnie dzięki niemu grafika zaczęła wyglądać realnie. Barwa obiektów zależy nie tylko od ich własnych kolorów, lecz jest obliczana na podstawie różnych źródeł oświetlenia, ich położenia w przestrzeni oraz parametrów takich jak tłumienie światła. Oświetlenie obiektu zależy od dwóch elementów: materiału czyli elementu absorbującego światło oraz źródła oświetlenia czyli elementu emitującego światło. Każdy z nich składa się z trzech parametrów określających światło na podstawie, których obliczane są kolory obiektów i sceny. Światło otoczenia Światło to nie posiada źródła ani kierunku. Rozchodzi się równomiernie w całej przestrzeni. Rozświetla jednostajnie scenę. Nie zostawia cieni na obiektach, nadając im jedynie jednostajny kolor. Model oświetlenia światłem otoczenia przedstawia rysunek 2.1. Rys Światło otoczenia

12 2.4. Oświetlenie 12 Światło rozproszone Światło rozproszone posiada źródło i jest jednostajne w każdym kierunku. W przeciwieństwie do światła otoczenia nie oświetla obiektów ze wszystkich stron. Jeżeli oświetlono lewą stronę obiektu, jego prawa część pozostanie w cieniu. Światło rozproszone, jak sama nazwa wskazuje, rozprasza się na powierzchni obiektu w sposób równomierny we wszystkich kierunkach. Model światła rozproszenia przedstawia rysunek 2.2. L N α Rys Odbicie rozproszone Równanie oświetlenia dla odbicia rozproszonego ma postać: I = I p K d cos α (2.1) gdzie: I - wynikowe natężenie światła I p - Natężenie światła punktowego źródła światła. K d - współczynnik odbicia rozproszonego materiału. L - Źródło światła. N - Normalna do powierzchni. α - Kąt pomiędzy kierunkiem źródła światła a normalną do powierzchni. Światło odbicia Zwane również odbiciem zwierciadlanym. W przeciwieństwie do światła rozproszonego, światło odbite odbija się od powierzchni obiektu tylko w jednym kierunku, nadając wrażania połysku. Model światła odbicia znajduje się na rysunku 2.3 gdzie: L - Źródło światła.

13 2.4. Oświetlenie 13 L N R αα Rys Odbicie zwierciadlane N - Normalna do powierzchni. R - Kierunek odbicia światła. α - Kąt pomiędzy kierunkiem źródła światła a normalną do powierzchni. Wektory normalne Aby można było prawidłowo obliczyć oświetlenie potrzebna jest informacja, w którą stronę zwrócona jest powierzchnia obiektu. Służą do tego specjalne wektory zwane normalnymi. Wektory te pomagają prawidłowo obliczyć oświetlenie w grafice w trójwymiarowej. Ich długość zawsze wynosi 1. Każdy wektor przypisany jest prostopadle do powierzchni. Model wektorów normalnych znajduje się na rysunku 2.4. Rys Wektory normalne na powierzchniach Materiały Materiał jest zbiorem cech powierzchni obiektu. Opisuje zmianę kolorów obiektu przy kontakcie z oświetleniem. Nadaje realizmu, odwzorowując cienie, rozbłyski i zmiany barw na modelach. Może zawierać informacje o teksturach, jeśli obiekt takie posiada.

14 2.4. Oświetlenie Oświetlenie w OpenGL Źródło światła Oświetlenie w OpenGL zostało zaimplementowane w intuicyjny sposób. Najważniejsze jest aby na początku włączyć możliwość oświetlenia. Służy do tego funkcja glenable z parametrem funkcji GL LIGHTING. Od momentu inicjalizacji przy tworzeniu źródeł światła interesująca jest praktycznie jedna funkcja a mianowicie gllight. Należy przekazać do niej 3 elementy. Pierwszy to numer oświetlenia podawany w celu wybrania źródła światła, należy tutaj podać stałą GL LIGHTx, gdzie x to liczba z przedziału od 0 do 7 (w OpenGL można jednocześnie korzystać z 8 źródeł światła). Drugi parametr tej funkcji służy do wybrania, która opcja oświetlenia jest modyfikowana (np. kolor światła rozproszenia, otoczenia, odbicia itp.). Trzecim jej parametrem są wartości opcji, i w zależnośći od tego co należy zmienić lub ustawić wpisuje się tu wektor lub pojedynczą zmienną. Opis możliwych do wybrania parametrów znajduje się w tabeli 2.1. Dodatkowo istnieje funkcja gllightmodel, którą możemy ustawić kolor globalnego oświetlenia, a co za tym idzie uzyskać efekt podobny do światła dziennego. Normalne Wektory normalne w OpenGL ustawia się przed wyświetleniem konkretnej powierzchni lub wierzchołka (w zależności jak powinno się je renderować). Służy do tego funkcja glnormal. Należy pamiętać aby wektory te były znormalizowane. Można co prawda ustawić flagę GL NORMALIZE aby OpenGL sam je normalizował, nie zaleca się jednak tego ze względu na optymalizację. Materiały Inicjalizacja i implementacja materiałów w OpenGL wygląda prawie identycznie jak w przypadku źródła oświetlenia. Służy do tego funkcja glmaterial. Pierwszy parametr określa czy materiał jest zdefiniowany dla przednich, tylnich czy obu ścian (Odpowiednio GL FRONT, GL BACK i GL FRONT AND BACK). Drugi i trzeci tak jak w funkcji gllighting, wartość można ustawić w postaci wektora lub pojedynczej zmiennej. W tabeli nr 2.2 znajduje się opis opcji dla materiału.

15 2.4. Oświetlenie 15 Tabela 2.1. Ustawienia opcji oświetlenia Opcja Opis GL AMBIENT Kolor światła otoczenia - Podaje się wektor czteroelementowy w postaci RGBA. GL DIFFUSE Kolor światła rozproszenia - Podaje się wektor czteroelementowy w postaci RGBA. GL SPECULAR Kolor światła otoczenia - Podaje się wektor czteroelementowy w postaci RGBA. GL POSITION Pozycja źródła światła. Również podaje się czteroelementowy wektor, z tym, że pierwsze trzy argumenty określają pozycję w formacie x, y, z. Czwarty element służy do ustalenia miejsca, gdzie światło znajduje się w przestrzeni. Jeśli wynosi 0 światło znajduje się w nieskończonej odległości od sceny a pierwsze 3 parametry określają kierunek jego padania. Jeżeli ustawiony jest na 1, wtedy światło znajduję się na określonej pozycji w przestrzeni i zachowuje się jak żarówka. GL CONSTANT ATTENUATION Określa zanik stały - osłabienie światła jest stałe niezależnie od odległości od źródła światła. GL LINEAR ATTENUATION Określa zanik liniowy - im dalej od źródła światła, tym oświetlenie jest bardziej stłumione.

16 2.5. Formaty OBJ i MTL 16 Tabela 2.2. Ustawienia opcji materiału Opcja Opis GL AMBIENT Kolor światła otoczenia - Podaje się wektor czteroelementowy w postaci RGBA. GL DIFFUSE Kolor światła rozproszenia - Podaje się wektor czteroelementowy w postaci RGBA. GL SPECULAR Kolor światła otoczenia - Podaje się wektor czteroelementowy w postaci RGBA. GL SHININESS Moc odbitego światła. Określa lśnienie obiektu 2.5. Formaty OBJ i MTL Wprowadzenie Formaty OBJ i MTL zostały opracowane przez firmę Wavefront Technologies dla ich programu Advanced Visualizer. Służą one do przenoszenia trójwymiarowych modeli pomiędzy różnymi programami. Mogą być zatem wykorzystane do przenoszenia grafiki z popularnych programów graficznych do gier komputerowych. Format obj może być przenoszony w formie binarnej (.mod) lub ASCII (.obj). W dalszej części znajduje się opis formatu w formie ASCII Opis formatu OBJ Plik może się zaczynać metadanymi informującymi o programie w jakim został wykonany. Informacja taka zaczyna się znakiem krzyżyka (#). Tym samym znakiem zaczynają się wszelkiego rodzaju komentarze, które można zapisać do pliku samodzielnie. Sama składnia plików obj należy do jednych z najprostszych. Brak w nim zbędnych opisów i znaków, jak choćby w formacie ASE wykorzystywanym przez 3DMax Studio. Na początku linijki znajduje się oznaczenie symbolizujące rodzaj wczytywanych danych. Następnie w zależności od oznaczenia występuje kilka zmiennych w różnym formacie. Najważniejsze oznaczenia zamieszcone są w tabeli 2.3.

17 2.5. Formaty OBJ i MTL 17 Tabela 2.3. Format OBJ Znacznik v vt vn f mtllib usemtl p l curv curv2 Opis Wierzchołki opisujące geometrie obiektu. Wierzchołek składa się z trzech współrzędnych. Współrzędne tekstur. Wierzchołki opisujące normalne. Wierzchołek składa się z trzech współrzędnych a łączna długość wektora nie może przekroczyć 1. Powierzchnie - zawierają numery wierzchołków i ewentualnie tekstur, z których jest utworzona oraz normalnych. Przykładowy format powierzchni może więc wyglądać tak: f 1/1/1 gdzie kolejne liczby oznaczają: numer wierzchołka/numer współrzędnej tekstury/numer wektora normalnego. Każda powierzchnia jest trójkątem. Plik mtl, z którego korzysta dany obiekt. Nazwa materiału lub tekstury. Występuje po współrzędnych tekstur, informuje do której tekstury współrzędne się odnoszą. Sam materiał zdefiniowany jest w pliku mtl. Punkt, opisany przez wektor trzyelementowy. Linia, opisana za pomocą dwóch współrzędnych. Linia krzywa trójwymiarowa. Podane są parametry określające poziom zaokrąglenia oraz numery wierzchołków pomiędzy, którymi zostanie narysowana krzywa Linia krzywa dwuwymiarowa. Podane są parametry określające poziom zaokrąglenia oraz numery wierzchołków pomiędzy, którymi zostanie narysowana krzywa

18 2.5. Formaty OBJ i MTL 18 Tabela 2.4. Format MTL Znacznik newmtl Ns Ka Kd Ks Ni d illum map Kd Opis Każdy nowy materiał zaczyna się od tego oznaczenia. Symbolizuje on nazwę materiału. Definuje skupienie odbicia światła Kolor materiału dla światła otoczenia Kolor materiału dla światła rozproszenia Kolor materiału dla światła odbitego Współczynnik załamiania Tłumienie światła Parametr określający ustawienia światła plik tekstury MTL W formacie MTL (stworzony na potrzeby OBJ, opisuje tekstury i materiały) podobnie jak w formacie obj na początku pliku znajdują się metadane. Informacje, jakie się tam znajdują, mówią o programie, który wygenerował plik oraz o liczbie materiałów w nim opisanych. Sama struktura pliku jest praktycznie taka sama jak obj. Zmieniają się tylko oznaczenia. Opis formatu znajduję się w tabeli Przykładowy obiekt Na rysunku 2.5 przedstawiony jest sześcian z nałożoną teksturą. Ten prosty obiekt został wykonany w programie Blender. Posłuży do zaprezentowania możliwości formatu. W listingu 2.1 prezentowany jest plik w formacie.obj opisujący ten sześcian. W pierwszych dwóch liniach znajdują się metadane informujące o programie, który stworzył obiekt. W trzeciej linii podana jest nazwa pliku mtl zawierającego materiały. Następnie linie o numerach od 4 do 11 prezentują wierzchołki opisywanego sześcianu. Linie od 12 do 25 to wierzchołki tekstury, której nazwa podana jest w kolejnej linii o numerze 26. Linie od 28 do końca listingu opisują powierzchnie modelu. Listing 2.2 przedstawia plik.mtl, w którym przechowywane są informacje o materia-

19 2.5. Formaty OBJ i MTL 19 Rys Oteksturowany sześcian z programu Blender łach. Pierwsze dwie linie zawierają informacje o programie, w którym został utworzony plik. W linii trzeciej znajduje się informacja o nazwie materiału. Następne linie od 4 do 10 opisują cechy materiału. Na końcu pliku w linii 11 znajduje się informacja o teksturze, którą zawiera materiał. Listing 2.1. Plik OBJ opisujący wierzchołki i oteksturowanie do tego szcześcianu 1 2 # Blender3D v249 OBJ File : box. blend 3 # www. blender3d. org 4 mtllib item. mtl 5 v v v v v v v v vt vt vt vt

20 2.5. Formaty OBJ i MTL vt vt vt vt vt vt vt vt vt usemtl item_mat 27 s off 28 f 5/1 1/2 4/3 29 f 5/1 4/3 8/4 30 f 3/5 7/2 8/6 31 f 3/5 8/6 4/7 32 f 2/8 6/9 3/10 33 f 6/9 7/1 3/10 34 f 1/9 5/6 2/1 35 f 5/6 6/2 2/1 36 f 5/1 8/4 7/11 37 f 5/1 7/11 6/12 38 f 1/5 2/13 3/3 39 f 1/5 3/3 4/2 Listing 2.2. Plik MTL opisujący materiały do tego szcześcianu 1 # Blender3D MTL File : item. blend 2 # Material Count : 1 3 newmtl item_mat 4 Ns Ka Kd Ks

21 2.6. Transformacje obiektów w OpenGL 21 8 Ni d illum 2 11 map_kd item. ppm 2.6. Transformacje obiektów w OpenGL Samo renderowanie obiektów to za mało, by stworzyć interaktywną aplikacje. Do tego potrzebne są metody manipulowania otoczeniem. W grafice trójwymiarowej istnieją trzy standardowe przekształcenia: translacja, rotacja i skalowanie. Za ich pomocą można ustawić każdy obiekt w zamierzonym miejscu, obrócić go oraz odpowiednio dopasować jego rozmiar. OpenGL posiada zaimplementowe wszystkie wymienione wcześniej możliwości transformacji przestrzeni Translacja Służy do przemieszczania obiektu w przestrzeni trójwymiarowej. W OpenGL-u jest realizowana przez funkcje gltranlatef(float x, float y, float z). Jako parametry podaje się wartości przesunięcia wierzchołków po kolejnych osiach: x, y oraz z. Na przykład wywołanie funkcji gltranslatef(2.0f,4.0f,0.0f) spowoduje przesunięcia obiektu o dwie jednostki w prawo po osi x oraz o 4 jednostki w górę po osi y Rotacja Rotacja jest obrotem obiektów w przestrzeni. Odbywa się za pomocą funkcji glrotatef(float angle, float x, float y, float z). Pierwszy parametr angle oznacza kąt o jaki ma zostać obrócony obiekt. Następne trzy zmienne oznaczają o jaki procent stopni względem osi ma nastąpić rotacja. Należy tutaj podać wartości z przedziału 0-1 gdzie wartość 0 oznacza, że obiekt nie obraca się po danej osi. Dla przykładu, przy wywołaniu funkcji glrotatef(90.f, 1.0f, 0.5f, 0.25f) obiekt zostanie obrócony o 90 stopni po osi x, 45 stopni po osi y oraz 22,5 stopnia po osi z.

22 2.6. Transformacje obiektów w OpenGL Skalowanie Skalowanie jest zmianą rozmiaru obiektu. W OpenGL-u służy do tego funkcja glscalef(float x,float y,float z). Kolejne parametry reprezentują, tak jak w przykładach powyżej, osie układu współrzędnych. Domyślnie wartości wszystkich trzech zmiennych wynoszą 1. Zwiększając lub zmiejszając te wartości uzyskuje się powiększenie lub pomniejszenie obiektu. Używając funkcji glscale3f(0.5f, 0.5f, 0.5f) obiekt zostanie pomniejszony o połowe, podczas gdy za pomocą funkcji glscalef(2.0f, 2.0f, 2.0f) ulegnie powiększeniu o połowę. Wartości parametrów nie muszą być równe, w takim wypadku obiekt może zostać rozciągnięty lub spłaszczony Stos macierzy Macierze są ważnym elementem OpenGL. Istnieje kilka rodzajów macierzy: perspektywy, modelu oraz widoku. Każda z nich ma wpływ na to co jest widoczne na ekranie. Każdy wierzchołek widoczny na ekranie obliczany jest z użyciem macierzy. Wywołując funkcje dokonujące transformacji wykonywane są operacje zmieniające zawartość macierzy. Wywołując którąkolwiek z wymienionych wyżej funkcji dokonywana jest transformacja wszystkich wierzchołków na scenie. Aby można było zmieniać tylko wybrane obiekty należy skorzystać ze stosu macierzy. Do operacji na stosie macierzy służą dwie funkcje: glpushmatrix() oraz glpopmatrix(). Pierwsza z nich odkłada stan macierzy na stos, podczas gdy druga go pobiera. Aby dokonać transformacji na konkretnym obiekcie należy zapisać aktualny stan macierzy na stos przed transformacjami obiekty, a na koniec pobrać je z powrotem jak w przykładzie poniżej: glpushmatrix(); gltranslate3f(...); glrotatef(...); glscalef(...); // Wyświetlanie wierzchołków obiektu. glpopmatrix();

23 2.7. Kolizje Kolizje W większości gier komputerowych, w których istnieje możliwość poruszania się po świecie lub planszy przesuwająca się postać napotyka przeszkody. Aby ta postać nie przeszła przez ściane czy drzewo należy wykryć kolizje pomiędzy tymi obiektami. Można to zrobić na kilka sposobów Sposoby wykrywania kolizji W grafice 2D można wyróżnić dwa najpopularniejsze sposoby wykrywania kolizji. Poprzez prostokąt oraz okręg. Obydwa mogą być zaadaptowane do gry trójwymiarowej, w której nie ma potrzeby sprawdzania kolizji w trzecim wymiarze. Kolizje po prostokącie W oparciu o rysunek 2.6 można zauważyć, że kolizja następuje w momencie, kiedy punkt P znajdzie się wewnątrz prostokąta. Każdy z wierzchołków prostokąt posiada współrzędne. Można założyć, że są to wartości minimalne i maksymalne współrzędnych po osiach x i y. Aby nastąpiła kolizja musi być spełnione następujy warunek: X min <= X p <= X max Y min <= Y p <= Y max gdzie X p i Y p to współrzędne punktu. D(x min,y max ) C(x max,y max ) P A (x min,y min ) B(x max,y min ) Rys Kolizje oparte na prostokącie

24 2.7. Kolizje 24 Kolizje po okręgu Na rysunku 2.7 zaznaczono okrąg i punkt P. Kolizja następuje, kiedy punkt znajdzie się w promieniu okręgu. A zatem jeżeli spełniona jest nierówność: gdzie: r >= X p i Y p to współrzędne punktu X o i Y o to współrzędne środka okręgu. (X p + X o ) 2 + (Y p + Y o ) 2 P Rys Kolizje oparte na okręgu Kolizje oparte na sześcianie Kolizje te są bardzo podobne do tych w których wykorzystuje się prostokąt. Jedyną różnicą jest fakt dodania kolejnego wymiaru, a co za tym idzie sprawdzenia kolejnego warunku. Tym razem po osi Z. A zatem kolizja następuje jeżeli: X min <= X p <= X max Y min <= Y p <= Y max Z min <= Z p <= Z max gdzie X p, Y p i Z p to współrzędne punktu P, a pozostałe zmienne określają minimalne i maksymalne współrzędne sześcianu. Warto zwrócić uwagę na fakt, że z ośmiu wierzchołków sześcianu do obliczeń potrzebne są tak naprawdę dwa. Jeden z samymi minimalnymi wartościami a drugi z samymi maksymalnymi. Na rysunku 2.8 ukazano kolizję opartą na sześcianie.

25 2.7. Kolizje 25 Rys Kolizje oparte na sześcianie

26 3. Projekt gry komputerowej W niniejszym rozdziale znajduje się projekt gry zręcznościowej stworzonej jako przykład aplikacji trójwymiarowej. Opisano również jej najważniejsze klasy, w które opakowano OpenGL Battle City INŻ Opis gry Gra Battle City INŻ została stworzona na podstawie popularnej gry z konsoli NES Battle City. Gracz steruje czołgiem. Jego zadaniem jest zniszczenie wszystkich przeciwników zanim ci zniszczą jego bazę. Do przejścia jest 10 różniących się od siebie plansz. Na każdej planszy znajdują się różne przeszkody. Jedne z nich można zniszczyć, przez inne tylko przejechać, z koleji niektóre są niezniszczalne. Przeciwnicy różnią się od siebie. Istnieją 4 rodzaje czołgów przeciwnika. Do tego co jakiś czas podczas rozgrywki pojawiają się bonusy, które po zebraniu ułatwiają grę (dając np. graczowi czasową nieśmiertelność) Wykorzystane Techniki Całość napisana jest z głównym wykorzystaniem dwóch bibliotek: OpenGL do wyświetlania grafiki trójwymiarowej oraz SDL (w tym również SDL img oraz SDL ttf), która służy jako uzupełnienie. W OpenGL napisany jest cały silnik graficzny. SDL udostępnia obsługę klawiatury oraz wczytywanie tekstur. Dodatkowo gra korzysta z OpenAL - biblioteki do obsługi dźwięków audio. Do wyświetlania modeli 3D użyto biblioteki GLM, a do samego ich utworzenia programu Blender Diagram UML Diagram klas aplikacji rozrósł się do dużych rozmiarów, zawiera 30 klas. W następnych podrozdziałach zostaną omówione jego najważniejsze fragmenty i klasy. Sam diagram 26

27 3.2. Diagram UML 27 dostępny jest na płycie dołączonej do pracy w pliku pracainz.jpg Diagram klas Struktura obiektów w grze Uproszczony diagram widoczny jest na rysunku 3.1. Wszystkie obiekty, które są renderowane w grze dziedziczą po jednej klasie - Object. Bezpośrednio po niej dziedziczą dwie klasy. Klasa Tank jest klasą nadrzędną dla wszystkich czołgów oraz pocisków. Cechą tych obiektów jest możliwość poruszania się. Dziedziczą po niej 3 klasy. Pierwsza z nich to Bullet, klasa reprezentująca pocisk, którymy strzelają czołgi. Druga to Pl Tank - czołg sterowany przez gracza. W odróżnieniu od reszty czołgów posiada możliwość zbierania bonusów. Klasa En Tank jest klasą matką dla czołgów przeciwników. Bezpośrednio po niej dziedziczą konkretne rodzaje przeciwników: Strong entank - czołg posiadający szybkie pociski, Panzer entank - czołg posiadający mocniejszy pancerz, Normal entank - zwykły czołg, Fast entank - szybki czołg. Klasa Box reprezentuje wszelkiego rodzaju przeszkody które są renderowane na planszy. Dziedziczą po niej wszystkie rodzaje obiektów, które są statyczne na planszy: Wall - zwykły murek, Jungle - dżungla, przez którą można przejechać i strzelić pociskiem, Item - bonus, który można zebrać, Eagle, orzełek reprezentujący baze, którego trzeba bronić, River - rzeka oraz StoneWall - niezniszczalny mur. Najważniejsze kontenery Na rysunku 3.2 przedstawiono klasy będące kontenerami dla obiektów przedstawionych w fragmencie tekstu powyżej. Podzielono je na trzy grupy w celu ułatwienia zarządzania obiektami oraz wykonywania operacji na nich. Wszystkie czołgi przechowywane są w kontenerze Tanks. Pociski (bullets) przechowywane są w kontenerze Bullets. Pozostałe obiekty statyczne, reprezentowane przez klasę nadrzędną Box, zostały umieszczone w kontenerze Boxes. Obiekty wszystkich trzech wymienionych wcześniej klas znajdują się w jednej klasie - Objects. Klasa ta wykorzystując kontenery obsługuje wszystkie obiekty. Posiada funkcje game(), która wykonuje operacje dotyczące iteracji wszystkich obiektów oraz ich renderowaniem. Za jej pomocą dodaje się obiekty do kontenerów.

28 3.2. Diagram UML 28 Rys Struktura obiektów gry Klasy odpowiedzialne za dźwięk Na rysunku 3.3 przedstawiono klasy odpowiedzialne za implementacje dźwięku. Klasa Listener definiuje odbiorcę dźwięku, obiekt na którego podstawie są obliczane dźwięki dobiegające ze źródeł dźwięku. Klasa Audio jest klasą odpowiedzialną za utworzenie źródeł dźwięku i odtwarzanie ich. Dziedziczą po niej dwie klasy: LoopSound - generująca dźwięk zapętlony oraz SingleSound - generująca pojedynczy dźwięk.

29 3.2. Diagram UML 29 Rys Kontery Opis najważniejszych klas Spośród wielu klas poniżej zostały zaprezentowane najciekawsze i najważniejsze klasy z aplikacji gry. Object Klasa Object (rys. 3.4) jest klasą nadrzędną dla wszystkich obiektów, które są renderowane. Przechowuje ona dane, które służą do wyświetlania ich w przestrzeni i obliczania kolizji. Dzięki niej możliwe są operacje pomiędzy wszystkimi obiektami w grze. Najważniejszymi jej zmiennymi i metodami są: Vector3D position - określa pozycje obiektu w przestrzeni, opisaną za pomocą współrzędnych x, y, z. Oprócz określania pozycji obiektu w przestrzeni, służy również do obliczania pozycji sześcianu kolizyjnego. Vector3D colisionvectormin oraz Vector3D colisionvectormax - Wektory potrzebne do obliczania kolizji, na ich podstawie oraz pozycji obiektu obliczane jest dokładne

30 3.2. Diagram UML 30 Rys Obsługa dźwieku położenie sześcianu kolizyjnego. model - wskaźnik, pod którym przechowywany jest model 3D. Model ten renderuje obiekt. Pobierane są również z niego informacje o wektorach kolizyjnych. kierunek - typ wyliczeniowy mówiący, w którym kierunku obrócony jest obiekt. Obiekt może byż zwrócony w jednym z czterech kierunków: w górę, dół, lewo lub prawo. collision(object ob1) - Funkcja odpowiedzialna za wykrywanie kolizji. Opisana jest szerzej w rozdziale o kolizjach (rozdział 3.10). render() - Funkcja wyświetla obiekt i przeprowadza transformacje na obiektach. W zależności od wektora pozycji ustawia obiekt we właściwym miejscu. Od zmiennej kierunek zależy, w którą stronę obiekt będzie obrócony. D3Model Klasa D3Model (rys. 3.5) służy do przechowywania obiektu trójwymiarowego wczytanego z formatu obj. Pozwala renderować obiekt, oraz może na nim wykonywać operacje takie jak skalowanie lub obracanie. Klasa ta również jest odpowiedzialna za wyszukanie wektorów odpowiedzialnych za utworzenie szcześcianu kolizyjnego. Najważniejszymi jej zmiennymi i metodami są: GLMModel model - Zmienna przechowuje obiekt typu GLMmodel. Jest to obiekt z biblioteki GLM służący do wczytywania, przechowywania i wyświetlania obiektów w

31 3.2. Diagram UML 31 Rys Klasa Object formacie obj. Przechowuje wszystkie informacje potrzebne do renderowania grafiki: wierzchołki, tekstury, materiały, wektory normalne itp. Vector3D min w - Informacje o wektorze przechowującym najmniejsze wartości z obiektu wykorzystywane przy kolizjach do utworzenia sześcianu kolizyjnego. Vector3D max w - Informacje o wektorze przechowującym największe wartości z obiektu wykorzystywane przy kolizjach do utworzenia sześcianu kolizyjnego. void render() - funkcja wyświetlająca obiekt. Jeśli ustawiono odpowiednią opcję, możliwe jest skalowanie i obracanie obiektu. void loadobj() - funkcja wczytująca obiekt z pliku obj. Znajduje również wektory min x i max w.

32 3.2. Diagram UML 32 Rys Model 3D i jego kontener FactoryModel Wszystkie modele przechowywane w klasie opisanej powyżej, przechowywane są w klasie FactoryModel (rys. 3.5) w tablicy statycznej. Klasa ta pełni funkcję kontenera dla obiektów, jest również odpowiedzialna za wyczyszczenia zasobów po zakończeniu pracy programu. Klasa Object pobiera z klasy FactoryModel wskaźnik na obiekt 3D D3Model, oszczędzając przy tym pamięć. Najważniejszymi atrybutami i metodami są: std::vector<d3model*> models - Wektor przechowujący wszystkie obiekty trójwymiarowe w pamięci. void Init() - Funkcja wczytująca wszystkie obiekty dostępne w grze do pamięci. void Finish() - Funkcja ta czyści pamięć usuwając wszystkie obiekty z wektora. D3Model* ModelPointer(unsigned short id) - Funkcja zwracająca wskaźnik na obiekt D3Model. Jako parametr podaje się id obiektu, za pomocą którego obiekt zostanie znaleziony w tablicy. Texture Klasa Texture (rys. 3.6) przechowuje uchwyt na teksturę w pamięci oraz wczytuje ją z pliku. Umożliwia również ustawienie tekstury jako aktywną. Posiada id, przez które

33 3.2. Diagram UML 33 Rys Tekstury możliwe jest odwołanie się do tekstury. Jej najważniejszymi atrybutami i metodami są: GLuint texture - Uchwyt na teksturę, gdy tekstura zostanie wczytana informacja potrzebna do jej wyświetlenia zapisana jest właśnie w tej zmiennej. std::string id - Id struktury, umożliwia odwołonie się do tekstury, gdy ta znajduje się w kontenerze w klasie Textures. settexture() - Funkcja ustawiająca teksturę na aktywną. Po jej wywołaniu, jeżeli przed renderowanymi wierzchołkami znajdują się współrzędne tekstury, to wyświetlona zostanie ta tekstura. loadtexture(const char filename [], bool mipmap) - Funkcja wczytująca teksturę z pliku. Pierwszy parametr określa nazwę pliku, za pomocą drugiego ustala się czy tekstura jest mipmapą 1. Textures Klasa (rys. 3.6) ta przechowuje wszystkie tekstury w pamieci i zarządza nimi. Może dodawać nowe tekstury i usuwać stare, a także ustawiać je jako aktywne. Jej najważniejszymi atrybutami i metodami są: 1 Mipmapy jest to tekstura złożona z wielu mniejszych jednakowych tekstur różniących się od siebie jedynie rozmiarem. Przy nakładaniu tekstur wybiera się dwie tekstury, najlepiej odpowiadające rozmiarowi obiektu. Poprzez interpolacje uzyskuje się teksturę odpowiednich rozmiarów. Proces ten przyspiesza działanie programu kosztem zajętości pamięci.

34 3.2. Diagram UML 34 std::vector<texture*> texture - Kontener przechowujący tekstury w pamięci. Po zakończeniu pracy pracy programu, kontener zostaje opróżniony przez destruktor. void addtexture(texture* text) - Funkcja dodająca obiekt tekstury do pamięci. void settexture(unsigned short id) - Funkcja ustawiająca teksturę o podanym id jako aktywną. unsigned gettextureid(string id) - Za pomocą tej funkcji można sprawdzić na której pozycji znajduje się dana tekstura. load(const char* filename = NULL) - Funkcja wczytująca listę tekstur podanych w pliku. Rys Czcionki CFontBody Klasa (rys. 3.7) przechowująca czcionki. Umożliwia wczytanie ich z pliku.ttf oraz renderowanie. Zawiera w sobie strukturę z biblioteki SDL ttf - TTF Font. Jej najważniejszymi atrybutami i metodami są: std::string fntname - Nazwa czcionki, służy jako id przy wywoływaniu.

35 3.2. Diagram UML 35 TTF Font * fnt - Wskaźnik do obiektu TTF Font potrzebny do renderowania czcionki z pliku.ttf. Za pomocą biblioteki SDL przetwarzany jest potem na teksture SDL Surface, którą przerabia się na teksturę OpenGL. glprint(std::string text) - Globalna funkcja, zaprzyjaźniona z klasą CFontBody. Służy do renderowania tekstów. Wykonuje wszystkie operacje związane z transformacją czcionki na teksturę oraz ustala jej właściwości: rozmiar, wyrównianie itp. Font Klasa (rys. 3.7) przechowująca wszystkie czcionki, oraz ich ustawienia wyświetlania (np. wyrówniane tekstu do lewej, prawej lub wyśrodkowanie). Umożliwia określenie wielkości czcionki, wyrównania oraz zarządzanie nimi. Wszystkie zmienne i metody są statyczne. Jej najważniejszymi atrybutami i metodami są: std::vector<cfontbody *> fntvect - wektor przechowujący obiekty klasy CFont- Body. CFontBody * currfont - wskaźnik na aktywną czcionkę. int maxsize - maksymalny rozmiar czcionki int size - aktualny rozmiar czcionki Align align - tryb wyliczeniowy określający wyrównanie czcionki (możliwe opcje to: do lewej, do prawej i wyśrodkowanie tekstu). bool add(std::string fontname) - Funkcja wczytująca i dodająca do pamięci nową czcionkę. Jako parametr podaje się ścieżkę do czcionki w formacie ttf. bool select(int n) - Ustawienie nowej czcionki jako aktywną. Po wywołuniu tej funkcji ta czcionka która została wybrana, będzie wyświetlana. void setsize(int n) - Ustawienie rozmiaru czcionki - jeżeli rozmiar będzie większy niż podano w zmiennej określającej maksymalny rozmiar, to rozmiar czcionki będzie wynosił tyle co maksymalny. void setalign(const Align & a) - Ustawienie justowania

36 3.2. Diagram UML 36 LightSource Rys Klasa źródła światła Klasa (rys. 3.8) implementująca źródło światła. Posiada dane o świetle oraz pozwala je włączyć. Posiada zabezpieczenia nie pozwalające utworzyć więcej niż 8 obiektów tego typu ze względu na ograniczenia OpenGL-a. Jej najważniejszymi atrybutami i metodami są: float ambient[4] - zmienna przechowująca kolor światła otoczenia float diffuse[4] - zmienna przechowująca kolor światła rozproszenia float specular[4] - zmienna przechowująca kolor światła odbitego float position[4] - zmienna przechowująca pozycję źródła światła float zanik staly - zmienna określająca zanik stały światła float zanik liniowy - zmienna określająca zanik liniowy światła unsigned id - zmienna przechowująca id źródła światła. Id może być z przedziału od 0 do 7. static unsigned count - zmienna przechowuje informacje, ile źródel zostało już utworzonych. Pilnuje by nie utworzono więcej niż ośmiu źródeł (Maksymalna liczba źródeł oświetlenia to 8). setlight() - Ustawia światło włączone. Dodaje wszystkie zmienne do danego źródła światła poprzez funkcje gllight

37 3.2. Diagram UML 37 Camera Rys Klasa kamery Klasa (rys. 3.9) ta ustawia kamerę w pozycji z jakiej będzie obserwowana scena. Posiada kilka zmiennych na podstawie, których zostanie obliczony widok. Jej najważniejszymi atrybutami i metodami są: float position[3] - Pozycja kamery w przestrzeni. float destination[3] - Wektor określający kierunek, w który kamera jest skierowana. float perspective[3] - Perspektywa kamery - wektor ten musi być znormalizowany. Służy do obliczenia widoku obrazu, najczęstsze wartości to: 0.0, 1.0, 0.0. void showcamera() - Za pomocą tej funkcji kamera jest ustawiana. Funkcja ta musi być wywołana za każdym razem na początku głównej pętli programu. Plane Klasa (rys. 3.10) ta tworzy planszę, na której pojawiają się wszystkie obiekty. Może też tworzyć i usuwać obiekty, ponieważ wczytuje dane z pliku na temat aktualnej planszy. Plansza składa się z kwadratowych pól, każde z nich jest renderowane przez 2 trójkąty. Na podstawie rozmiaru planszy oraz wielkości pojedynczego pola generowana jest siatka planszy. Na jej podstawie renderowane są trójkąty, które tworzą płaszczyznę. Jej najważniejszymi atrybutami i metodami są:

38 3.2. Diagram UML 38 Rys Klasa Plane Vector3D** verticles - Macierz wierzchołków - to na jej podstawie renderowane są trójkąty, z których składa się plansza. Obliczana jest na podstawie rozmiarów planszy oraz gęstości rozmieszczenia wierzchołków. int **level - Macierz przechowująca informacje na temat planszy (jakie obiekty mają się pojawić, w którym miejscu itp). unsigned width, height - Rozmiary planszy. float consistency - Zmienna przechowuje rozmary pojedynczego pola, informuje jak gęsto mają być rozmieszczone wierzchołki. Objects *obj - Wskaźnik na obiekt Objects, aby umożliwić operacje na obiektach. loadlevel(unsigned short lvl) - Funkcja wczytująca podany w parametrze poziom. render 1() - Funkcja renderująca planszę. connectobj(objects* ob) - Funkcja przypisująca wskaźnik na obiekt klasy przechowującej wszystkie obiekty. MainClass MainClass jest główną klasa przechowująca najważniejsze obiekty i funkcje programu. Posiada główną pętle gry, która przełącza aplikacje pomiędzy konkretnymi oknami np. menu głównym, ekranem najlepszych wyników lub ekranem gry. Odpowiada za połączenie wszystkich elementów w spójną całość. Jej najważniejszymi atrybutami i metodami są:

39 3.2. Diagram UML 39 Objects obj - Obiekt klasy przechowująca wszystkie obiekty w grze. Przeprowadza wszystkie operacje na obiektach w trakcie rozgrywki, informuje również o stanie rozgrywki. LightSource light - Obiekt typu LightSource odpowiedzialny za oświetlenie. LoopSound loop - Obiekt odpowiedzialny za główny motyw dźwiękowy w grze. bool game() - Glówna funkcja rozgrywki, łączy elementy graficzne i mechaniczne w całość. Renderuje grę oraz wywołuje funkcje odpowiedzialne za poruszanie się obiektów po planszy. bool showmenu()- Glówna funkcja menu. Odpowiada za przełączanie się pomiędzy opcjami. Umożliwia rozpoczęcie nowej rozgrywki, sprawdzenie najlepszych wyników oraz wyjście z gry. void mainloop()- Glówna pętla aplikacji. Przełącza użytkownika pomiędzy różnymi ekranami.

40 4. Implementacja najważniejszych elementów aplikacji W tym rozdziale omówiona została implementacja najważniejszych elementów gry z punktu widzenia grafiki trójwymiarowej. Opisano inicjalizacje bibliotek OpenGL i SDL, utworzenie oraz renderowanie obiektów, wyświetlanie tekstur, ustawienie oświetlenia, wykrywanie kolizji, wczytywanie i wyświetlanie czcionek oraz obsługę klawiatury. Wszystkie te elementy są niezbędne do implementacji każdej aplikacji 3D Inicjalizacja OpenGL i SDL Zanim będzie można korzystać z możliwości jakie dają wyżej wspomniane biblioteki należy je zainicjować.wszystkie opisane niżej funkcje wywołano w globalnych funkcjach SetupOpenGL oraz SetupSDL, które należy wywołać na samym początku programu w funkcji main. W pierwszej kolejności dodawane są pliki nagłówkowe. #include <GL/gl.h>// OpenGL #include <GL/glu.h> // OpenGL Utility Library #include <SDL/SDL.h> // SDL #include <AL/al.h>// OpenAL #include <AL/alc.h>// OpenAL #include <AL/alut.h>// OpenAL Następnie należy wywołać kilka niezbędnych do zainicjowania poszczególnych bilbiotek funkcji. Zostaną one poniżej w kolejnych fragmentach tekstu. 40

41 4.1. Inicjalizacja OpenGL i SDL 41 OpenGL W OpenGL nie ma funkcji typowo przeznaczonych do zainicjalizowania biblioteki. Różne uchwyty na okna, ustawienia rozdzielczości itp znajdują się w bibliotekach wspierających. W przypadku omawianej aplikacji jest nią SDL. Jednak przed rozpoczęciem renderowania grafiki wymagane jest ustawienie kilku rzeczy. Na początku funkcją glviewport ustawiany jest widok na całą rozdzielczość okna. glviewport(0, 0, global_vars::width(), global_vars::height()); Następnie wybierana jest macierz projekcji i ustawiana perspektywa. Pierwsze dwa parametry ustawiają kąt widzenia na pewien obszar. Jako standard przyjęte jest 45 stopni na obszar całego okna. Ostatnie dwa elementy oznaczają minimalną i maksymalną odległość jaką można zobaczyć. glmatrixmode(gl_projection); gluperspective(45, (float)global_vars::width()/global_vars::height(),.1, 100); Teraz należy przełączyć się na macierz modeli. Można ją dodatkowo zresetować: glmatrixmode(gl_modelview); glloadidentify(); Następnie włącza się teksturowanie: glenable(gl_texture_2d); Kolejne trzy polecenia są bardzo ważne z puntku widzenia optymalizacji. Pierwsza funkcja włącza usuwanie niewidocznych dla oka ścian. Przyspiesza to renderowanie. Następnie wybierane jest, które ściany nie będą widoczne - przednie czy tylnie. W przypadku omawianej aplikacji są to tylnie ściany. Ostatnią funkcją glfrontface jest ustawiane, która ściana traktowana jest jako przednia. Istnieją dwie możliwości. Wierzchołki ustawiane są zgodnie z ruchem wskazówek zegara lub w stronę przeciwną. W przypadku tworzonej aplikacji gry jest to strona przeciwna do ruchu wskazówek zegara: glenable(gl_cull_face); glcullface(gl_back); glfrontface(gl_ccw);

42 4.2. Implementacja modelu 3D 42 W następnej kolejności należy włączyć gładkie cieniowanie: glshademodel(gl_smooth); kolor czyszczący ekran w postaci RGBA (w przykładzie ustawiany jest kolor czarny): glclearcolor(0.0f, 0.0f, 0.0f, 0.0f); oraz buffor głębi: glcleardepth(1.0f); SDL W przypadku SDL a będą interesujące tylko dwie funkcje. Wywoływane są w funkcji SetupSDL: SDL_Init(SDL_INIT_VIDEO); SDL_SetVideoMode( global_vars::width(), global_vars::height(), 24, SDL_OPENGL SDL_FULLSCREEN); SDL Init włącza różne moduły biblioteki SDL. Dla utworzonej gry była interesująca tylko ta związana z wyświetlaniem grafiki czyli SDL INIT VIDEO. Druga z funkcji SDL SetVideoMode, jak nazwa wskazuje podaje tryb wyświetlania. Dwa pierwsze parametry ustalają rozdzielczość gry. Trzeci określa liczbę bitów przeznaczonych na wyświetlenia kolorów. Ostatni parametr jest flagą bitowa. W omawianym przykładzie ustawione są dwie flagi mówiące, że SDL będzie wyświetlał elementy OpenGL i, że gra będzie wyświetlana w trybie pełnoekranowym Implementacja modelu 3D Wszystkie modele w grze zaprojektowano korzystając z Blendera i formatu.obj. Sama implementacja struktur przechowujących dane modelu jest dość żmudna i monotonna. Dlatego lepszym rozwiązanie jest użycie gotowej biblioteki GLM [6]. Jest to bibliteka matematyczna, posiada jednak mechanizmy pozwalające na renderowanie modeli obj. Całość ogranicza się do utworzenia obiektu i wczytania do niego za pomocą funkcji glmreadobj wszystkich danych. Potem należy jeszcze wywołać funkcję glmvertexnormals obliczającą wektory normalne dla obiektu:

43 4.3. Implementacja tekstur 43 void D3Model::loadOBJ(const char* filename) { model=glmreadobj(filename); glmvertexnormals(model,180.0,false); //... } Samo renderowanie to zaledwie jedna funkcja - glmdraw. Za pomocą flag można włączać i wyłączać tekstury, wygładzanie obiektu itp. Przed wywołaniem funkcji można umieszczać wszelkie funkcje odpowiedzialne za działania na obiekcie jak gltranslate czy glrotate. glmdraw(model,glm_smooth GLM_TEXTURE); 4.3. Implementacja tekstur Sam w sobie OpenGL nie posiada mechanizmów wczytujących tekstury. Do tego służą inne biblioteki. W tym przypadku jest to również SDL. Standardowe funkcje SDL a pozwalają jedynie na wczytanie bitmap. Do wczytania inny formatów posłużyła funkcja Load image z listingu nr Struktura SDL Surface służy do przechowywania obrazków reprezentujących tekstury. Aby wczytać inny format niż bmp należy użyć funkcji SDL DisplayFormat z biblioteki SDL img. Listing 4.1. Funkcja wczytująca inne formaty tekstur niż bmp 1 2 SDL_Surface * Load_image ( std :: string filename ) 3 { 4 SDL_Surface * loaded_image = NULL ; 5 SDL_Surface * compatible_image = NULL ; 6 if( filename. c_str () == NULL ) { 7 return NULL ; 8 }

44 4.3. Implementacja tekstur 44 9 loaded_image = IMG_Load ( filename. c_str () ); 10 if( loaded_image == NULL ){ 11 return NULL ; 12 } 13 compatible_image = SDL_DisplayFormat ( loaded_image ); 14 SDL_FreeSurface ( loaded_image ); 15 return compatible_image ; 16 } Mając już funkcje Load image można zaimplementować właściwą funkcję, która wczyta teksturę. Została ona zaimplementowa w klasie Texture i nazywa się LoadTexture(). Metoda ta jest wykonywana na początku gry, w momencie kiedy wczytywane są zasoby. Na początku znajduję się deklaracja trzech niezbędnych zmiennych: GLuint texture; // Uchwyt na teksturę SDL_Surface *surface; // Wczytana tekstura GLenum texture_format; // Format kolorów tekstury GLint nofcolors; // Informacja o liczbie kolorów na piksel Następnie wczytuje się teksturę z pliku: surface = Load_image(filename)); Ważną rzeczą o których należy pamiętać o teksturach w OpenGL i SDL jest fakt, że ich rozmiary muszą być potęgami dwójki. Każdy wczytanych obrazek należy zatem sprawdzić czy spełnia warunek: if ( (surface->w & (surface->w - 1))!= 0 ){ printf("warning: image width is not a power of 2\n"); } if ( (surface->h & (surface->h - 1))!= 0 ){ printf("warning: image height is not a power of 2\n"); } Teraz należy określić format kolorów wczytanej tekstury. W kodze poniżej (listing 4.2) sprawdzane jest czy występuje kanał alfa i czy kolory są w kolejności RGB czy BGR:

45 4.3. Implementacja tekstur 45 Listing 4.2. Wybieranie formatu tekstury 1 2 nofcolors = surface - > format - > BytesPerPixel ; 3 if ( nofcolors == 4) 4 { 5 if ( surface -> format -> Rmask == 0 x000000ff ) 6 texture_format = GL_RGBA ; 7 else 8 texture_format = GL_BGRA ; 9 } else if ( nofcolors == 3) 10 { 11 if ( surface -> format -> Rmask == 0 x000000ff ) 12 texture_format = GL_RGB ; 13 else 14 texture_format = GL_BGR ; 15 } Następnie trzeba utworzyć uchwyt na teksturę w OpenGL, ustawić go jako teksturę 2D i wybrać rozciąganie liniowe: glgentextures( 1, &texture ); glbindtexture( GL_TEXTURE_2D, texture ); gltexparameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); gltexparameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); Ostatnim etapem jest przeniesienie wszystkich danych ze struktury SDL owej do tekstury OpenGL-a. Służy do tego funkcja glteximage2d. Pierwszy parametr określa typ tekstury - w tym przypadku jest to tekstura 2D. Drugi parametr określa szczegółowość obrazka, wykorzystywany jest przy mipmapach. Standardowo wpisuje się tu zero. Następnie podaje się liczbę kolorów na piksel i rozmiary tekstury. Kolejny parametr określa ramkę (obramowanie) obrazka. Po tym podaje się format tekstury, typ danych dla pikseli a na samym końcu wskaźnik do danych obrazka. glteximage2d( GL_TEXTURE_2D, 0, nofcolors, surface->w, surface->h, 0,

46 4.4. Implementacja oświetlenia 46 texture_format, GL_UNSIGNED_BYTE, surface->pixels ); Po tych wszystkich zabiegach tekstura jest już gotowa do użycia. Jest ona przechowywana w zmiennej będącej uchwytem - texture. Aby ustawić ją jako teksture aktywną należy użyć funkcji, która była wcześniej wykorzystana - glbindtexture. Teraz przy wyświetlaniu wierzchołków należy podawać współrzędne tekstury np: gltextcoord2f(0.0f,0.0f) ; glvertex3f(1.0f,2.0f,0.0f); 4.4. Implementacja oświetlenia Do implementacji oświetlenia potrzebne są dwa elementy - źródło światła i materiał. Z racji tego, że obiekty renderowane są za pomocą biblioteki GLM, obsługa materiału została już w niej zaimplementowana. Należy więc zaimplementować tylko źródło światła. Na początek należy wywołać, za pomocą globalnej funkcji SetupLight, funkcje inicjalizujące światło: glenable(gl_lighting); glenable(gl_color_material); glcolormaterial(gl_front,gl_ambient_and_diffuse); Funkcja glenable(gl LIGHTING) włącza oświetlenie w OpenGL. Następna funkcja glenable(gl COLOR MATERIAL) włącza materiały. Następnie wywołując kolejną funkcję jaką jest glcolormaterial(gl FRONT, GL AMBIENT AND DIFFUSE) ustawiane są własności materiałów. Pierwszy parametr określa, której części ściany kolor będzie obliczany za pomocą materiału. Drugi określa, które parametry wpływają na kolor materiału. W tym przypadku jest do światło otoczenia i rozproszenia. Wszystkie te funkcje należy wywołać raz przed rozpoczęciem renderowania grafiki 3D. W listingu 4.3, zamieszczonym poniżej, przedstawione zostały zmienne w których przechowywane są dane o oświetleniu: Listing 4.3. Zmienne przechowujące dane o oświetleniu 1 2 float ambient [4] ;

47 4.4. Implementacja oświetlenia 47 3 float diffuse [4] ; 4 float specular [4]; 5 float position [4]; 6 float _zanik_staly ; 7 float _zanik_liniowy ; gdzie: ambient - tablica przechowująca kolor światła otoczenia (linia nr 1), diffuse - tablica przechowująca kolor światła rozproszenia (linia nr 2), specular - tablica przechowująca kolor światła odbitego (linia nr 3), position - tablica przechowująca pozycję źródła światła (linia nr 4), zanik staly - zmienna przechowująca informacje o zaniku stałym światła (linia nr 5), zanik liniowy - zmienna przechowująca informacje o zaniku liniowym światła (linia nr 6). Włączenie światła następuję po wykonaniu funkcji z listingu 4.4. Listing 4.4. Inicjalizacja oświetlenia 1 2 glenable ( GL_LIGHT0 + id ); 3 gllightfv ( GL_LIGHT0 + id, GL_AMBIENT, ambient ) ; 4 gllightfv ( GL_LIGHT0 + id, GL_DIFFUSE, diffuse ) ; 5 gllightfv ( GL_LIGHT0 + id, GL_SPECULAR, specular ) ; 6 gllightfv ( GL_LIGHT0 + id, GL_POSITION, position ) ; 7 gllightf ( GL_LIGHT0 + id, GL_CONSTANT_ATTENUATION, _zanik_staly ); 8 gllightf ( GL_LIGHT0 + id, GL_LINEAR_ATTENUATION, _zanik_liniowy ); Na początku zostaje włączone światło o podanym numerze (linia 1). Dalej za pomocą funkcji gllightfv i gllightf wczytywane są wcześniej wymienione zmienne. Pierwszy parametr tych funkcji określa numer źródła światła, w drugim natomiast podawane są flagi, określające, jakie dane są wczytywane. Trzecim parametrem są wcześniej zdefiniowane zmienne.

48 4.5. Obsługa klawiatury Obsługa klawiatury W opisywanej aplikacji za pomocą klawiatury można przesuwać obiekty w przestrzeni. Obsługą klawiatury zajmuje się biblioteka SDL. Klawiatura jest jednym z kilku urządzeń powodujących zdarzenia, które SDL jest wstanie rozpoznać. Na odczycie tych zdarzeń opiera się cała obsługa klawiatury. Pierwszą rzeczą jaka jest potrzebna to tablica, w której przechowywane będą stany przycisków. Rozmiar 256 jest wystarczający, ponieważ rzadko zdarzają się klawiatury z większą liczbą przycisków. bool keys[256]; Następnie potrzebna jest funkcja, która będzie zmieniała stan tablicy. Jest ona zaimplementowana w sposób następujący: void handlekeys(sdl_keysym* keysym, bool state) { keys[keysym->sym] = state ; } Podawane są 2 parametry. Pierwszym z nich jest klawisz którego stan został zmieniony, a drugi to stan klawisza. Z obiektu struktury SDL Keysym znajdującym się pod wskaźnikiem keysym wyłuskiwana jest wartość typu wyliczeniowego konkretnego klawisza. Kolejna funkcja processevents() (listing 4.5) jest odpowiedzialna za obsługę zdarzeń. W tym przypadku obsługuje zdarzenia związane tylko z klawiaturą. Nic nie stoi jednak na przeszkodzie aby rozszerzyć ją np. o obsługę myszy itp. Na początku tworzy się obiekt struktury przechowującej dane zdarzenia - SDL Event event. Następnie za pomocą funkcji SDL PollEvent pobierane jest do niej zdarzenie, które już się wykonało. W przypadku braku takich zdarzeń pętla while kończy swoje wykonywanie. Następnie za pomocą instrukcji switch sprawdzany jest rodzaj zdarzenia. W tym przypadku oprócz wydarzenia wyjścia (SDL QUIT) z programu występują dwa dotyczące klawiatury: SDL KEYDOWN oraz SDL KEYUP. Tak jak sugerują ich nazwy pierwszy dotyczy sytuacji, kiedy klawisz został wciśnięty, a drugi, kiedy został zwolniony. Wywołuje się wtedy funkcja handlekeys, która przypisuje do tablicy klawiszy stan aktualnie wciśniętego lub zwolnionego przycisku.

49 4.5. Obsługa klawiatury 49 Listing 4.5. Pętla obsługi zdarzeń 1 2 void processevents () 3 { 4 SDL_Event event ; 5 while ( SDL_PollEvent (& event )) { 6 switch ( event. type ) { 7 case SDL_KEYDOWN : handlekeys (& event. key. keysym, true ); 8 break ; 9 case SDL_KEYUP : handlekeys (& event. key. keysym, false ); 10 break ; 11 case SDL_QUIT : endprogram (0); break ; 12 } 13 } 14 } Pozostała jeszcze implementacja funkcji odpowiedzialnych za reakcję na wciśnięcię klawiszy. Poniżej zamieszczono przykładową funkcję keyactions() (listing 4.6) sterującą czołgiem gracza w grze. Najpierw kierunek, w którym gracz do tej pory się poruszał zapisywany jest zmiennej last (linie 3-4). Potem po kolei sprawdzane są klawisze. Kod w każdym z klawiszy strzałek wygląda tak samo, więc rozpatrywany jest tutaj tylko jeden przypadek. Jeżeli klawisz strzałki w prawo został wciśnięty (linia 5), to zmienna odpowiadająca za ruch gracza ustawiona jest na true (linia 7), aktualny kierunek jest zmieniany (linia 8). Potem, jeżeli poprzedni kierunek okaże się inny niż aktualny(nastąpiła zmiana kierunku poruszania się) globalna zmienna changeswaped zostaje ustawiona na true, przez co przeliczone zostaną wektory minimalne i maksymalne. W przypadku klawisza spacji (linia 39) ustawiona zostaje zmienna, której uaktywnienie spowoduje wystrzelenie pocisku przez gracza. Przy naciśnięciu klawisza escape (linia 45) następuje przejście do menu. Listing 4.6. Funkcja obsługująca poruszanie się gracza 1 void keysaction () 2 {

50 4.5. Obsługa klawiatury 50 3 Kierunek last = global_vars :: playerkierunek (); 4 global_vars :: changelastplayerkierunek ( last ); 5 if( keys [ SDLK_RIGHT ]) 6 { 7 global_vars :: changeplayermove ( true ); 8 global_vars :: changeplayerkierunek ( PRAWO ); 9 if( last!= PRAWO ) 10 global_vars :: changeswaped ( true ); } 14 if( keys [ SDLK_LEFT ]) 15 { 16 global_vars :: changeplayermove ( true ); 17 global_vars :: changeplayerkierunek ( LEWO ); 18 if( last!= LEWO ) 19 global_vars :: changeswaped ( true ); } 22 if( keys [ SDLK_UP ]) 23 { 24 global_vars :: changeplayermove ( true ); 25 global_vars :: changeplayerkierunek ( GORA ); 26 if( last!= GORA ) 27 global_vars :: changeswaped ( true ); } 30 if( keys [ SDLK_DOWN ]) 31 { 32 global_vars :: changeplayermove ( true ); 33 global_vars :: changeplayerkierunek ( DOL );

51 4.6. Implementacja czcionek if( last!= DOL ) 35 global_vars :: changeswaped ( true ); } if( keys [ SDLK_SPACE ]) 40 { 41 global_vars :: changeplayershot ( true ) ; 42 } if( keys [ SDLK_ESCAPE ]) 46 { 47 stangry = MENU ; 48 global_vars :: changegamestate ( false ); 49 } } 4.6. Implementacja czcionek Implementacja czcionek wymaga połączenia SDL (a dokładniej jednej z podbibliotek SDL - SDL ttf) z OpenGL. Jest to dosyć skomplikowane. Po wczytaniu czcionki z pliku.ttf należy przerobić ją na teksturę, dopiero po tej czynności można wyświetlić ją za pomocą OpenGL. Tak jak większość modułów, implementacje czcionek należy rozpocząć od inicjalizacji (listing 4.7). Na początku inicjowane są zasoby i sprawdzane jest czy inicjacja nie została już wykonana wcześniej. Należy w następnej kolejności podać maksymalny rozmiar czcionki i jej rozmiar początkowy. Zmienna fntvect jest wektorem przechowującym czcionki. Żeby zoptymalizować aplikację z góry rezerwuje się pamięć potrzebną na przechowanie czcionek. Funkcja atexit wykonuje na zakończenie programu funkcję podaną jako para-

52 4.6. Implementacja czcionek 52 metr. W tym przypadku funkcja TTF Quit wyczyści zasoby związane z czcionkami. Listing 4.7. Inicjalizacja czcionek 1 2 if (! TTF_WasInit () && TTF_Init ()== -1) 3 { 4 std :: cerr << " TTF_Init : " << TTF_GetError () << std :: endl ; 5 return false ; 6 } 7 _maxsize = maxsize ; 8 _size = startingsize ; 9 _fntvect. reserve ( reserve ); 10 atexit ( TTF_Quit ); Po zainicjowaniu można już wczytywać czcionki. Służy do tego funkcja TTF OpenFont. Jako pierwszy parametr podawana jest ścieżka do pliku.ttf, a drugi to maksymalny rozmiar czcionki. _fnt = TTF_OpenFont(fontName.c_str(), Font::_maxSize); Cała implementacja obsługi fontów opakowana jest w dwie klasy. CFontBody przechowującą czcionkę oraz Font będącą klasą zawierającą tylko funkcje statyczne. Druga z wymienionych klas zawiera wektor przechowujący obiekty CFontBody oraz statyczne funkcje odpowiedzialne za ustawienia czcionek. Do wyświetlania napisów służy funkcja globalna glprint(). Jako parametr przyjmuje tekst, który ma zostać wyświetlony. Jak wcześniej było wspomniane aby OpenGL mógł wyświetlić czcionkę musi najpierw ją przerobić na teksturę. Na początek definiowanych jest kilka zmiennych pomocniczych: SDL_Surface * initial; SDL_Surface * intermediary; int w, h; GLuint texture; Zmienne initial i intermediary służą do utworzenia tekstury. Do pierwszej z nich zostanie wczytana czcionka. Druga posłuży do utworzenia pustej tekstury o rozmiarach boków

53 4.6. Implementacja czcionek 53 będących potęgami dwójki (jak wymaga tego OpenGL), na którą zostanie przeniesiona czcionka z pierwszej tekstury. Zmienna texture będzie przechowywała uchwyt na teksturę, a pozostałe dwie zmienne określą wysokość i szerokość. Należy teraz wczytać do struktury initial czcionkę jako strukturę SDL. W tym celu wywołuje się TTF RenderText Blended. Jako pierwszy parametr funkcja ta przyjmuje wcześniej wczytaną czcionkę. Następnie podawany jest tekst jaki ma zostać wyświetlony. Na końcu podaje się kolor, na jakim tle ma zostać wyświetlona struktura. Z racji tego, że wielkości struktury w OpenGL muszą być potęgami dwójki, należy obliczyć ich rozmiar zaokrąglając w górę do najbliższej potęgi dwójki. SDL_Color c = { 255, 255, 255, 255 } ; initial = TTF_RenderText_Blended(Font::_currFont->_fnt, text.c_str(), c); w = NastepnaPotegaZDwoch(initial->w); h = NastepnaPotegaZDwoch(initial->h); Funkcją SDL CreateRGBSurface tworzy się następnie nową strukturę tekstury. Pierwszy parametr określa flagi, które nie są potrzebne w tym momencie. Następne dwa parametry określają szerokość i wysokość tekstury. Następnie podaje się ilość bitów przeznaczonych na kolory oraz maski dla kolorów w kolejności RGBA. Maski mówią, które bity są odpowiedzialne za dany kolor. Po tym funkcją SDL gfxblitrgba łączy się tekstury. Pierwszym parametrem jest źródło a trzecim tekstura docelowa. Pozostałe parametry określają wierzchołki tekstury w przypadku, kiedy konieczne jest kopiowanie jedynie fragmentów struktur. intermediary = SDL_CreateRGBSurface(0, w, h, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000); SDL_gfxBlitRGBA(initial, 0, intermediary, 0); W dalszej kolejności należy wyłączyć testowanie głębi oraz oświetlenie, a także włączyć możliwosć wyświetlania tekstur. gldisable(gl_depth_test); gldisable(gl_lighting); glenable(gl_texture_2d);

54 4.6. Implementacja czcionek 54 Następnie generowane są uchwyty do tekstury. Wywoływane są dokładnie takie same funkcje jak w przypadku standardowych tekstur (Rozdział 3.5) glgentextures(1, &texture); glbindtexture(gl_texture_2d, texture); glteximage2d(gl_texture_2d, 0, 4, w, h, 0, GL_BGRA, GL_UNSIGNED_BYTE, intermediary->pixels); gltexparameteri(gl_texture_2d, GL_TEXTURE_MIN_FILTER, GL_LINEAR); gltexparameteri(gl_texture_2d, GL_TEXTURE_MAG_FILTER, GL_LINEAR); Po tych wszystkich zabiegach można już wyświetlić teksturę z napisem (listing 4.8). Na początku używana jest funkcja glpushmatrix (linia 1), aby rzucić macierz widoku na stos. Przez co transformacje, jakie będą wykonywane na czcionkach, nie będą dotyczyły pozostałych obiektów. Na zakończenie pobiera się starą macierz ze stosu funkcją glpopmatrix (linia 32). Instrukcją switch (linia 3) wybierane w jaki sposób ma wystąpić wyrównanie czcionki: do lewej, prawej lub wyśrodkowanie. Następnie obliczany jest rozmiar czcionki (linie 15-16). Potem następuje wyświetlenie tekstury (18-30). Listing 4.8. Wyświetlenie tekstury 1 glpushmatrix (); 2 switch ( Font :: _align ) 3 { 4 case Left : 5 break ; 6 case Right : 7 gltranslatef (- initial ->w* Font :: _size / Font :: _maxsize, 8 0, 0); 9 break ; 10 case Center : 11 gltranslatef (- initial ->w /2* Font :: _size / Font :: _maxsize, 12 0, 0); 13 break ; 14 }

55 4.7. Implementacja kolizji float scale = ( float ) Font :: _size / ( float ) Font :: _maxsize ; 16 glscalef ( scale, scale, scale ); glbegin ( GL_QUADS ); gltexcoord2f (0.f, 1.f); 21 glvertex2f (0.f, 0.f); gltexcoord2f (1.f, 1.f); 24 glvertex2f (w, 0.f); gltexcoord2f (1.f, 0.f); 27 glvertex2f (w, h); gltexcoord2f (0.f, 0.f); 30 glvertex2f (0.f, h); glend (); 33 glfinish (); 34 glpopmatrix (); 4.7. Implementacja kolizji Implementacja kolizji zaczyna się w momencie wczytywania modelu 3D w klasie D3Model w metodzie loadobj(). Wyszukiwane są wtedy wierzchołki z minimalnymi i maksymalnymi wartościami, które posłużą do utworzenia sześcianu kolizyjnego. Kod przedstawiony jest na listingu 4.9. W pierwszych czterech liniach definiowane są zmienne pomocnicze - trzy tablice trzyelementowe do przechowywania współrzędnych wierzchołka oraz string, którym będą odczytywane dane z pliku. W linii nr 5 następuje otwarcie pliku obj (biblioteka GLM jest napisana w sposób dosyć zawiły, dlatego dostęp do danych jest nieco kłopotliwy, stąd prostszym sposobem jest otworzenie pliku obj i odczytanie z niego infor-

56 4.7. Implementacja kolizji 56 macji o wierzchołkach). Z jego danych zostaną wyszukane ważne dla kolizji wierzchołki. Następnie utworzona jest pętla while (linia 6), będzie się ona wykonywać, dopóki będą odczytywane z pliku informacje na temat wierzchołków obiektu. W momencie, kiedy do zmiennej temp2 zostanie wczytana wartość vt funkcję należy zakończyć, ponieważ oznacza to, że dalej znajdują się informacje na temat współrzędnych tekstur. Algorytm wyszukiwania jest bardzo prosty. Wczytywane są 3 współrzędne wierzchołka (linia 11), a następnie jest sprawdzane czy są one większe w przypadku wartości maksymalnych (linie 12-17) lub mniejsze w przypadku wartości minimalnych (linie 19-24) od zapisanych wcześniej zmiennych. Jeśli warunek zostanie spełniony, nadpisuje się stare dane. Na końcu zapisuje się uzyskane wierzchołki do argumentów kontruktura obiektów klasy Vector3D. Listing 4.9. Wyszukiwanie wierzchołków specjalnych 1 2 float min [3] = { 0.0 f, 0.0 f, 0.0 f }; 3 float max [3] = { 0.0 f, 0.0 f, 0.0 f }; 4 float temp [3]; 5 std :: string temp2 ; 6 std :: ifstream file ( filename ); 7 while ( temp2!= "vt") 8 { 9 file >> temp2 ; 10 if( temp2 == "v") 11 { 12 file >> temp [0] > > temp [1] > > temp [2]; 13 if(max [0] < temp [0]) 14 max [0] = temp [0]; 15 if(max [1] < temp [1]) 16 max [1] = temp [1]; 17 if(max [2] < temp [2]) 18 max [2] = temp [2]; if(min [0] > temp [0])

57 4.7. Implementacja kolizji min [0] = temp [0]; 22 if(min [1] > temp [1]) 23 min [1] = temp [1]; 24 if(min [2] > temp [2]) 25 min [2] = temp [2]; 26 } 27 } 28 min_w = Vector3D ( min ); 29 max_w = Vector3D ( max ); Samo wykrywanie kolizji można zobaczyć w funkcji collision() (listing 4.10 znajdującej się poniżej). Funkcja ta znajduje się w klasie Object, który jest klasą nadrzędną dla każdej klasy obiektu, który można wyświetlić. Pokazano tylko jej część, ponieważ dalej zmiany ograniczają się do wierzchołków, które są sprawdzane. W funkcji zaprezentowano sprawdzanie czy w kolizji uczestniczył wierzchołek o samych minimalnych wartościach (kombinacje pozostałych wierzchołków zostały ukazane w tabeli 4.1). Jaka parametr podaje się drugi obiekt (linia 1), z którym będą porównywane wierzchołki. Funkcja zwraca wartość bool-owską. Jeżeli zwróci true, to znaczy, że wystąpiła kolizja. Na początku należy sprawdzić czy obiekt z którym kolizja jest sprawdzana nie jest tym samym obiektem co obiekt sprawdzający (linie 3-6). Następnie sprawdzany jest warunek kolizji (linie 8-20). Ponieważ, jest to gra 3D, sprawdzane są kolizje na podstawie sześcianu. Należy więc sprawdzić, czy każdy wierzchołek jednego obiektu leży wewnątrz sześcianu drugiego. Jeżeli tak, zwracana jest wartość true (linia 22) oznaczająca kolizje. W przeciwnym wypadku kod wykonuje sie dalej sprawdzając kolejne wierzchołki. Jeżeli nie zostanie wykryta kolizja zwracana jest wartość false (linia 24). Listing Funkcja wykrywająca kolizje 1 2 bool Object :: collision ( Object * ob1 ) 3 { 4 if( this == ob1 ) 5 { 6 return false ;

58 4.8. Implementacja transformacji i renderowania 58 7 } 8 9 if (( float ) colisionvectormin. returnx () 10 >= ( float )ob1 -> colisionvectormin. returnx () && 11 ( float ) colisionvectormin. returnx () 12 <= ( float )ob1 -> colisionvectormax. returnx () && 13 ( float ) colisionvectormin. returnz () 14 >= ( float )ob1 -> colisionvectormin. returnz () && 15 ( float ) colisionvectormin. returnz () 16 <= ( float )ob1 -> colisionvectormax. returnz () && 17 ( float ) colisionvectormin. returny () 18 >= ( float )ob1 -> colisionvectormin. returny () && 19 ( float ) colisionvectormin. returny () 20 <= ( float )ob1 -> colisionvectormax. returny () 21 ) 22 { 23 return true ; 24 } 25 return false ; 26 } 4.8. Implementacja transformacji i renderowania Za wyświetlanie obiektów w omawianej aplikacji odpowiedzialna jest funkcja D3Model::render() przedstawiona na listingu Na początku sprawdzane jest czy obiekt nie jest klasą reprezentującą rzekę (linia 3). Jest to jedyny obiekt, który renderowany jest jako element planszy, a nie model 3D. W następnej kolejności sprawdzane jest czy obiekt należy do klasy Item (linia 5-6). Jeżeli warunek jest spełniony do zostaje wykonana specjalna funkcja obracająca ten obiekt rotateitem() (funkcja jest opisana w listingu 4.12). W linii 7 zostaje wywołana funkcja renderująca obiekt z biblioteki GLM, glmdraw.

59 4.8. Implementacja transformacji i renderowania 59 Tabela 4.1. Konstrukcja wierzchołków sześcianu z wektorów specjalnych Nr X Y Z 1 Min Min Min 2 Min Min Max 3 Min Max Min 4 Min Max Max 5 Max Min Min 6 Max Min Max 7 Max Max Min 8 Max Max Max Listing Renderowanie obiektu 1 void D3Model :: render () 2 { 3 if( numberofrender!= constans :: river ) 4 { 5 if( numberofrender == constans :: item ) 6 rotateitem (); 7 glmdraw ( model, GLM_SMOOTH GLM_TEXTURE ); 8 } 9 } Obiekt Item jako jedyny zostaje wyświetlany w specjalny sposób. Jest ciągle obracany wokół własnej osi, dodatko naprzemiennie rośnie i kurczy się. Odpowiedzialna jest za to funkcja rotateitem() (listing 4.12) Na początku następuje zwiększenie wartości zmiennej angle przechowującej kąt o jaki zostanie obrócony obiek (linia 3). Następnie w zależności od stanu zmiennej grow następuje zwiększenie lub zmniejszenie wartości zmiennej scale, odpowiedzialnej za skalowanie obiektu (linie 4-15). Jeżeli wartość zmiennej scale wyjdzie poza pewien zakres (linie 8 i 14) to następuje zmiana wartości zmiennej grow. W liniach wywoływane są funkcje odpowiedzialne za translacje obiektu: glscalef() oraz glrotatef()

60 4.8. Implementacja transformacji i renderowania 60 Listing Transformacje obiektu Item 1 void D3Model :: rotateitem () 2 { 3 angle += 1. f ; 4 if( grow ) 5 { 6 scale +=0.02 f ; 7 if(scale >1.0 f) 8 grow = false ; 9 } 10 else 11 { 12 scale -=0.02 f ; 13 if(scale <0.7 f) 14 grow = true ; 15 } 16 glrotatef (angle,0.0f,1.0f,0.0 f); 17 glscalef (scale, scale, scale ); 18 } Na listingu 4.13 przedstawiono funkcję Object::render renderującą obiekt i ustawiającą go we właściwym miejscu w przestrzeni. Na początku funkcji (linia 1) należy odłożyć aktualną macierz na stos, aby transformacje dotyczyły jedynie renderowanego obiektu. W linii 2 następuje translacja obiektu za pomocą funkcji gltranslatef. Jako parametry podana jest aktualna pozycja obiektu w przestrzeni. W liniach 4-22 obiekt zostaje obrócony w kierunku jakim się porusza za pomocą funkcji glrotatef(). Po przeprowadzeniu tranformacji, wywoływana jest funkcja renderująca model omówiona na listingu 4.11 (linia 23). Na samym końcu pobierana jest ze stosu odłożona wcześniej macierz (linia 24). Listing Transformacje obiektów 1 glpushmatrix (); 2 gltranslatef ( position. returnx (), position. returny (), 3 position. returnz ());

61 4.9. Główna pętla gry if( kierunek ) 6 { 7 switch ( kierunek ) 8 { 9 case LEWO : 10 glrotatef (270.f,0.0f,1.0f,0.0 f); 11 break ; 12 case PRAWO : 13 glrotatef (90.f,0.0f,1.0f,0.0 f); 14 break ; 15 case GORA : 16 glrotatef (180.f,0.0f,1.0f,0.0 f); 17 break ; 18 case DOL : 19 break ; 20 case BRAK : 21 break ; 22 } 23 } 24 model -> render (); 25 glpopmatrix (); 4.9. Główna pętla gry W powyższych rozdziałach przedstawiono implementacje pojedynczych elementów OpenGL i SDL. Na poniższym listingu 4.14 znajduję sie główne pętla gry. Jest ona realizowana w metodzie mainloop klasy MainClass. Funkcja zaczyna się od sprawdzenia, czy należy wczytać nową planszę (linia 3). Jeśli tak, to obiekt reprezentujący planszę znajdujący się pod wskaźnikiem plane (linia 5) wczytuje nowy poziom. Wartość zmiennej globalnej mówiącej o zmianie poziomu usta-

62 4.9. Główna pętla gry 62 wiana jest na fałsz (linia 6). Następnie zmienna gamestate ustawiana jest na wartość true. Pętla while będzie się wykonywała dopóki stan gry nie zmieni wartośći na false. Funkcja waitframe (linia 13) odpowiedzialna jest za jednakową prędkość gry na wszystkich komputerach. Jeśli zostanie wyświetlona większa liczba klatek w ciągu sekundy niż jest to podane w parametrze, wyświetlanie kolejnych klatek zostaje wstrzymane. Następne dwie funkcje: processevents() oraz keyaction() (linie 14, 15) odpowiadają za obsługę klawiatury. Funkcja glclear(gl DEPTH BUFFER BIT GL COLOR BUFFER BIT) (linia 16) czyści bufory kolorów oraz głębi. Następnie funkcja glloadidentity (linia 17) resetuje macierz modeli. Bez tego niemożliwe byłoby wyświetlanie obiektów na poprawnych pozycjach. W następnej linii (linia 18) ustawiana jest pozycja kamery, a zaraz po niej renderowana jest plansza. W linii 22 wywoływana jest jako parametr funkcji changegamestate metoda z obiektu Objects - game, która porusza wszystkimi obiektami w grze,sprawdza kolizje itp. Jeżeli zwróci ona wartość false gra zostaje przerwana. Może się tak stać, jeśli ilość żyć gracza spadnie do zera lub jeśli zniszczona zostanie główna baza. Również, kiedy plansza zostaje ukończona przez gracza, następuje wyjście z pętli, aby wczytać nowy poziom. Następna metoda statyczna klasy Message (linia 24) wyświetla komunikaty dotyczący gry, np. jeżeli gracz zbierze bonus wyświetlana jest informacja co ten bonus daje. Następna część kodu (linie 25-32) odpowiada za wyświetlanie komunikatu o końcu gry, jeżeli gracz przegrał. Funkcja SDL GL SwapBuffers aktualizuje ekran. Po wyjściu z pętli sprawdzane jest ile żyć ma gracz (linia 36), jeśli zero to następuje przeście do menu głównego. Kolejna część kodu (linia 38-52) sprawdza czy gracz ukończył planszę (zniszczył wszystkich przeciwników). Jeśli gracz spełnił ten to warunek to sprawdzane jest czy należy wczytać planszę, czy ostatnio ukończona plansza była ostatnią i następuje powrót do menu. Listing Główna pętla gry 1 bool MainClass :: game () 2 { 3 if( global_vars :: loadnextlevel ()) 4 { 5 plane -> loadlevel ( global_vars :: level ()); 6 global_vars :: changeloadlevel ( false ) ;

63 4.9. Główna pętla gry 63 7 } 8 9 global_vars :: changegamestate ( true ) ; 10 while ( global_vars :: gamestate ()) 11 { waitframe ( global_vars :: frames ()); 14 processevents (); 15 keysaction (); 16 glclear ( GL_DEPTH_BUFFER_BIT GL_COLOR_BUFFER_BIT ); 17 glloadidentity (); 18 cam. showcamera (); 19 plane -> render_1 (); if( global_vars :: gamestate ()) 22 global_vars :: changegamestate ( obj. game ()); Message :: showall (); 25 if( global_vars :: gameover ()) 26 { 27 if( Message :: showgameover ()) 28 { 29 stangry = MENU ; 30 global_vars :: changegamestate ( false ) ; 31 } 32 } 33 SDL_GL_SwapBuffers (); 34 } if( global_vars :: playerlives () == 0) 37 stangry = MENU ;

64 4.10. Efekt końcowy if( global_vars :: enemycounter () == 0) 39 { 40 if( global_vars :: level () <= global_vars :: maxlevel ()) 41 { 42 global_vars :: nextlevel (); 43 global_vars :: changegamestate ( true ) ; 44 global_vars :: changeloadnextlevel ( true ) ; 45 } 46 else 47 { 48 global_vars :: changegamestate ( true ) ; 49 global_vars :: changeloadnextlevel ( false ) ; 50 stangry = MENU ; 51 } 52 } return true ; 55 } Efekt końcowy W podrozdziale tym przedstawiono efekt końcowy jakim jest aplikacja Batlle City INZ. Poniżej prezentowane są zrzuty ekranu z gry. Na rys. 4.1 przedstawiono menu główne gry. Można wybrać jedną spośród trzech opcji: nową gre, highscore czyli najlepsze wyniki oraz wyjście z gry. Po wybraniu pierwszej opcji rozpoczyna się rozgrywka. Wybranie opcji highscore spowoduje wyświetlenie wyników graczy, którzy zdobyli największą liczbę puntków. Rys. 4.2 przedstawia ekran z najlepszymi wynikami. Wyświetlane jest pięć najlepszych wyników oraz nazwy graczy, którzy je uzyskali. Na rys. 4.3 przedstawiono zrzut ekranu z rozgrywki. Widoczna jest na nim plansza gry. Widać na niej rózne rodzaje murków oraz czołgi, które poruszają się po planszy. U góry znajduję się panel informacyjny, wyświetlający dane z gry np. ilość punktów gracza lub numer aktualnego

65 4.10. Efekt końcowy 65 Rys Menu główne poziomu. Rys. 4.4 ukazuje zakończenie gry, kiedy gracz przegra. Wyświetlana jest wtedy informacja o liczbie punktów uzyskanych przez gracza.

66 4.10. Efekt końcowy 66 Rys Najlepsze wyniki

67 4.10. Efekt końcowy 67 Rys Rozgrywka Rys Koniec Gry

6 Przygotował: mgr inż. Maciej Lasota

6 Przygotował: mgr inż. Maciej Lasota Laboratorium nr 6 1/7 Grafika Komputerowa 3D Instrukcja laboratoryjna Temat: Materiały i oświetlenie 6 Przygotował: mgr inż. Maciej Lasota 1) Wprowadzenie Specyfikacja biblioteki OpenGL rozróżnia trzy

Bardziej szczegółowo

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

Światła i rodzaje świateł. Dorota Smorawa Światła i rodzaje świateł Dorota Smorawa Rodzaje świateł Biblioteka OpenGL posiada trzy podstawowe rodzaje świateł: światło otoczenia, światło rozproszone oraz światło odbite. Dodając oświetlenie na scenie

Bardziej szczegółowo

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

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1 Podstawy programowania, Poniedziałek 30.05.2016, 8-10 Projekt, część 1 1. Zadanie Projekt polega na stworzeniu logicznej gry komputerowej działającej w trybie tekstowym o nazwie Minefield. 2. Cele Celem

Bardziej szczegółowo

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Systemy wirtualnej rzeczywistości. Komponenty i serwisy Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Systemy wirtualnej rzeczywistości Laboratorium Komponenty i serwisy Wstęp: W trzeciej części przedstawione zostaną podstawowe techniki

Bardziej szczegółowo

OpenGL Światło (cieniowanie)

OpenGL Światło (cieniowanie) OpenGL Światło (cieniowanie) 1. Oświetlenie włączanie/wyłączanie glenable(gl_lighting); - włączenie mechanizmu oświetlenia gldisable(gl_lighting); - wyłączenie mechanizmu oświetlenia glenable(gl_light0);

Bardziej szczegółowo

OpenGL oświetlenie. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydziału Elektroniki Politechnika Wrocławska

OpenGL oświetlenie. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydziału Elektroniki Politechnika Wrocławska OpenGL oświetlenie Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Katedra Cybernetyki i Robotyki Wydziału Elektroniki Politechnika Wrocławska Kurs: Copyright c 2017 Bogdan Kreczmer Niniejszy dokument zawiera

Bardziej szczegółowo

2 Przygotował: mgr inż. Maciej Lasota

2 Przygotował: mgr inż. Maciej Lasota Laboratorium nr 2 1/6 Grafika Komputerowa 3D Instrukcja laboratoryjna Temat: Manipulowanie przestrzenią 2 Przygotował: mgr inż. Maciej Lasota 1) Manipulowanie przestrzenią Istnieją dwa typy układów współrzędnych:

Bardziej szczegółowo

Przekształcenia geometryczne. Dorota Smorawa

Przekształcenia geometryczne. Dorota Smorawa Przekształcenia geometryczne Dorota Smorawa Przekształcenia geometryczne Na poprzednich laboratoriach już dowiedzieliśmy się, na czym polegają podstawowe przekształcenia geometryczne. Trzy podstawowe przekształcenia

Bardziej szczegółowo

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

GLKit. Wykład 10. Programowanie aplikacji mobilnych na urządzenia Apple (IOS i ObjectiveC) #import Fraction.h #import <stdio.h> #import "Fraction.h" #import @implementation Fraction -(Fraction*) initwithnumerator: (int) n denominator: (int) d { self = [super init]; } if ( self ) { [self setnumerator: n anddenominator:

Bardziej szczegółowo

Dodawanie grafiki i obiektów

Dodawanie grafiki i obiektów Dodawanie grafiki i obiektów Word nie jest edytorem obiektów graficznych, ale oferuje kilka opcji, dzięki którym można dokonywać niewielkich zmian w rysunku. W Wordzie możesz zmieniać rozmiar obiektu graficznego,

Bardziej szczegółowo

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

Zadanie 1. Ściana. 1. Potrzebne zmienne w dołączonym do zadania kodzie źródłowym Zadanie 1. Ściana Zadanie W pliku walls.cpp znajduje się funkcja void draw_back_wall(). Należy uzupełnić ją, ustawiając odpowiednio parametry teksturowania tak, aby na ścianę, która w pierwotnej wersji

Bardziej szczegółowo

Rysunek 1: Okno timeline wykorzystywane do tworzenia animacji.

Rysunek 1: Okno timeline wykorzystywane do tworzenia animacji. Ćwiczenie 5 - Tworzenie animacji Podczas tworzenia prostej animacji wykorzystywać będziemy okno Timeline domyślnie ustawione na dole okna Blendera (Rys. 1). Proces tworzenia animacji polega na stworzeniu

Bardziej szczegółowo

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

Ćwiczenie 4 - Podstawy materiałów i tekstur. Renderowanie obrazu i animacji Ćwiczenie 4 - Podstawy materiałów i tekstur. Renderowanie obrazu i animacji Materiał jest zbiorem informacji o właściwościach powierzchni. Składa się na niego kolor, sposób odbijania światła i sposób nakładania

Bardziej szczegółowo

Wykład 4. Rendering (1) Informacje podstawowe

Wykład 4. Rendering (1) Informacje podstawowe Wykład 4. Rendering (1) Informacje podstawowe Z punktu widzenia dzisiejszego programowania gier: Direct3D jest najczęściej wykorzystywanym przez profesjonalnych deweloperów gier API graficznym na platformie

Bardziej szczegółowo

Wprowadzenie do QT OpenGL

Wprowadzenie do QT OpenGL Wprowadzenie do QT mgr inż. Michał Chwesiuk mgr inż. Tomasz Sergej inż. Patryk Piotrowski 1/21 - Open Graphics Library Open Graphics Library API pozwalające na wykorzystanie akceleracji sprzętowej do renderowania

Bardziej szczegółowo

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

Gry Komputerowe Laboratorium 4. Teksturowanie Kolizje obiektów z otoczeniem. mgr inż. Michał Chwesiuk 1/29. Szczecin, r 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

Bardziej szczegółowo

Spis treści. 1 Moduł Mapy 2

Spis treści. 1 Moduł Mapy 2 Spis treści 1 Moduł Mapy 2 1.1 Elementy planu............................. 2 1.1.1 Interfejs widoku......................... 3 1.1.1.1 Panel sterujacy.................... 3 1.1.1.2 Suwak regulujacy przybliżenie...........

Bardziej szczegółowo

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

Ustawienia materiałów i tekstur w programie KD Max. MTPARTNER S.C. Ustawienia materiałów i tekstur w programie KD Max. 1. Dwa tryby własności materiału Materiał możemy ustawić w dwóch trybach: czysty kolor tekstura 2 2. Podstawowe parametry materiału 2.1 Większość właściwości

Bardziej szczegółowo

OpenGL Światło (cieniowanie)

OpenGL Światło (cieniowanie) OpenGL Światło (cieniowanie) 1. Oświetlenie włączanie/wyłączanie glenable(gl_lighting); - włączenie mechanizmu oświetlenia gldisable(gl_lighting); - wyłączenie mechanizmu oświetlenia glenable(gl_light0);

Bardziej szczegółowo

Tworzenie prezentacji w MS PowerPoint

Tworzenie prezentacji w MS PowerPoint Tworzenie prezentacji w MS PowerPoint Program PowerPoint dostarczany jest w pakiecie Office i daje nam możliwość stworzenia prezentacji oraz uatrakcyjnienia materiału, który chcemy przedstawić. Prezentacje

Bardziej szczegółowo

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

Symulacja samochodu z kamerą stereowizyjną. Krzysztof Sykuła 15 czerwca 2007 Symulacja samochodu z kamerą stereowizyjną Krzysztof Sykuła 15 czerwca 2007 1 1 Opis wykonanego projektu Symulacja samochodu z kamerą stereowizyjną była pretekstem do napisania Engine u 3D, wykorzystującego

Bardziej szczegółowo

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

Grafika Komputerowa Wykład 6. Teksturowanie. mgr inż. Michał Chwesiuk 1/23 Wykład 6 mgr inż. 1/23 jest to technika w grafice komputerowej, której celem jest zwiększenie szczegółowości renderowanych powierzchni za pomocą tekstur. jest to pewna funkcja (najczęściej w formie bitmapy)

Bardziej szczegółowo

1. Opis okna podstawowego programu TPrezenter.

1. Opis okna podstawowego programu TPrezenter. OPIS PROGRAMU TPREZENTER. Program TPrezenter przeznaczony jest do pełnej graficznej prezentacji danych bieżących lub archiwalnych dla systemów serii AL154. Umożliwia wygodną i dokładną analizę na monitorze

Bardziej szczegółowo

POMOC / INSTRUKCJA OBSŁUGI

POMOC / INSTRUKCJA OBSŁUGI POMOC / INSTRUKCJA OBSŁUGI 1. Powiększanie mapy 2. Plakat 3. Schemat lekcji 4. Broszura informacyjna 5. Instrukcja obsługi Pasek narzędzi i menu wyboru Zmiana skali mapy Mini mapa - podgląd na położenie

Bardziej szczegółowo

Światło. W OpenGL można rozróżnić 3 rodzaje światła

Światło. W OpenGL można rozróżnić 3 rodzaje światła Wizualizacja 3D Światło W OpenGL można rozróżnić 3 rodzaje światła Światło otaczające (ambient light) równomiernie oświetla wszystkie elementy sceny, nie pochodzi z żadnego konkretnego kierunku Światło

Bardziej szczegółowo

REFERAT PRACY DYPLOMOWEJ Temat pracy: SUDOKU - Algorytmy tworzenia i rozwiązywania

REFERAT PRACY DYPLOMOWEJ Temat pracy: SUDOKU - Algorytmy tworzenia i rozwiązywania REFERAT PRACY DYPLOMOWEJ Temat pracy: SUDOKU - Algorytmy tworzenia i rozwiązywania Autor: Anna Nowak Promotor: dr inż. Jan Kowalski Kategorie: gra logiczna Słowa kluczowe: Sudoku, generowanie plansz, algorytmy,

Bardziej szczegółowo

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych

Bardziej szczegółowo

IRONCAD. TriBall IRONCAD Narzędzie pozycjonujące

IRONCAD. TriBall IRONCAD Narzędzie pozycjonujące IRONCAD IRONCAD 2016 TriBall o Narzędzie pozycjonujące Spis treści 1. Narzędzie TriBall... 2 2. Aktywacja narzędzia TriBall... 2 3. Specyfika narzędzia TriBall... 4 3.1 Kula centralna... 4 3.2 Kule wewnętrzne...

Bardziej szczegółowo

Temat: Transformacje 3D

Temat: Transformacje 3D Instrukcja laboratoryjna 11 Grafika komputerowa 3D Temat: Transformacje 3D Przygotował: dr inż. Grzegorz Łukawski, mgr inż. Maciej Lasota, mgr inż. Tomasz Michno 1 Wstęp teoretyczny Bardzo często programując

Bardziej szczegółowo

Oświetlenie obiektów 3D

Oświetlenie obiektów 3D Synteza i obróbka obrazu Oświetlenie obiektów 3D Opracowanie: dr inż. Grzegorz Szwoch Politechnika Gdańska Katedra Systemów Multimedialnych Rasteryzacja Spłaszczony po rzutowaniu obraz siatek wielokątowych

Bardziej szczegółowo

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

Aleksandra Zając. Raport. Blender. Pokemon: Eevee Aleksandra Zając Raport Blender Pokemon: Eevee 1. Modelowanie Przed rozpoczęciem modelowania do Blendera załadowałam obraz przedstawiający wybranego pokemona, aby podczas modelowania jak najlepiej odwzorować

Bardziej szczegółowo

D O K U M E N T A C J A

D O K U M E N T A C J A Państwowa Wyższa Szkoła Zawodowa w Tarnowie Instytut Politechniczny Informatyka Stosowana III r. D O K U M E N T A C J A Snake 3D Piotr Gębiś Paweł Gładysz Dokumentacja do projektu Snake 3D. W dokumencie

Bardziej szczegółowo

1. Umieść kursor w miejscu, w którym ma być wprowadzony ozdobny napis. 2. Na karcie Wstawianie w grupie Tekst kliknij przycisk WordArt.

1. Umieść kursor w miejscu, w którym ma być wprowadzony ozdobny napis. 2. Na karcie Wstawianie w grupie Tekst kliknij przycisk WordArt. Grafika w dokumencie Wprowadzanie ozdobnych napisów WordArt Do tworzenia efektownych, ozdobnych napisów służy obiekt WordArt. Aby wstawić do dokumentu obiekt WordArt: 1. Umieść kursor w miejscu, w którym

Bardziej szczegółowo

SPOSOBY POMIARU KĄTÓW W PROGRAMIE AutoCAD

SPOSOBY POMIARU KĄTÓW W PROGRAMIE AutoCAD Dr inż. Jacek WARCHULSKI Dr inż. Marcin WARCHULSKI Mgr inż. Witold BUŻANTOWICZ Wojskowa Akademia Techniczna SPOSOBY POMIARU KĄTÓW W PROGRAMIE AutoCAD Streszczenie: W referacie przedstawiono możliwości

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Programowanie obiektowe Laboratorium 1. Wstęp do programowania w języku Java. Narzędzia 1. Aby móc tworzyć programy w języku Java, potrzebny jest zestaw narzędzi Java Development Kit, który można ściągnąć

Bardziej szczegółowo

Materiały. Dorota Smorawa

Materiały. Dorota Smorawa Materiały Dorota Smorawa Materiały Materiały, podobnie jak światła, opisywane są za pomocą trzech składowych. Opisują zdolności refleksyjno-emisyjne danej powierzchni. Do tworzenia materiału służy funkcja:

Bardziej szczegółowo

Projektowanie graficzne. Wykład 2. Open Office Draw

Projektowanie graficzne. Wykład 2. Open Office Draw Projektowanie graficzne Wykład 2 Open Office Draw Opis programu OpenOffice Draw OpenOffice Draw umożliwia tworzenie prostych oraz złożonych rysunków. Posiada możliwość eksportowania rysunków do wielu różnych

Bardziej szczegółowo

Program V-SIM tworzenie plików video z przebiegu symulacji

Program V-SIM tworzenie plików video z przebiegu symulacji Program V-SIM tworzenie plików video z przebiegu symulacji 1. Wprowadzenie Coraz częściej zdarza się, że zleceniodawca opinii prosi o dołączenie do opracowania pliku/ów Video z zarejestrowanym przebiegiem

Bardziej szczegółowo

Jak przygotować pliki gotowe do publikacji w sieci za pomocą DigitLabu?

Jak przygotować pliki gotowe do publikacji w sieci za pomocą DigitLabu? Jak przygotować pliki gotowe do publikacji w sieci za pomocą DigitLabu? Po zainstalowaniu DigitLabu na komputerze otrzymujemy pakiet programów niezbędnych do przygotowania cyfrowych wersji obiektów tekstowych.

Bardziej szczegółowo

Zastosowania Robotów Mobilnych

Zastosowania Robotów Mobilnych Zastosowania Robotów Mobilnych Temat: Zapoznanie ze środowiskiem Microsoft Robotics Developer Studio na przykładzie prostych problemów nawigacji. 1) Wstęp: Microsoft Robotics Developer Studio jest popularnym

Bardziej szczegółowo

Opis funkcji modułu Konwerter 3D

Opis funkcji modułu Konwerter 3D Opis funkcji modułu Konwerter 3D www.cadprojekt.com.pl Kliknij na tytuł rozdziału, aby przejść do wybranego zagadnienia MODUŁ KONWERTER 3D...3 Wygląd i funkcje okna modułu Konwerter 3D...3 Konwertowanie

Bardziej szczegółowo

4. Oprogramowanie OCR do rozpoznawania znaków 39

4. Oprogramowanie OCR do rozpoznawania znaków 39 Spis treêci Wstęp 9 1. Podstawowe pojęcia dotyczące tekstu 13 1.1. Wprowadzenie 13 1.2. Pismo 14 1.2.1. Podstawowe pojęcia 14 1.2.2. Grupy krojów pisma 14 1.2.3. Krój pisma 15 1.2.4. Rodzina kroju pisma

Bardziej szczegółowo

Plan wykładu. Akcelerator 3D Potok graficzny

Plan wykładu. Akcelerator 3D Potok graficzny Plan wykładu Akcelerator 3D Potok graficzny Akcelerator 3D W 1996 r. opracowana została specjalna karta rozszerzeń o nazwie marketingowej Voodoo, którą z racji wspomagania procesu generowania grafiki 3D

Bardziej szczegółowo

6.4. Efekty specjalne

6.4. Efekty specjalne 6.4. Efekty specjalne W programie MS PowerPoint 2010 znajdziemy coś takiego jak efekty specjalne. Służą one po to by prezentacja nie stała się monotonna i zachęcała widzów do uwagi poprzez zastosowane

Bardziej szczegółowo

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

SpriteKit. Biblioteka do tworzenia gier wbudowana w SDK. Wspiera grafikę 2D w oparciu o sprite y SpriteKit SpriteKit Biblioteka do tworzenia gier wbudowana w SDK Wspiera grafikę 2D w oparciu o sprite y SpriteKit HelloWorld SpriteKit HelloWorld SpriteKit AppDelegate identyczny jak w innych szablonach

Bardziej szczegółowo

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

Gry Komputerowe Laboratorium 1. Zajęcia organizacyjne Animacja z uwzględnieniem czasu. mgr inż. Michał Chwesiuk 1/22. Szczecin, Gry Komputerowe Laboratorium 1 Zajęcia organizacyjne mgr inż. Michał Chwesiuk 1/22 projektowych Zajęcia projektowe składają się zajęć (plus jedno zajęcie godzinne). Zajęcia polegają na programowania grafiki

Bardziej szczegółowo

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

INSTRUKCJA UŻYTKOWNIKA. Spis treści. I. Wprowadzenie... 2. II. Tworzenie nowej karty pracy... 3. a. Obiekty... 4. b. Nauka pisania... INSTRUKCJA UŻYTKOWNIKA Spis treści I. Wprowadzenie... 2 II. Tworzenie nowej karty pracy... 3 a. Obiekty... 4 b. Nauka pisania... 5 c. Piktogramy komunikacyjne... 5 d. Warstwy... 5 e. Zapis... 6 III. Galeria...

Bardziej szczegółowo

4. Podstawowa konfiguracja

4. Podstawowa konfiguracja 4. Podstawowa konfiguracja Po pierwszym zalogowaniu się do urządzenia należy zweryfikować poprawność licencji. Można to zrobić na jednym z widżetów panelu kontrolnego. Wstępną konfigurację można podzielić

Bardziej szczegółowo

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem. WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM NetBeans Wykonał: Jacek Ventzke informatyka sem. VI 1. Uruchamiamy program NetBeans (tu wersja 6.8 ) 2. Tworzymy

Bardziej szczegółowo

Oświetlenie w OpenGL. Oprogramowanie i wykorzystanie stacji roboczych. Wykład 8. Światło otaczajace. Światło rozproszone.

Oświetlenie w OpenGL. Oprogramowanie i wykorzystanie stacji roboczych. Wykład 8. Światło otaczajace. Światło rozproszone. Oświetlenie w OpenGL Oprogramowanie i wykorzystanie stacji roboczych Wykład 8 Dr inż. Tomasz Olas olas@icis.pcz.pl W OpenGL źródło światła w scenie składa się z trzech składowych oświetlenia: otoczenia,

Bardziej szczegółowo

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

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 3 Podstawy programowania, Poniedziałek 13.05.2015, 8-10 Projekt, część 3 1. Zadanie Projekt polega na stworzeniu logicznej gry komputerowej działającej w trybie tekstowym o nazwie Minefield. 2. Cele Celem

Bardziej szczegółowo

Wykład 8: klasy cz. 4

Wykład 8: klasy cz. 4 Programowanie obiektowe Wykład 8: klasy cz. 4 Dynamiczne tworzenie obiektów klas Składniki statyczne klas Konstruktor i destruktory c.d. 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD

Bardziej szczegółowo

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych. Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych. 1. Przygotowanie środowiska programistycznego. Zajęcia będą

Bardziej szczegółowo

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

Animowana grafika 3D. Opracowanie: J. Kęsik. Animowana grafika 3D Opracowanie: J. Kęsik kesik@cs.pollub.pl Powierzchnia obiektu 3D jest renderowana jako czarna jeżeli nie jest oświetlana żadnym światłem (wyjątkiem są obiekty samoświecące) Oświetlenie

Bardziej szczegółowo

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

Wprowadzenie do rysowania w 3D. Praca w środowisku 3D Wprowadzenie do rysowania w 3D 13 Praca w środowisku 3D Pierwszym krokiem niezbędnym do rozpoczęcia pracy w środowisku 3D programu AutoCad 2010 jest wybór odpowiedniego obszaru roboczego. Można tego dokonać

Bardziej szczegółowo

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

Adobe InDesign lab.1 Jacek Wiślicki, Paweł Kośla. Spis treści: 1 Podstawy pracy z aplikacją Układ strony... 2. Spis treści: 1 Podstawy pracy z aplikacją... 2 1.1 Układ strony... 2 strona 1 z 7 1 Podstawy pracy z aplikacją InDesign jest następcą starzejącego się PageMakera. Pod wieloma względami jest do niego bardzo

Bardziej szczegółowo

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

I. Spis treści I. Spis treści... 2 II. Kreator szablonów... 3 1. Tworzenie szablonu... 3 2. Menu... 4 a. Opis ikon... 5 3. Dodanie nowego elementu... Kreator szablonów I. Spis treści I. Spis treści... 2 II. Kreator szablonów... 3 1. Tworzenie szablonu... 3 2. Menu... 4 a. Opis ikon... 5 3. Dodanie nowego elementu... 7 a. Grafika... 7 b. Tekst... 7 c.

Bardziej szczegółowo

5.4. Tworzymy formularze

5.4. Tworzymy formularze 5.4. Tworzymy formularze Zastosowanie formularzy Formularz to obiekt bazy danych, który daje możliwość tworzenia i modyfikacji danych w tabeli lub kwerendzie. Jego wielką zaletą jest umiejętność zautomatyzowania

Bardziej szczegółowo

Komputery I (2) Panel sterowania:

Komputery I (2) Panel sterowania: Komputery I (2) Paweł Jamer Panel sterowania: Podstawowym miejscem z którego zarządzamy ustawieniami systemu Windows jest panel sterowania. Znaleźć tam możemy wszelkiego rodzaju narzędzia umożliwiające

Bardziej szczegółowo

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

Grafika Komputerowa Wykład 5. Potok Renderowania Oświetlenie. mgr inż. Michał Chwesiuk 1/38 Wykład 5 Potok Renderowania Oświetlenie mgr inż. 1/38 Podejście śledzenia promieni (ang. ray tracing) stosuje się w grafice realistycznej. Śledzone są promienie przechodzące przez piksele obrazu wynikowego

Bardziej szczegółowo

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

OpenGL : Oświetlenie. mgr inż. Michał Chwesiuk mgr inż. Tomasz Sergej inż. Patryk Piotrowski. Szczecin, r 1/23 OpenGL : mgr inż. Michał Chwesiuk mgr inż. Tomasz Sergej inż. Patryk Piotrowski 1/23 Folder z plikami zewnętrznymi (resources) Po odpaleniu przykładowego projektu, nie uruchomi się on poprawnie. Powodem

Bardziej szczegółowo

Studia Podyplomowe Grafika Komputerowa i Techniki Multimedialne, 2017, semestr II Modelowanie 3D - Podstawy druku 3D. Ćwiczenie nr 4.

Studia Podyplomowe Grafika Komputerowa i Techniki Multimedialne, 2017, semestr II Modelowanie 3D - Podstawy druku 3D. Ćwiczenie nr 4. Ćwiczenie nr 4 Metaobiekty 1 Materiały ćwiczeniowe Wszelkie materiały ćwiczeniowe: wykłady, instrukcje oraz ewentualne pliki ćwiczeniowe dla potrzeb realizacji materiału dydaktycznego z przedmiotu Modelowanie

Bardziej szczegółowo

GRAFIKA CZASU RZECZYWISTEGO Wprowadzenie do OpenGL

GRAFIKA CZASU RZECZYWISTEGO Wprowadzenie do OpenGL GRAFIKA CZASU RZECZYWISTEGO Wprowadzenie do OpenGL Grafika komputerowa i wizualizacja, Bioinformatyka S1, II Rok OpenGL Open Graphics Library Jest to API pozwalające na renderowanie grafiki w czasie rzeczywistym,

Bardziej szczegółowo

Expo Composer. www.doittechnology.pl 1. Garncarska 5 70-377 Szczecin tel.: +48 91 404 09 24 e-mail: info@doittechnology.pl. Dokumentacja użytkownika

Expo Composer. www.doittechnology.pl 1. Garncarska 5 70-377 Szczecin tel.: +48 91 404 09 24 e-mail: info@doittechnology.pl. Dokumentacja użytkownika Expo Composer Dokumentacja użytkownika Wersja 1.0 www.doittechnology.pl 1 SPIS TREŚCI 1. O PROGRAMIE... 3 Wstęp... 3 Wymagania systemowe... 3 Licencjonowanie... 3 2. PIERWSZE KROKI Z Expo Composer... 4

Bardziej szczegółowo

Oficyna Wydawnicza UNIMEX ebook z zabezpieczeniami DRM

Oficyna Wydawnicza UNIMEX ebook z zabezpieczeniami DRM Oficyna Wydawnicza UNIMEX ebook z zabezpieczeniami DRM Opis użytkowy aplikacji ebookreader Przegląd interfejsu użytkownika a. Okno książki. Wyświetla treść książki podzieloną na strony. Po prawej stronie

Bardziej szczegółowo

PRZEWODNIK PO PRZEDMIOCIE

PRZEWODNIK PO PRZEDMIOCIE Nazwa przedmiotu: Kierunek: Informatyka Rodzaj przedmiotu: moduł specjalności obowiązkowy: Inżynieria oprogramowania Rodzaj zajęć: wykład, laboratorium I KARTA PRZEDMIOTU CEL PRZEDMIOTU GRAFICZNE MODELOWANIE

Bardziej szczegółowo

1. Prymitywy graficzne

1. Prymitywy graficzne 1. Prymitywy graficzne Prymitywy graficzne są elementarnymi obiektami jakie potrafi bezpośrednio rysować, określony system graficzny (DirectX, OpenGL itp.) są to: punkty, listy linii, serie linii, listy

Bardziej szczegółowo

Tworzenie szablonów użytkownika

Tworzenie szablonów użytkownika Poradnik Inżyniera Nr 40 Aktualizacja: 12/2018 Tworzenie szablonów użytkownika Program: Plik powiązany: Stratygrafia 3D - karty otworów Demo_manual_40.gsg Głównym celem niniejszego Przewodnika Inżyniera

Bardziej szczegółowo

54. Układy współrzędnych

54. Układy współrzędnych 54 54. Układy współrzędnych Współrzędne punktów i dostępne układy współrzędnych na płaszczyźnie (2D) omówiono w rozdziale 8. Współrzędne 2D. W tym rozdziale podane zostaną informacje dodatkowe konieczne

Bardziej szczegółowo

ROZDZIAŁ 1. PRZEGLĄD BRAMOFONU SAFE...

ROZDZIAŁ 1. PRZEGLĄD BRAMOFONU SAFE... Spis treści INSTRUKCJA OBSŁUGI SPIS TREŚCI ROZDZIAŁ 1. PRZEGLĄD BRAMOFONU SAFE... 2 1.3. WYMAGANIA SYSTEMU... 2 ROZDZIAŁ 2. APLIKACJA I URZĄDZENIE.... 4 2.1. DODAWANIE BRAMOFONU DO APLIKACJI... 4 2.2.

Bardziej szczegółowo

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.

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. Część XXII C++ w 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. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na

Bardziej szczegółowo

Zaawansowany kurs języka Python

Zaawansowany kurs języka Python PyGame 18 grudnia 2015 Plan wykładu 1 Wprowadzenie Parametry wyświetlania Powierzchnie 2 Klawiatura Mysz Dżojstik 3 Odtwarzanie plików dźwiękowych Odtwarzanie muzyki Samodzielne tworzenie dźwięków 4 3D:

Bardziej szczegółowo

DesignCAD 3D Max 24.0 PL

DesignCAD 3D Max 24.0 PL DesignCAD 3D Max 24.0 PL Październik 2014 DesignCAD 3D Max 24.0 PL zawiera następujące ulepszenia i poprawki: Nowe funkcje: Tryb RedSDK jest teraz dostępny w widoku 3D i jest w pełni obsługiwany przez

Bardziej szczegółowo

Podstawy Programowania C++

Podstawy Programowania C++ Wykład 3 - podstawowe konstrukcje Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu, instrukcja przypisania, podstawowe typy danych, zapis i odczyt danych, wyrażenia:

Bardziej szczegółowo

GUI - projektowanie interfejsów

GUI - projektowanie interfejsów Katedra Inżynierii Wiedzy, Uniwersytet Ekonomiczny w Katowicach Wykład 1 e-mail: przemyslaw.juszczuk@ue.katowice.pl pjuszczuk.pl Warunki zaliczenia Test z części teoretycznej (materiały z wykładów); Projekt

Bardziej szczegółowo

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

Oświetlenie. Modelowanie oświetlenia sceny 3D. Algorytmy cieniowania. Oświetlenie. Modelowanie oświetlenia sceny 3D. Algorytmy cieniowania. Chcąc osiągnąć realizm renderowanego obrazu, należy rozwiązać problem świetlenia. Barwy, faktury i inne właściwości przedmiotów postrzegamy

Bardziej szczegółowo

5.4. Efekty specjalne

5.4. Efekty specjalne 5.4. Efekty specjalne Przedstawiliśmy już sobie sporo kwestii związanych z dodawaniem, edytowaniem czy usuwaniem elementów, które możemy zamieścić w prezentacji. Ale pomyłką było by stwierdzenie, że więcej

Bardziej szczegółowo

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

1 Wstęp teoretyczny. Temat: Manipulowanie przestrzenią. Grafika komputerowa 3D. Instrukcja laboratoryjna Układ współrzędnych Instrukcja laboratoryjna 9 Grafika komputerowa 3D Temat: Manipulowanie przestrzenią Przygotował: dr inż. Grzegorz Łukawski, mgr inż. Maciej Lasota, mgr inż. Tomasz Michno 1 Wstęp teoretyczny 1.1 Układ

Bardziej szczegółowo

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia Podstawy informatyki Elektrotechnika I rok Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia Katedra Energoelektroniki i Automatyki Systemów Przetwarzania Energii AGH Kraków 2017 Tematyka

Bardziej szczegółowo

PyGame Gra w Ponga. Spis treści

PyGame Gra w Ponga. Spis treści - 1 - PyGame Gra w Ponga Opis implementacji: Używając biblioteki PyGame oraz języka Python, stworzymy prostą grę Pong. Autorzy: Łukasz Zarzecki, Robert Bednarz Czas realizacji: 90 min Poziom trudności:

Bardziej szczegółowo

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

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 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 obserwatora f) w kierunku od obserwatora 1. Obrót dookoła osi

Bardziej szczegółowo

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Część XVIII C++ Funkcje Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach? Umiemy już podzielić nasz

Bardziej szczegółowo

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02 METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się

Bardziej szczegółowo

UNIWERSYTET RZESZOWSKI KATEDRA INFORMATYKI

UNIWERSYTET RZESZOWSKI KATEDRA INFORMATYKI UNIWERSYTET RZESZOWSKI KATEDRA INFORMATYKI LABORATORIUM TECHNOLOGIA SYSTEMÓW INFORMATYCZNYCH W BIOTECHNOLOGII Aplikacja bazodanowa: Cz. II Rzeszów, 2010 Strona 1 z 11 APLIKACJA BAZODANOWA MICROSOFT ACCESS

Bardziej szczegółowo

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

Uniwersytet Zielonogórski. Kurs: Autodesk 3D Studio MAX Komputerowa grafika 3D. 3dsmax Teksturowanie obiektów 3D Uniwersytet Zielonogórski Kurs: Autodesk 3D Studio MAX Komputerowa grafika 3D 3dsmax Teksturowanie obiektów 3D opracował: dr inż Andrzej Czajkowski, aczajkowski@issiuzzgorapl 1 Cel ćwiczenia Celem ćwiczenia

Bardziej szczegółowo

ANALIZA I INDEKSOWANIE MULTIMEDIÓW (AIM)

ANALIZA I INDEKSOWANIE MULTIMEDIÓW (AIM) ANALIZA I INDEKSOWANIE MULTIMEDIÓW (AIM) LABORATORIUM 5 - LOKALIZACJA OBIEKTÓW METODĄ HISTOGRAMU KOLORU 1. WYBÓR LOKALIZOWANEGO OBIEKTU Pierwszy etap laboratorium polega na wybraniu lokalizowanego obiektu.

Bardziej szczegółowo

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

Tworzenie nowego rysunku Bezpośrednio po uruchomieniu programu zostanie otwarte okno kreatora Nowego Rysunku. 1 Spis treści Ćwiczenie 1...3 Tworzenie nowego rysunku...3 Ustawienia Siatki i Skoku...4 Tworzenie rysunku płaskiego...5 Tworzenie modeli 3D...6 Zmiana Układu Współrzędnych...7 Tworzenie rysunku płaskiego...8

Bardziej szczegółowo

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

Synteza i obróbka obrazu. Tekstury. Opracowanie: dr inż. Grzegorz Szwoch Politechnika Gdańska Katedra Systemów Multimedialnych Synteza i obróbka obrazu Tekstury Opracowanie: dr inż. Grzegorz Szwoch Politechnika Gdańska Katedra Systemów Multimedialnych Tekstura Tekstura (texture) obraz rastrowy (mapa bitowa, bitmap) nakładany na

Bardziej szczegółowo

PROGRAMOWANIE GRAFIKI I ELEMENTÓW INTERAKTYWNYCH NA STRONY WWW W P5.JS

PROGRAMOWANIE GRAFIKI I ELEMENTÓW INTERAKTYWNYCH NA STRONY WWW W P5.JS Informatyka w Edukacji, XVI UMK Toruń, 2019 PROGRAMOWANIE GRAFIKI I ELEMENTÓW INTERAKTYWNYCH NA STRONY WWW W P5.JS Ośrodek Edukacji Informatycznej i Zastosowań Komputerów w Warszawie, Raszyńska 8/10 agnieszka.borowiecka@oeiizk.waw.pl

Bardziej szczegółowo

Zasady programowania Dokumentacja

Zasady programowania Dokumentacja Marcin Kędzierski gr. 14 Zasady programowania Dokumentacja Wstęp 1) Temat: Przeszukiwanie pliku za pomocą drzewa. 2) Założenia projektu: a) Program ma pobierać dane z pliku wskazanego przez użytkownika

Bardziej szczegółowo

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

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład. Część XVII C++ Funkcje Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład. 2 3 Tworzymy deklarację i definicję funkcji o nazwie pobierzln() Funkcja

Bardziej szczegółowo

Instrukcja obsługi programu Do-Exp

Instrukcja obsługi programu Do-Exp Instrukcja obsługi programu Do-Exp Autor: Wojciech Stark. Program został utworzony w ramach pracy dyplomowej na Wydziale Chemicznym Politechniki Warszawskiej. Instrukcja dotyczy programu Do-Exp w wersji

Bardziej szczegółowo

Politechnika Warszawska Wydział Mechatroniki Instytut Automatyki i Robotyki

Politechnika Warszawska Wydział Mechatroniki Instytut Automatyki i Robotyki Politechnika Warszawska Wydział Mechatroniki Instytut Automatyki i Robotyki Ćwiczenie laboratoryjne 2 Temat: Modelowanie powierzchni swobodnych 3D przy użyciu programu Autodesk Inventor Spis treści 1.

Bardziej szczegółowo

Referat Pracy Dyplomowej

Referat Pracy Dyplomowej Referat Pracy Dyplomowej Team Pracy: Projekt i realizacja gry w technologii HTML5 z wykorzystaniem interfejsu programistycznego aplikacji Facebook Autor: Adam Bartkowiak Promotor: dr inż. Roman Simiński

Bardziej szczegółowo

1. Dockbar, CMS + wyszukiwarka aplikacji Dodawanie portletów Widok zawartości stron... 3

1. Dockbar, CMS + wyszukiwarka aplikacji Dodawanie portletów Widok zawartości stron... 3 DODAJEMY TREŚĆ DO STRONY 1. Dockbar, CMS + wyszukiwarka aplikacji... 2 2. Dodawanie portletów... 3 Widok zawartości stron... 3 Omówienie zawartości portletu (usunięcie ramki itd.)... 4 3. Ikonki wybierz

Bardziej szczegółowo

Platforma e-learningowa

Platforma e-learningowa Dotyczy projektu nr WND-RPPD.04.01.00-20-002/11 pn. Wdrażanie elektronicznych usług dla ludności województwa podlaskiego część II, administracja samorządowa realizowanego w ramach Decyzji nr UDA- RPPD.04.01.00-20-002/11-00

Bardziej szczegółowo

Oprogramowanie. DMS Lite. Podstawowa instrukcja obsługi

Oprogramowanie. DMS Lite. Podstawowa instrukcja obsługi Oprogramowanie DMS Lite Podstawowa instrukcja obsługi 1 Spis treści 1. Informacje wstępne 3 2. Wymagania sprzętowe/systemowe 4 3. Instalacja 5 4. Uruchomienie 6 5. Podstawowa konfiguracja 7 6. Wyświetlanie

Bardziej szczegółowo

Autodesk 3D Studio MAX Teksturowanie modeli 3D

Autodesk 3D Studio MAX Teksturowanie modeli 3D Autodesk 3D Studio MAX Teksturowanie modeli 3D dr inż. Andrzej Czajkowski Instyt Sterowania i Systemów Informatycznych Wydział Informatyki, Elektrotechniki i Automatyki 25 kwietnia 2017 1 / 20 Plan Wykładu

Bardziej szczegółowo

Zad. 6: Sterowanie robotem mobilnym

Zad. 6: Sterowanie robotem mobilnym Zad. 6: Sterowanie robotem mobilnym 1 Cel ćwiczenia Utrwalenie umiejętności modelowania kluczowych dla danego problemu pojęć. Tworzenie diagramu klas, czynności oraz przypadków użycia. Wykorzystanie dziedziczenia

Bardziej szczegółowo

Wstęp 7 Rozdział 1. OpenOffice.ux.pl Writer środowisko pracy 9

Wstęp 7 Rozdział 1. OpenOffice.ux.pl Writer środowisko pracy 9 Wstęp 7 Rozdział 1. OpenOffice.ux.pl Writer środowisko pracy 9 Uruchamianie edytora OpenOffice.ux.pl Writer 9 Dostosowywanie środowiska pracy 11 Menu Widok 14 Ustawienia dokumentu 16 Rozdział 2. OpenOffice

Bardziej szczegółowo