Symulacja zjawisk naturalnych przy wykorzystaniu silnika graficznego CryEngine

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

Download "Symulacja zjawisk naturalnych przy wykorzystaniu silnika graficznego CryEngine"

Transkrypt

1 Politechnika Warszawska Wydział Elektroniki i Technik Informacyjnych Instytut Informatyki Rok akademicki 2013/2014 PRACA DYPLOMOWA INŻYNIERSKA Mateusz Andrzej Zawiślak Symulacja zjawisk naturalnych przy wykorzystaniu silnika graficznego CryEngine Opiekun pracy mgr Krzysztof Chabko Ocena: Podpis Przewodniczącego Komisji Egzaminu Dyplomowego

2 Kierunek: Informatyka Specjalność: Inżynieria Systemów Informatycznych Data urodzenia: Data rozpoczęcia studiów: Życiorys Urodziłem się 8 sierpnia 1991 roku w Janowie Lubelskim, lecz moim miastem rodzinnym jest Biłgoraj. W roku 2004 ukończyłem Szkołę Podstawową nr 3 w Biłgoraju. W latach kontynuowałem naukę w Zespole Szkół Ogólnokształcących w Biłgoraju, najpierw w Powiatowym Gimnazjum nr 2, a następnie Liceum Ogólnokształcącym im. ONZ w klasie o profilu matematyczno-informatyczno-fizycznym. Egzamin maturalny zdałem w 2010 roku i zostałem przyjęty na studia dzienne na Wydziale Informatyki i Technik Informacyjnych Politechniki Warszawskiej. W trakcie piątego semestru wybrałem specjalizację Inżynieria Systemów Informatycznych.. podpis studenta Egzamin dyplomowy Złożył egzamin dyplomowy w dn... z wynikiem. Ogólny wynik studiów... Dodatkowe uwagi i wnioski Komisji....

3 Streszczenie Przedmiotem niniejszej pracy jest symulacja zjawiska burzy jako ilustracji rozbudowy silnika gry CryEngine. Pierwsza część pracy jest wprowadzeniem w tematykę tworzenia wirtualnych rzeczywistości z wykorzystaniem dostępnych na rynku silników gier i grafiki oraz przedstawieniem problemu wizualizacji zjawisk naturalnych. Kolejne rozdziały dokładnie opisują proces tworzenia nowych elementów omawianego silnika wraz z opisem wykonanej symulacji burzy. Ostatnia część to załączniki. Znajdują się w nich propozycje zajęć laboratoryjnych prezentujących możliwości rozbudowy silnika CryEngine wersji Słowa kluczowe: CryEngine, burza, rozbudowa, zjawisko naturalne Abstract The simulation of natural phenomena using graphics engine CryEngine The object of this thesis is simulation of the phenomena of the storm as an example of an CryEngine s game engine expansion. The first part of the thesis preludes to the subject of creating virtual realities using a commercially available game and graphics engines. It also contains a representation of the problem of visualization of natural phenomena. Next chapters thoroughly describe the process of creating new elements of this engine with the description of the created storm simulation. In the last part, there are attachments. They present the proposals of the laboratory using CryEngine version Key words: CryEngine, storm, extension, natural phenomenon

4 1. WSTĘP WPROWADZENIE CEL PRACY PLAN PRACY PRZEGLĄD DOSTĘPNYCH ŚRODOWISK DO PROJEKTOWANIA WIRTUALNYCH RZECZYWISTOŚCI PROJEKTOWANIE WIRTUALNE DEFINICJA SILNIKA GRY SILNIK CRYENGINE ALTERNATYWNE ROZWIĄZANIA SPOJRZENIE W PRZYSZŁOŚĆ WIZUALIZACJA BURZY CHARAKTERYSTYKA PROBLEMU ZAŁOŻENIA WYMAGANIA PROJEKT ROZWIĄZANIA I OPIS WYBRANYCH ELEMENTÓW IMPLEMENTACJI PROJEKT INTERFEJSU ZARYS ARCHITEKTURY ROZWIĄZANIA MODELOWANIE DESZCZU BŁYSKI WRAZ Z PIORUNAMI WIATR JAKO POPRAWA FUNKCJONALNOŚCI SILNIKA PROBLEMY NIEROZWIĄZANE OCENA ROZWIĄZANIA JAKOŚĆ SYMULACJI OCENA ZŁOŻONOŚCI PROCESU ROZBUDOWY SILNIKA PODSUMOWANIE BIBLIOGRAFIA ZAWARTOŚĆ PŁYTY CD ZAŁĄCZNIKI ZAŁĄCZNIK A. ZAPOZNANIE ZE ŚRODOWISKIEM CRYENGINE 3 FREE SDK ZAŁĄCZNIK B. WPROWADZENIE DO TWORZENIA WŁASNYCH OBIEKTÓW DLA SILNIKA CRYENGINE ZAŁĄCZNIK C. SYMULACJA PROSTYCH ZJAWISK NATURALNYCH W CRYENGINE

5 Wstęp 1. Wstęp 1.1. Wprowadzenie Grafika komputerowa to dziedzina informatyki zajmująca się tworzeniem szeroko pojętej grafiki przy pomocy komputera. Obecnie jest powszechnie stosowana w rozrywce, nauce oraz technice [3]. Od lat artyści starają się przedstawić przy jej pomocy swoje wizje, a naukowcy prowadzić symulacje różnego rodzaju sytuacji. Podstawowym kryterium podziału zastosowania grafiki może być typ danych. Na tej podstawie wyróżniamy grafikę dwuwymiarową i trójwymiarową. Pojęcie trójwymiarowości należy rozumieć jako przedstawianie obiektów umieszczonych w przestrzeni trójwymiarowej na dwuwymiarowym obrazie. Za kolejne kryterium należy uznać cykl generacji obrazu. Na jego podstawie należy wyróżnić grafikę czasu rzeczywistego, w której program musi bardzo szybko odświeżać obraz [3]. Trójwymiarowa grafika czasu rzeczywistego odgrywa kluczowe znaczenie w różnego rodzaju symulacjach i grach komputerowych oraz wszędzie tam, gdzie wymagana jest interakcja z użytkownikiem. Najpotężniejszą dziedziną jej zastosowań pozostają jednak gry komputerowe. Dążenie do fotorealizmu istotnie wpływa na szybkość rozwoju tej gałęzi grafiki komputerowej. Najpopularniejsze gry komputerowe tworzone są dzięki silnikom gier, które oferują na dzień dzisiejszy szeroki zestaw rozwiązań posiadających zróżnicowane funkcjonalności. Najnowsze trendy ukierunkowują jej rozwój w stronę odwzorowywania natury w środowisku wirtualnym. Wraz z rozwojem silników efekty staja się coraz ładniejsze i bardziej dopracowane Cel pracy Jednym z najpopularniejszych silników koncentrujących się na, jak najdokładniejszym odwzorowania natury w wirtualnym środowisku jest produkt firmy Crytek CryEngine. Celem pracy inżynierskiej było stworzenie symulacji zjawiska naturalnego, jakim jest burza, przy wykorzystaniu wspomnianego silnika. Animacja powinna wyglądać realistycznie i wykorzystać możliwości oferowane przez CryEngine. Wszystkie działania związane z animacją muszą być prowadzone w czasie rzeczywistym. Stworzony obiekt musi bowiem móc stanowić fragment większej sceny interaktywnie odwzorowującej działanie natury. Opis wykonanego rozwiązania powinien ponadto stanowić swoisty szablon tworzenia nowych elementów, zrozumiały dla programistów rozpoczynających pracę z tym silnikiem. 5

6 Wstęp 1.3. Plan pracy Niniejsza praca podzielona została na cztery zasadnicze części. Pierwsza część to rozdział drugi dokonujący przeglądu dziedziny i dostępnych na rynku gotowych rozwiązań. Wyjaśnione zostały w nim podstawowe definicje w celu wprowadzenia czytelnika w tematykę pracy. Drugą, główną część pracy stanowią rozdziały 3 6. Rozdział 3 zawiera szczegółowe sformułowanie problemu pracy. Wymienione zostały założenia i wymagania stawiane omawianemu w dalszej części rozwiązaniu. Rozdział 4 przedstawia krok po kroku proces rozbudowy silnika CryEngine na przykładzie obiektu symulującego zachowanie burzy. Dodatkowo opisane zostały nierozwiązane problemy, wraz z ich przyczynami. Rozdziały 5 oraz 6 to omówienie sposobu oceny rozwiązania, wnioski oraz podsumowanie całości symulacji burzy, jako ilustracji definiowania nowych elementów silnika CryEngine. Organizacyjna część trzecia to rozdziały 7 i 8. Bibliografia z rozdziału 7 zawiera spis książek, stron WWW oraz artykułów wykorzystanych jako źródła informacji, niezbędne podczas tworzenia pracy inżynierskiej. Rozdział 8 opisuje zawartość dołączonej płyty CD. Ostatnią czwartą, a zarazem niezwykle istotną część pracy stanowią załączniki zawierające propozycje tematyki laboratoriów przedstawiających możliwości rozwoju silnika CryEngine. Każdy z nich kończy się zestawem poleceń dla uczestników danych zajęć. Do każdego z zadań laboratoryjnych zostało dołączone przykładowe rozwiązanie. Wszystkie rysunki znajdujące się w pracy zostały oznaczone dodatkowym, krótkim opisem. Jeżeli obrazek nie został wykonany przez autora pacy, informacja o jego pochodzeniu została umieszczona na końcu tego opisu. 6

7 Przegląd dostępnych środowisk do projektowania wirtualnych rzeczywistości 2. Przegląd dostępnych środowisk do projektowania wirtualnych rzeczywistości 2.1. Projektowanie wirtualne Dzisiejsze środowisko ekonomiczne zarówno w Polsce jak i pozostałej części świata stawia stale wzrastające wymagania w stosunku do kolejnych inwestycji wszystkich sektorów gospodarczych. Projekty realizowane są z zachowaniem coraz krótszych terminów wykonania, maksymalnego poziomu elastyczności oraz szybkości dostosowywania się do zmieniających się realiów i wymagań. W przypadku zdecydowanej większości z nich komunikacja pomiędzy wykonawcą a zleceniodawcą w głównej mierze odbywa się za pośrednictwem sieci. Dotyczy to przede wszystkim sektora informatycznego, ale pozostałe również nie pozostają w tyle. Zarządzanie projektami większości dziedzin gospodarki staje dzisiaj przed dodatkowymi wymaganiami, ale co warte podkreślenia, również i dodatkowymi możliwościami 1. Projekty wirtualne stwarzają realną szansę sprostania tym wszystkim wymaganiom. Tworzenie nowego oprogramowania, gry komputerowej, projektowanie nowego budynku architektonicznego bądź ogrodu wymaga od wykonawcy korzystania z wirtualnego projektowania. Wraz z rozwojem tej dziedziny informatyki architekci zyskali możliwość zweryfikowania z klientem pierwszych szkiców bez konieczności ciągłego przerysowywania nowych koncepcji. Co więcej zleceniodawca ma możliwość dostrzeżenia większej ilości szczegółów w stosunku do tradycyjnego rysunku technicznego. Wirtualny obraz otaczającej nas rzeczywistości można dziś dostrzec również w sferze rozrywki. Zrodziła się możliwość odbywania wirtualnych spacerów w miejscach, do których dotarcie byłoby po prostu niemożliwe, a interaktywne prezentacje zjawisk naturalnych mogą być doskonałą formą przekazania wiedzy. Dodatkowo symulacja zjawisk niebezpiecznych dla życia człowieka umożliwia wcześniejsze zaplanowanie niezbędnych przeciwdziałań i zweryfikowanie ich skuteczności w wirtualnej rzeczywistości Definicja silnika gry Sprawne przygotowanie wirtualnej rzeczywistości nie byłoby możliwe bez specjalistycznego silnika. W tym momencie należy zaznaczyć wyraźną różnicę pomiędzy silnikami graficznym oraz silnikami gier. Silnik graficzny jest to część kodu odpowiadająca za przetwarzanie grafiki trójwymiarowej, a więc przygotowanie 1 Źródło: 7

8 Przegląd dostępnych środowisk do projektowania wirtualnych rzeczywistości i renderowanie sceny [5]. Zawiera elementy zaawansowanej matematyki, wymagające złożonych obliczeń i przekształceń poszczególnych elementów modelowanej rzeczywistości. Silnik graficzny działa w czasie rzeczywistym, a zatem kolejne klatki obrazu muszą być generowane z prędkością pozwalającą na swobodny ruch symulowanej rzeczywistości [5]. W odróżnieniu od silnika graficznego silnik gry odpowiedzialny jest za interakcję elementów gry. W wielu przypadkach silniki gier zapewniają szeroki zestaw narzędzi programistycznych wraz z komponentami umożliwiającymi ich wielokrotne użycie. Większość dostępnych na rynku silników dostarczanych jest wraz ze zintegrowanymi środowiskami umożliwiającymi szybkie tworzenie pełnych produktów, bez ingerencji w kod, a co za tym idzie znajomości języków programowania. Czasami nazywane są one oprogramowaniem pośredniczącym (ang. middleware) [7]. Silniki gier zazwyczaj bazują na silnikach graficznych, których realizacja opiera się na interfejsie programowania aplikacji graficznych (ang. API), takich jak OpenGL bądź DirectX. Jak większość oprogramowania pośredniczącego silniki gier zapewniają niezależność od karty graficznej oraz wideo tak bardzo pożądaną w czasach istnienia ogromnej różnorodności sprzętu komputerowego. Początkowo budowane były na podstawie języków programowania niskiego poziomu m.in. C (np. Sge2d). Obecnie coraz więcej silników gier implementowanych jest w językach wysokiego poziomu, takich jak Java, C++ (np. CryEngine 3) czy Python (np. Panda3D). Wydajność najnowocześniejszych gier 3D jest dzisiaj ograniczana przez moc kart graficznych, a zatem potencjalne zagrożenie spowolnienia wynikające z tłumaczenia języków wysokiego poziomu ma pomijalne znaczenie. Natomiast wzrost wydajności realizowania projektów z ich wykorzystaniem stwarza ogromne korzyści dla producentów. Wbrew powszechnej opinii silniki gier nie służą jedynie do tworzenia gier. Stanowią doskonałą podstawę do tworzenia oprogramowania wykorzystywanego w procesie realizacji projektów, o których jest mowa w podrozdziale 2.1 niniejszej pracy [7] Silnik CryEngine Ogólny zarys W niniejszej pracy do realizacji wizualizacji zjawisk naturalnych wykorzystano silnik CryEngine 3. Wersja oznaczona numerem 3 niemieckiego producenta gier komputerowych Crytek wydana została w sierpniu 2011 roku i została zaimplementowana z wykorzystaniem języka C++. 8

9 Przegląd dostępnych środowisk do projektowania wirtualnych rzeczywistości Całość pakietu dostarczanego wraz z silnikiem CryEngine 3 zawiera również zestaw narzędzi deweloperskich CryEngine 3 SDK do tworzenia własnych modyfikacji, map oraz kompletu logiki gry. Ogół tworzonego świata może być budowany na zasadzie przeciągnij i upuść. Ze względu na ogromne podobieństwo jego wyglądu do jednego z najpopularniejszych programów do generowania grafiki trójwymiarowej 3ds Max silnik CryEngine 3 zyskał ogromną popularność zarówno wśród wielkich producentów gier jak i zwykłych pasjonatów tworzenia wirtualnej rzeczywistości. Tablica 1.1 przedstawia liczbę projektów programistycznych posiadających wykupioną licencję na wykorzystanie CryEngine w zależności od jego kolejnych wersji. Stały wzrost zainteresowania deweloperów omawianym silnikiem stanowi doskonałe potwierdzenie realizacji założeń firmy Crytek o chęci tworzenia uniwersalnej technologii umożliwiającej opracowywanie szerokiego zakresu produkcji komputerowych. Tablica 1.1 Liczba sprzedanych licencji silnika CryEngine (stan z dnia ) Licencjonowanie Wersja silnika Liczba sprzedanych licencji CryEngine 1 6 CryEngine 2 7 CryEngine 3 32 Produkt firmy Crytek dostępny jest w kilku rodzajach licencji. Darmowa wersja pozwala na jej niekomercyjne użytkownie bez żadnych dodatkowych ograniczeń. Możliwe jest oczywiście wykupienie licencji, jednak cena takiej operacji nie jest publicznie znana. Co ciekawe konieczność dokonania takiego zakupu pojawia się dopiero w momencie odnoszenia korzyści finansowych dzięki silnikowi CryEngine [8]. Niezależność licencyjną posiada CryENGINE Cinebox. Produkt ten jest platformą do tworzenia szerokiej gamy wizualizacji, którego podstawę stanowi silnik CryEngine. Przeznaczony jest głównie dla dużych producentów, ze względu na koszt wspomnianej licencji. Stwarza możliwości nagrywania sekwencji filmowych w wysokiej rozdzielczości. Być może dzięki zaawansowanemu poziomowi zaimplementowanej fizyki i jakości renderowanego obrazu w niedalekiej przyszłości powstaną przy jego pomocy seriale lub pełnometrażowe filmy [8] Wersja Projekt wizualizacji zjawisk naturalnych realizowany w niniejszej pracy wykonany został dzięki silnikowi CryEngine wersji na podstawie darmowej licencji. Podobnie jak w poprzednich wydaniach tak i teraz zapewniona jest kompatybilność z wieloma 9

10 Przegląd dostępnych środowisk do projektowania wirtualnych rzeczywistości programami do grafiki komputerowej. Dzięki łatwemu w instalacji dodatkowi CryTIF dostępne jest tworzenie własnych tekstur oraz modyfikacja już istniejących w programie Photoshop (wersji 6. lub wyższej). Poza wyglądem i numerem wersji kolejną rzeczą łączącą CryEngine 3 SDK z 3ds Max em jest zestaw dodatków CryExport[nrWersji].dlu pozwalających grafikom na importowanie do edytora wymodelowanych obiektów bądź animacji. Rysunek 2.1 przedstawia pełny diagram przepływu tworzenia zasobów różnych części oprogramowania [2, 13]. Rys. 2.1 Diagram przepływu tworzenia zasobów [2 s.125] Dla wygody użytkownika CryEngine wspiera pisanie skryptów w języku LUA. Daje to możliwość implementacji ważnych funkcjonalności tworzonej rzeczywistości bez konieczności rekompilacji kodu źródłowego całego silnika. Oznacza to, że rezultaty wszystkich wprowadzonych zmian widoczne są od razu w oknie edytora. Przyjazny interfejs modelowania obiektów dostępny jest bezpośrednio w edytorze SDK. Natomiast dalsza chęć zamodelowania złożonych logicznie wirtualnych rzeczywistości, dostępna jest dzięki otwartości produktu CryEngine na modyfikację. Łatwość integracji kodu 10

11 Przegląd dostępnych środowisk do projektowania wirtualnych rzeczywistości źródłowego ze środowiskiem MS Visual Studio zachęca kolejnych programistów do stawienia czoła próbie rozbudowy oraz personalizacji jego szerokich możliwości [10]. Wersja w stosunku do poprzednich przynosi szereg poprawek wykrytych błędów oraz dokłada nowe funkcjonalności jak i narzędzia developerskie. Szczególnie warte uwagi jest odświeżenie teselacji DirectX11 oraz jego kompatybilność z urządzeniami mobilnymi i konsolami (Xbox, PlayStation 3, PlayStation 4 i Wii U). Charakteryzuje się ona dodatkowymi efektami wody i większym poziomem szczegółowości w stosunku do poprzednich wersji. Od początku rozwój silnika CryEngine nastawiony był na wizualizację otwartych przestrzeni, dzięki czemu obecny stopień ich odwzorowania względem rzeczywistości jest imponująco wysoki Alternatywne rozwiązania Dzisiejszy rynek programistyczny silników gier liczy sobie tysiące alternatywnych rozwiązań począwszy od tych najbardziej znanych jak Queke bądź Unreal, a kończąc na jeszcze niedocenianych produkcjach zdecydowanie mniejszych korporacji. Jednym z podstawowych kryteriów podziału tak licznej grupy oprogramowania jest ich publiczna dostępność. Znakomita większość silników umożliwia wypróbowanie przeważającej części ich możliwości dzięki źródłom umieszczanym w sieci na zasadzie darmowych licencji (ang. open source). W opozycji do takiej postawy stoją deweloperzy, których autorskie silniki gier objęte są ścisłą klauzulą poufności. Przykładem są znane większości graczy komputerowych wszystkie części serii FIFA oraz bestsellerowe gry akcji God of War III i Metal Gear Solid 4. Unreal Engine jest silnikiem, którego korzenie sięgają roku 1998, a jego najnowsza wersja zaprezentowana została przez firmę Epic Games w roku Mimo tak długiego jak na realia szybko rozwijającego się rynku oprogramowania okresu czasu Unreal nadal pozostaje jednym z najchętniej wybieranych silników gier. Charakteryzuje się on wieloplatformowością dzięki temu, że jego jądro zostało zaimplementowane w języku C++. Zasadnicza część kodu opiera się na języku UnrealScript, lecz dzięki licznym narzędziom modyfikacja go oraz budowa na jego podstawie zindywidualizowanych produkcji nie stwarza większych problemów. Zachęca on kolejnych deweloperów relatywnie niską ceną wywoławczą i mocno rozwiniętym wideo krajobrazem [9]. Wyróżniającą się pozycją jest Unity 4 posiadający ponad 1.5 miliona zarejestrowanych użytkowników. Unity 4 to zintegrowany system tworzenia gier 2 Źródło: 11

12 Przegląd dostępnych środowisk do projektowania wirtualnych rzeczywistości komputerowych opierający się na potężnym silniku, posiadający szeroką gamę narzędzi deweloperskich do tworzenia trójwymiarowej rzeczywistości. Poza grami producenci zapewniają możliwość tworzenia wysokiej jakości wizualizacji oraz wirtualnych animacji. Samo środowisko przystosowane jest do działania na trzech największych platformach: Microsoft Windows, Os X oraz co warte szczególnej uwagi Linux. Jednak uruchamianie jego produktów końcowych możliwe jest na pozostałych platformach: Mac OS, Wii, PlayStation 3, Xbox 360, Windows Phone 8 i Android. Unity dzięki wtyczce Unity Web Player zapewnia możliwość działania gier w przeglądarce internetowej. Stanowi to bardzo atrakcyjną alternatywę dla wdrażania interaktywnych treści internetowych i stanowi potwierdzenie innowacyjności jej producenta Unity Technologies 3. Akcja większości gier komputerowych wyprodukowanych w przeciągu ostatniej dekady rozgrywana jest w zamkniętych przestrzeniach i z tego względu producenci silników gier skupiali na nich większość swojej uwagi. Crytek starając się myśleć przyszłościowo i być o jeden krok przed konkurencją stale analizował rynek i od samego początku produkcji CryEngine a rozwijał elementy świata zewnętrznego. Stąd CryEngine obrazuje swoje największe możliwości w przypadku otwartych powierzchni. Szeroki zestaw elementów przyrody, imponujących efektów renderowanych w czasie rzeczywistym, a co za tym idzie wspieranie wizualizacji zjawisk naturalnych był przeważającym kryterium wyboru silnika CryEngine do realizacji projektu w ramach niniejszej pracy dyplomowej. Intuicyjny edytor, łatwość modyfikacji kodu źródłowego oraz darmowa licencja oferowana przez firmę Crytek czyni jej produkt wyśmienitym narzędziem wizualizacji skomplikowanej działalności przyrody Spojrzenie w przyszłość Wraz z pojawieniem się ósmej generacji konsol wideo przed silnikami gier powstały nowe wyzwania i konieczność sprostania jeszcze większym wymaganiom rynku. Ten etap rozwoju gier komputerowych przyniósł konieczność implementacji wielu innowacyjnych rozwiązań (m.in. rozszerzonej rzeczywistości) nad którymi obecnie pracują najwięksi producenci. Dodatkowo razem ze stale wzrastającą liczbą elementów nowoczesnego silnika gier konieczne jest podnoszenie prędkości jego działania. Coraz większym zainteresowaniem cieszą się systemy z rodziny Linux. Co oczywiste wraz z nadchodzącymi zmianami ewoluować musi także rynek gier komputerowych. Producenci rozrywek komputerowych starając się dotrzeć do jak 3 Źródło: 12

13 Przegląd dostępnych środowisk do projektowania wirtualnych rzeczywistości największego grona odbiorców poszukują rozwiązań wspierających możliwie maksymalną liczbę platform. Firma Leadwerks Software jako jedna z pierwszych rozpoczęła realizację projektu, którego celem jest kolejna wersja silnika gier Leadwerks Engine, którego realizacja opiera się na znanej multiplatformowej bibliotece do trójwymiarowej grafiki komputerowej OpenGL. Co ciekawe w założeniach projektu nowe narzędzie nie będzie jedynie pozwalało na produkcję gier dla omawianego systemu, ale umożliwiało także tworzenie nowych bezpośrednio na nim 4. Najbliższe lata mogą więc być przełomowe dla rozwoju silników gier, a co za tym idzie możliwości tworzenia wirtualnych rzeczywistości wraz z wizualizacją zjawisk naturalnych. Z tego względu warto bliżej przyjrzeć się procesowi ich tworzenia od samego początku aż do finalnego efektu. 4 Żródło: 13

14 Wizualizacja burzy 3. Wizualizacja burzy Niniejszy rozdział zawiera sprecyzowanie celu pracy. Poza przedstawieniem charakterystyki problemu kolejne podrozdziały zawierają wymagania funkcjonalne i niefunkcjonalne stawiane realizowanemu projektowi Charakterystyka problemu Symulacja zjawisk obserwowanych w przyrodzie to bardzo złożony problem znajdujący się na pograniczu matematyki, informatyki oraz nauk przyrodniczych. Niejednokrotnie samo zdefiniowanie matematycznego modelu opisującego zachowanie wybranego efektu wymaga długotrwałych badań połączonych z próbą formułowania tez i ich udowadniania. Ograniczenia wynikające ze stosowanych języków programowania mogą wymusić na programiście zastosowanie przybliżeń, które często w znaczący sposób wpływają na końcowy rezultat prac. Dodatkowa, jak dotąd nieodgadniona, losowość charakterystyki oddziaływania świata stanowi kolejną przeszkodzę w idealnym odzwierciedleniu zjawisk naturalnych w ramach wirtualnej rzeczywistości. Niezwykle często obserwowanym działaniem przyrody jest burza. Jej definicja mówi o zjawisku zaburzenia równowagi atmosferycznej, przejawiającym się opadami deszczu wraz z silnym wiatrem. Często połączone są one z wyładowaniami atmosferycznymi obserwowanymi jako pioruny, którym towarzyszy grom dźwiękowy, a także zjawisko świetlne błyskawica. Burza to bardzo złożone zjawisko pogodowe, którego postać jak i intensywność działania uzależniona jest od miejsca, czasu trwania i wielu innych czynników, które mają zdolność dynamicznej zmiany w czasie. Matematyczny model opisujący całość omawianego elementu działania natury musi uwzględniać liczne zjawiska naturalne, o których mowa powyżej. Konieczność uwzględnienia ich wzajemnych interakcji uniemożliwia opracowanie jego idealnej postaci opisującej wszystkie czynniki wchodzące w skład burzy. Stąd grafika komputerowa stosuje liczne uproszczenia, pomimo których można uzyskać efekty bardzo przypominające prawdziwe zjawisko. 14

15 Wizualizacja burzy Rys. 3.1 Składowe elementy burzy Rysunki 3.1 przedstawiają składowe elementy stanowiące całość zjawiska burzy: wiatr oddziałowujący na obiekty znajdujące się w obrębie burzy (Rys. 3.1.A), kałuże tworzące się wskutek opadów deszczu (Rys. 3.1.B), krople deszczu stanowiące deszcz, wraz z ich odbiciem od obiektów stałych (Rys. 3.1.C), wyładowania atmosferyczne (Rys. 3.1.D). Celem pracy jest przedstawienie możliwości rozbudowy silnika CryEngine na przykładzie symulacji zachowania burzy. Naturalnym wymaganiem stawianym przed finalnym efektem symulacji jest uwzględnienie podstawowych elementów składających się na całość analizowanego zjawiska. Szczegółowe założenia zostały wymienione w następnym podrozdziale. Wyładowania atmosferyczne, a dokładniej rzecz ujmując wyładowania elektryczne w atmosferze powstają: w chmurach, pomiędzy chmurami oraz między chmurą a powierzchnią ziemi. W pracy przyjęto, że miejsce ich wystąpienia będzie niezależne od położenia chmur, gdyż ich symulacja a dalej interakcja z piorunami stanowi wysoce złożony problem, który mógłby stanowić temat odrębnej pracy dyplomowej. 15

16 Wizualizacja burzy Dla uniwersalności rozwiązania oraz jego pełnej kompatybilności z silnikiem CryEngine powinno być ono niezależne od architektury komputera testowego. Całość obliczeń będzie prowadzona poza procesorem karty graficznej (GPU). Wymusza to zastosowanie licznych uproszczeń modelu dla przyśpieszenia obliczeń, które nie powinny jednak wpłynąć na realizm wyglądu końcowej symulacji. Uwzględniając wygodę docelowych użytkowników obiekt burzy powinien być dostępny w ramach edytora CryEngine Sandbox SDK. Dodatkowym wymaganiem jest możliwość parametryzacji wszystkich wymienionych elementów. Dzięki temu wizualizacja burzy może być dostosowana do indywidualnych potrzeb użytkownika. Stanowi to jednoczesne utrudnienie uwzględnienia dowolności pory dnia lub nocy w jakiej może nastąpić symulacja zjawiska burzy. Podsumowując, celem niniejszej pracy jest przedstawienie możliwości symulacji zjawisk naturalnych przy wykorzystaniu silnika graficznego CryEngine. Przykładową realizację stanowić będzie burza, której symulacja powinna być prowadzona w czasie rzeczywistym Założenia Poniższa lista stanowi spis założeń dotyczących nowego obiektu burzy, stanowiącego rozbudowę funkcjonalności silnika CryEngine: możliwość animowania deszczu, możliwość zmiany rozmiaru oraz prędkości spadania kropli deszczu, tworzenie kałuż na płaskich powierzchniach ziemi, długość promienia burzy powinna być skalowalna, animacja rozbicia kropli deszczu w konfigurowalnej odległości maksymalnej od gracza, rozwiązanie musi zawierać symulację wiatru, którego działanie zanika poza obszarem objętym zjawiskiem, realizacja wiatru musi uwzględnić losowość tego zjawiska objawiającą się podmuchami, burza musi zawierać błyski oraz towarzyszące im pioruny, burza musi być podzielona na strefy definiujące prawdopodobieństwo wystąpienia w nich piorunów, w miejscu uderzenia pioruna powinien pozostać znak wypalenia na powierzchni ziemi (o ile uderzenie nastąpiło wystarczająco blisko terenu), 16

17 Wizualizacja burzy wypalenie powinno następować wraz z pojawieniem się pobliskiej smugi dymu, pojawieniu się pioruna musi towarzyszyć eksplozja, kolizja pioruna z obiektem powinna skutkować zapaleniem tegoż obiektu, styczność pioruna z metalowym obiektem powinna być obarczona dodatkowym efektem poświaty, zarówno wielkość jak i kształt pioruna powinny być losowe, symulowanym wyładowaniom atmosferycznym towarzyszy dźwięk słyszalny z bliskich odległości, algorytm nie uwzględnia skłonności uderzania piorunów w metalowe elementy, program powinien umożliwiać zmianę wartości parametrów wpływających na zachowanie poszczególnych elementów burzy, użytkownik powinien mieć dostęp do obiektu burzy z poziomu Panelu Poleceń edytora CryEngine 3 Sandbox SDK Wymagania Dla poprawnego działania programu, konieczne jest spełnienie wymagań definiowanych przez producentów środowiska CryEngine 3 Sandbox SDK. Element obiektu burzy rozbudowujący silnik CryEngine wersji tak samo jak całość silnika napisany został w językach C++ oraz skryptowym LUA, w środowisku Visual Studio Ze względu na rozmiar całości kodu silnika na płycie CD, dołączonej do niniejszej pracy, umieszczone zostały jedynie wszystkie nowo stworzone oraz zmodyfikowane pliki silnika. Chęć zbudowania całości wraz z nowymi elementami, wymaga otworzenia projektu CryEngine_GameCodeOnly.sln w środowisku Visual Studio, dołączenia nowych plików oraz podmiany zmodyfikowanych i zbudowaniu całego projektu. Uruchomienie gotowych scen wymaga wcześniejszego wyeksportowania ich do tzn. plików poziomu. Operacja ta dostępna jest poprzez wybór opcji Export to engine z menu File. Tak przygotowane pliki będą dostępne jako plansze rozgrywki, widoczne po uruchomieniu środowiska gry Launcher.exe. 17

18 Projekt rozwiązania i opis wybranych elementów implementacji 4. Projekt rozwiązania i opis wybranych elementów implementacji Rozdział ten przedstawia ogólny zarys implementacji zjawiska burzy w ramach silnika CryEngine. Na przykładzie omawianego projektu omówione zostaną możliwości rozbudowy silnika o kolejne obiekty symulujące działanie zjawisk naturalnych. Stopniowe budowanie finalnego obiektu rozpoczyna się od Rozdziału 4.1, który pokazuje, jak szybko można tworzyć interfejs graficzny dostępny dla użytkownika końcowego zestawu narzędzi SDK (ang. source development kit). Rozdział 4.2 omawia działanie symulacji zachowania burzy ilustrując schematycznie jego główne elementy, których opisy znajdują się w kolejnych częściach tego fragmentu pracy. W rozdziale 4.6 przedstawione zostały problemy napotkane przez autora podczas pracy z silnikiem CryEngine Projekt interfejsu Rysunek przedstawia projekt interfejsu graficznego odpowiadającego za interakcję między zachowaniem symulacji burzy a użytkownikiem. Analiza wymagań stawianych projektowanemu obiektowi umożliwiła wyróżnienie podstawowych parametrów charakteryzujących jego zachowanie. Rys Interfejs użytkownika definiujący parametry burzy 18

19 Projekt rozwiązania i opis wybranych elementów implementacji Całość interfejsu zaimplementowana została wewnątrz skryptu Storm.lua. Silnik CryEngine analizujący poszczególne skrypty automatycznie buduje menu dostępne dla użytkownika w panelu Roll Bar. Podstawę tej analizy stanowi zawartość tablicy Properties, wymaganej dla każdego skryptu opisującego dany obiekt [2 s.93]. Dzięki wprowadzonej przez producentów silnika konwencji przyrostków interpretacja graficzna parametru zależna jest od jego typu i umożliwia wygodną zmianę jego wartości [12]. Właściwości burzy podzielone zostały na 5 podstawowych części: podstawowe, błyski, rozbicie kropli deszczu, pioruny oraz wiatr. Każda z nich charakteryzuje zachowanie symulacji burzy w ramach danego elementu burzy. Tak jak w rzeczywistym środowisku tak i tutaj cześć z nich jest od siebie zależna a końcowy efekt jest wypadkową wartości wszystkich parametrów i ich współpracy Zarys architektury rozwiązania Jak wspomniano w rozdziale 3.1 problem opisu modelu burzy charakteryzuje się wysoką złożonością, a liczba parametrów opisujących całość zjawiska jest bardzo duża. Jednak, aby końcowa wizualizacja wyglądała realistycznie, zagadnienie to zostało zawężone do wymagań opisanych w rozdziale 3.2. Do reprezentacji obiektu burzy wykorzystano klasę CStorm, której abstrakcyjną klasę bazową stanowi CGameObjectExtensionHelper, rozszerzoną o następujące metody i zmienne: class CStorm : public CGameObjectExtensionHelper<CStorm, IGameObjectExtension> { public: enum StormTimer { ethunder_timer_lifetime = 0x1110, ethunder_timer_soundtime = 0x1111, eraindropanim_timer_lifetime = 0x1112 }; protected: /* */ zbiór zmiennych odpowiadającym parametrom zdefiniowanym w skrypcie Storm.lua Vec3* currwinddirection; } std::vector<string> lightnings; 19

20 GameFactory Rejestracja Projekt rozwiązania i opis wybranych elementów implementacji Wspomniana klasa CGameObjectExtensionHelper musi stanowić klasę bazową dla wszystkich nowo tworzonych obiektów. Zapewnia ona kompatybilność nowego elementu z pozostałą częścią silnika. Ponadto konieczne jest zarejestrowanie jej w globalnej przestrzeni nazw, tak aby była ona dostępna dla użytkowników edytora. Procedura ta odbywa się w ramach metody InitGameFactory klasy GameFactory. Macro REGISTER_GAME_OBJECT wymaga podania nazwy klasy bez obowiązkowego przyrostka C. Przykład takiej operacji został przedstawiony poniżej: REGISTER_GAME_OBJECT(pFramework, Storm, "Scripts/Entities/Environment/Storm.lua"); Rysunek schematycznie przedstawia umiejscowienie klas nowo definiowanych elementów w kontekście całego silnika: CryEngine CGameObjectExtensionHelper NowaKlasa1 NowaKlasa2 Rys Nowe klasy w ramach silnika CryEngine 20

21 Projekt rozwiązania i opis wybranych elementów implementacji Pośród licznego zbioru metod czysto wirtualnych, które musi implementować klasa CStorm należy wyróżnić metodę Update. Odpowiada ona za aktualizację obiektu i jest uruchamiana przez silnik CryEngine wraz z każdym odświeżaniem wirtualnego środowiska. Metoda ta stanowi więc miejsce w którym umieszczony został główny algorytm wizualizacji zjawiska burzy. deszcz błyski burza wiatr pioruny Rys Schemat symulacji burzy Rysunek stanowi poglądowy schemat budowy modelu burzy aktualizowany w każdym wywołaniu głównego algorytm, którego kroki wymieniono poniżej w postaci pseudo-kodu: Pętla wykonywania programu Aktualizacja wartości parametrów podanych przez użytkownika Aktualizacja deszczu Symulacja rozbicia kropli deszczu Symulacja wiatru Błyski wraz z piorunami Na początku należy zaktualizować wartości zmiennych prywatnych odpowiadających parametrom podanym przez użytkownika. Bezpośrednia interakcja z eksploatatorem niesie za sobą niebezpieczeństwo niepoprawności podanych danych. Dlatego też muszą być one zweryfikowane przed rozpoczęciem aktualizacji modelu. W omawianym rozwiązaniu zostało to wykonane wewnątrz metody Reset() znajdującej się z skrypcie Storm.lua. Jest to pierwszy krok algorytmu i jego ewentualne niepowodzenie powinno blokować dalsze działania, których efekty byłby niemożliwe do przewidzenia. 21

22 Projekt rozwiązania i opis wybranych elementów implementacji Dalsze kroki dotyczą poszczególnych elementów burzy umieszczonych na schemacie Rys Zdecydowana większość z nich zrealizowana została poprzez wywołania odpowiednich funkcji wewnątrz wspomnianej metody Update. Natomiast pozostałe stanowią połączenie możliwości jakie oferują mechanizmy programowania funkcjonalności silnika CryEngine zarówno w języku skryptowym LUA jak i wysokopoziomowym języku C++. Kolejne podrozdziały przedstawiają implementacje poszczególnych części całości rozwiązania wraz z opisem wybranych mechanizmów oferowanych przez silnik CryEngine wersji Modelowanie deszczu Większość definicji burzy jakie można odnaleźć w literaturze wskazuje deszcz jako jej centralny element. Obiekt imitujący spadanie kropli deszczu stanowi element standardu silnika CryEngine. Realizacja tego punktu założeń projektu nie stanowiła więc dużego problemu. Jedyną czynnością jaką należało wykonać było umożliwienie zdefiniowania przez użytkownika wartości argumentów funkcji obsługi deszczu, których definicje wyglądają następująco: // podstawowe cechy deszczu virtual void SetRainParams( const Vec3 & vcenter, float fradius, float famount, const Vec3 & vcolor); //zaawansowane właściwości virtual void SetRainParams( float freflamount, float ffakeglossiness, float fpuddlesamount, bool braindrops, float fraindropsspeed, float fumbrellaradius); Na Rysunku można zobaczyć, jak wygląda deszcz dla różnych wartości intensywności amount. Dla zwiększenia realizmu końcowego efektu wizualizacji deszczu wykonany został dodatkowy efekt imitujący rozbicie spadającej kropli deszczu, którego realizacja omówiona została w dalszych podrozdziałach. 22

23 Projekt rozwiązania i opis wybranych elementów implementacji Rys Wygląd deszczu w zależności od poziomu intensywności amount Animacje Bardzo ciekawą i przydatną funkcjonalnością silnika CryEngine jest możliwość umieszczania animacji wewnątrz wizualizowanej rzeczywistości. Specjalny obiekt AnimObject, który można odnaleźć w kategorii Physics, wymagania podania pliku opisującego sekwencję przekształceń oraz drugiego zawierającego obiekty biorące udział w animacji. Dzięki dostarczanej przez producentów silnika wtyczce o której mowa w rozdziale dla popularnego programu 3ds Max, możliwe jest eksportowanie animacji przygotowanych w tymże programie do formatu akceptowanego przez CryEngine. Istnieje jednak pewien problem znacząco ograniczający możliwości tworzenia złożonych animacji. Jedynymi przekształceniami wspieranymi przez wspomnianą wtyczkę są rotacje oraz zmiana położenia. Ograniczając się jedynie do tych dwóch przekształceń, w ramach projektu stworzona została animacja rozbicia kropli wody. Jej realizację w ogromnym stopniu ułatwiła procedura reactor umożliwiająca definiowanie właściwości fizycznych i sił zgodnie z obowiązującymi prawami fizyki [11 s.1116]. Należało jednak 23

24 Projekt rozwiązania i opis wybranych elementów implementacji pamiętać o takim doborze obiektów i przekształceń, aby całość animacji była zrozumiała dla silnika CryEngine. Rysunki przedstawiają kluczowe klatki stworzonej animacji rozbicia kropli wody w dużym powiększeniu. Rys Efekt rozbicia kropli wody Mając gotowe pliki animacji konieczne jest dynamiczne umieszczanie jej w ramach symulacji burzy. Dla uniknięcia nadmiernego obciążenia procesora zbędnymi operacjami, które nie wpływają na realizm końcowej symulacji, efekt ten widoczny jest jedynie w ustalonej odległości od gracza. Założenie takie wydaje się być zdroworozsądkowym, gdyż analogicznie do sytuacji obserwowanej w świecie rzeczywistym, dostrzeżenie przebiegu rozbicia kropli możliwe jest jedynie z bardzo małych odległości. 24

25 Projekt rozwiązania i opis wybranych elementów implementacji Metoda SimulateRainDropSplashEffect odpowiedzialna za ten fragment symulacji burzy składa się z czterech podstawowych kroków: 1. sprawdzenie czy gracz znajduję się w obrębie działania burzy, 2. wybór losowego punktu odległego od gracza nie dalej niż zadana odległość, 3. dynamiczne umieszczenie animacji w wybranym punkcie, 4. usunięcie animacji po upłynięciu określonego przedziału czasowego. Warto przyjrzeć się bliżej dwóm ostatnim etapom tego algorytmu. Umieszczenie dowolnej animacji wewnątrz metody napisanej w języku C++ zmusza program do wypełnienia specjalnej struktury SEntitySpawnParams, która jednoznacznie definiuje nowy obiekt lokowany w planszy. Tak jak wspomniano wcześniej obiektem dedykowanym animacjom jest AnimObject, którego wartości parametrów dostępne z poziomu interfejsu graficznego, wypełniane są za pośrednictwem struktury SmartScriptTable. Aby symulacja wyglądała naturalnie konieczne jest zdefiniowanie czasu życia animacji. Gdy czas życia minie konieczne jest usunięcie obiektu z planszy. Z racji powtarzania się tego zagadnienia w wielu miejscach implementowanego projektu jego sposobom rozwiązania poświęcony został następny podrozdział Mechanizm regulatora czasowego Bardzo często spotykanym zdarzeniem obserwowanym w wirtualnych środowiskach jest znikanie przedmiotów. Przykładem takiej sytuacji może być śmierć jednego z bohaterów gry komputerowej, którego ponowne odrodzenie wymaga usunięcia z planszy pozostawionego ciała. Wracając do omawianego rozwiązania symulacji burzy, konieczność eliminacji uprzednio stworzonych obiektów (symulujących animacje rozbicia kropli wody, pioruny itp.) wymagała opracowania uniwersalnego rozwiązania dla wszystkich tego typu sytuacji. Na to zagadnienie można spojrzeć z dwóch istotnie różniących się perspektyw. Jedna z nich zakłada przekazanie odpowiedzialności za usunięcie danego obiektu na niego samego. Musiałby on zostać poinformowany kiedy musi zniknąć, bądź otrzymać w odpowiednim momencie wiadomość o natychmiastowej konieczności zaistnienia takiego zdarzenia. Innym z możliwych podejść jest delegowanie obserwatora, który przejmie omówioną odpowiedzialność nadzorując obiekty mu podległe. Ze względu na dostarczany przez silnik CryEngine mechanizm regulatora czasowego autor niniejszego projektu zdecydował się na pierwszy z omówionych 25

26 Projekt rozwiązania i opis wybranych elementów implementacji sposobów rozwiązania. W dalszej części niniejszego podrozdziału zostanie krótko omówiony ten mechanizm, który wraz z detektorem zdarzeń stanowi bardzo dobre miejsce obsługi analizowanych zdarzeń usunięcia obiektów z planszy. Integralną częścią każdej gry jest obsługa zaistniałych w niej zdarzeń. Dzięki detektorom można uniknąć żmudnego zadania utrzymania stanu obiektu, aktualizowanego w każdym obiegu pętli uruchamiającym funkcję Update. W rzeczywistości takie podejście wprowadzałoby bardzo dużo konsekwencji i prowadziło do tworzenia monstrualnych wielkości diagramów stanów poszczególnych obiektów. Autorzy silnika CryEngine zobligowali programistów tworzących nowe obiekty do obsługi zdarzeń poprzez stworzenie wirtualnej metody ProcessEvent, której implementacja w każdej klasie pochodnej zostanie wymuszona przez kompilator C++. Argumentem tej metody jest struktura SEntityEvent zawierająca wszelkie potrzebne informacje do zidentyfikowania przychodzących zdarzeń. Poniższy fragment kodu prezentuje przykładową implementację metody ProcessEvent: void CThunder::ProcessEvent( SEntityEvent& event ) { } switch(event.event) { case ENTITY_EVENT_RESET: { Reset(); } break; case ENTITY_EVENT_TIMER: { switch(event.nparam[0]) { case CStorm::eTHUNDER_TIMER_LIFETIME: { // wykonaj odpowiednie akcje... } break; } } break; } Jak widać jednym z możliwych rodzajów zdarzeń jest ENTITY_EVENT_TIMER, wchodzący w skład mechanizmu regulatora czasowego. Zdarzenie to generowane jest po upłynięciu czasu, którego długość podana została jako jeden z parametrów funkcji SetTimer dostępnej dla każdego obiektu typu IEntity. Analogiczna metoda istnieje również na poziomie języka skryptowego LUA, tak że zdarzenia mogą być obsługiwane także tutaj. Podsumowując możliwe jest ustawienie regulatora czasowego (ang. timer) dla obiektu i obsługę tego zdarzenia w przytoczonej funkcji. Jest to najwygodniejsze 26

27 Projekt rozwiązania i opis wybranych elementów implementacji rozwiązanie dla klas, które tworzone są przez programistę od samego początku. Niestety podejście to wymagałoby ingerencji w implementację klasy AnimObject zdefiniowanej już w silniku CryEngine i wymuszenie obsługi dodatkowego zdarzenia, czego konsekwencją byłoby zniszczenie tego obiektu. Tak nieeleganckie podejście wymaga znalezienia dla tego typu przypadków innego rozwiązania. Z pomocą przychodzi możliwość definiowana własnych słuchaczy zdarzeń. W przypadku sytuacji związanych z obiektami należy zwrócić uwagę na klasę abstrakcyjną IEntityEventListener, której klasy pochodne zdolne są do nasłuchiwania przychodzących zdarzeń. Poniższy fragment kodu przedstawia szkielet klasy zaimplementowanej na potrzeby niniejszej pracy: class IEntityTimer : public IEntityEventListener { public: enum IEntityTimerEnum { eentity_timer_lifetime }; = 0x1113 IEntityTimer(IEntity *pent, int time) { genv->pentitysystem->addentityeventlistener( pent->getid(), ENTITY_EVENT_TIMER, this); pent->settimer(ientitytimerenum::eentity_timer_lifetime, time); } ~IEntityTimer(void) { genv->pentitysystem->removeentityeventlistener( pent->getid(), ENTITY_EVENT_TIMER, this); } private: void OnEntityEvent( IEntity *pentity, SEntityEvent &event ); }; IEntity * pent; Jak widać konstruktor obiektu rejestruje samego siebie jako nowego słuchacza zdarzeń dla obiektu pent i wymusza wystąpienie zdarzenia po upływie czasu, który również jest jednym z argumentów tego konstruktora. Definicja metody OnEntityEvent rejestrując moment zakończenia pracy regulatora czasowego usuwa obiekt pent z systemu obiektów, jednocześnie wywołując destruktor słuchacza. W ramach destruktora zapewnione jest usunięcie słuchacza z grona odbiorców zdarzeń. Kolejny przykład 27

28 Projekt rozwiązania i opis wybranych elementów implementacji prezentuje prostotę obsługi omówionej metody rozwiązania problemu dynamicznego usuwania obiektów z planszy: IEntity* explosionfire; //... new IEntityTimer(someObj,500); 4.4. Błyski wraz z piorunami Następnym elementem projektu symulacji burzy, jako ilustracji możliwości rozbudowy silnika CryEngine, są błyski towarzyszące temu zjawisku. Realizacja tego punktu wymagań projektu obrazuje możliwości programowania hybrydowego w ramach tegoż silnika. W pierwszej części tego rozdziału omówione zostały sposoby integracji pomiędzy językami LUA oraz C++. Praktyczne wykorzystanie nowo poznanej wiedzy prezentują dalsze podrozdziały na przykładzie implementacji wyładowań atmosferycznych, złożonych z błysków oraz towarzyszących im piorunów Integracja pomiędzy LUA oraz C++ Niezwykle istotne dla wykorzystania pełni potencjału silnika CryEngine jest poznanie możliwości współpracy fragmentów kodu napisanych w językach C++ oraz LUA. Praktyczne wykorzystanie programowania mieszanego może istotnie wpływać na wydajność wybranych, newralgicznych części działania algorytmu. Poza tym łączenie istniejących funkcjonalności przyśpiesza budowanie aplikacji bez konieczności powielania implementacji jednego algorytmu w wielu językach programowania. CryScriptSystem to abstrakcyjna, wirtualna maszyna LUA dostępna w ramach silnika CryEngine. Jej implementacja wspiera programowanie w języku LUA wersji 5 i zapewnia następujące funkcjonalności [4]: wywoływanie funkcji skryptowych, wystawianie zmiennych i funkcji zaimplementowanych w języku C++ na potrzeby skryptów LUA, tworzenie tablic skryptów zapisanych w pamięci maszyny wirtualnej. W celu udostępnienia zmiennych oraz funkcji zaimplementowanych w języku C++ konieczne jest stworzenie nowej klasy pochodnej, dziedziczącej po klasie bazowej CScriptableBase, która zapewnia większość funkcjonalności. Przykładowa deklaracja klasy może wyglądać następująco: 28

29 Projekt rozwiązania i opis wybranych elementów implementacji class CScriptExtension_Game : public CScriptableBase { public: CScriptExtension_Game( ISystem* psystem ); virtual ~CScriptExtension_Game() {} }; int SomeFunc(IFunctionHandler* fh, char* ptext); Wewnątrz konstruktora tej klasy musi być zawarty kod rejestrujący poszczególne metody w danej przestrzeni nazw. Dzięki akcjom zaprezentowanym wewnątrz poniższego kodu możliwe jest wywołanie nowej metody SomeFunc wewnątrz skryptu LUA z przestrzeni nazw Game (Przykładowo: Game.GameLog("message to transfer"); ). Init(pSystem->GetIScriptSystem(), psystem); SetGlobalName("Game"); #undef SCRIPT_REG_CLASSNAME #define SCRIPT_REG_CLASSNAME &CScriptBind_Game:: SCRIPT_REG_TEMPLFUNC(SomeFunc, "text"); Udostępnianie wartości stałych zdefiniowanych na poziomie języka C++ umożliwia metoda IScriptSystem::SetGlobalValue(), której przykład użycia zaprezentowano poniżej: genv->pscriptsystem->setglobalvalue("some_const", SOME_CONST); Komunikacja w stronę przeciwną prowadzona jest za pośrednictwem specjalnej struktury IScriptTable reprezentującej wszystkie tablice i zmienne wykorzystywane w danym skrypcie LUA. Dostęp do niej możliwy jest dzięki analogicznej metodzie IScriptSystem::GetGlobalValue(). Poza tym zdefiniowany został dla programistów zbiór specjalistycznych funkcji dedykowanych konkretnym zastosowaniom. Przykładem jest rozgłaszanie zdarzeń zarejestrowanych przez algorytm zaimplementowany w języku skryptowym dzięki funkcji BroadcastEvent Błyski Przykład realizacji błysków towarzyszących burzy doskonale obrazuje otwartość silnika na różnorodność języków programowania i szeroką gamę funkcjonalności dostępnej dla programistów LUA. Symulacja błysków spełniających założenia stawiane projektowanemu zjawisku przebiega według następującego algorytmu: 29

30 Projekt rozwiązania i opis wybranych elementów implementacji 1. Wylosuj strefę wystąpienia błysku z zadanymi prawdopodobieństwami. 2. Uaktualnij parametry nieba. 3. Określ opóźnienie pojawienia się pioruna towarzyszącego błyskowi oraz długość trwania błysku. 4. Ustaw regulator czasowy na wystąpienie pioruna i przywrócenia początkowych parametrów nieba. 5. Zasymuluj piorun. Kroki 1 4 zaimplementowane zostały wewnątrz pliku Storm.lua, który następnie przekazuje odpowiedzialność obsługi obiektów pioruna metodom klasy Storm języka C++. Zaletą takiego podziału jest dostępność specjalistycznych funkcji w konkretnych przestrzeniach nazw. Metoda implementująca powyższy algorytm uruchamiana jest wewnątrz funkcji Update z prawdopodobieństwem odpowiadającym zadanej przez użytkownika częstotliwości wystąpienia błysków. Drugi krok algorytmu wykorzystuje wbudowaną w silnik metodę System.SetSkyHighlight uaktualniającą podstawowe parametry wyglądu nieba. Jak widać mimo bardzo konkretnie sprecyzowanych oczekiwań istnieje odpowiednia funkcja dostępna dla programistów LUA. Pełny spis wyspecjalizowanych funkcji LUA silnika CryEngine dostępny jest na stronie producenta i stanowi obowiązkową lekturę dla osób implementujących kolejne fragmentu funkcjonalności w tymże języku. Dla potwierdzenia powyższej opinii kolejny przykład, wykorzystany wewnątrz omawianej symulacji burzy, prezentuje łatwość z jaką możliwe jest odtwarzanie towarzyszących jej dźwięków: function Thunder:initSounds() end self.sounds[0] = "Game/Sounds/SomeThunderSound.mp2"; self.sounds[1] = "Game/Sounds/AnotherThunderSound.mp2"; function Thunder:OnReset() end if( self.bsound == 1 ) then local thundersound = self.sounds[random(0,1)]; self:playsoundevent(thundersound, {x=0,y=0,z=0}, {x=0,y=0,z=0}, SOUND_3D, 0, SOUND_SEMANTIC_EXPLOSION); end 30

31 Projekt rozwiązania i opis wybranych elementów implementacji Płynne przejście wykonywania algorytmu z poziomu skryptów LUA do implementacji ostatniego kroku omawianego algorytmu, napisanej w języku C++, odbywa się za pośrednictwem mechanizmu rozgłaszania zdarzeń, przedstawionego w poprzednim podrozdziale. Metoda obsługi regulatora czasowego OnTimer rozgłasza trzy rodzaje polecenia symulacji pioruna w zależności od strefy jego wystąpienia. Z drugiej strony nasłuchująca funkcja obsługi zdarzeń omówiona wcześniej ProcessEvent wykrywając takie polecenie rozpoczyna procedurę symulacji piorunów. Wadą tego mechanizmu jest to, że identyfikatorem zdarzenia jest łańcuch znaków alfanumerycznych generujący potencjalne problemy wynikające z różnych sposobów kodowania znaków Pioruny Symulacja pioruna zaimplementowana w języku C++ rozpoczyna się od losowego wybrania miejsca uderzenia wewnątrz strefy, jednoznacznie określonej przez przechwycone zdarzenie rozgłaszane z poziomu języka LUA. Dalsze czynności polegają na umieszczeniu obiektu symulującego piorun w tym miejscu wraz z uzupełnieniem odpowiadającej mu tablicy stanu. Zadanie dynamicznego wstawiania obiektu do wirtualnego środowiska jest na tyle istotną i niezwykle często powtarzającą się czynnością, że zostanie ono szczegółowo zaprezentowane na przykładzie omawianych piorunów. Do reprezentacji pojedynczego pioruna wykorzystano klasę CThunder, której bazę stanowi wielokrotnie przytaczana CGameObjectExtensionHelper. Analogicznie do klasy CStorm posiada ona odpowiadający jej skrypt Thunder.lua stanowiący zbiór parametrów pioruna. Metoda SpawnEntity umożliwiająca dynamiczne umieszczanie obiektów w mapie wymaga podania uzupełnionej struktury typu SEntitySpawnParams. Polami na które należy zwrócić szczególną uwagę są: vposition miejsce umiejscowienia obiektu, pclass klasa wstawianego obiektu. W przypadku piorunów poszukiwaną klasą jest oczywiście wspomniana CThunder. Następnie uzupełniana jest kolejna struktura, która odpowiada tablicy parametrów tworzonego obiektu, a mianowicie SmartScriptTable. Poprawne stworzenie obiektu pioruna wymaga wskazania w niej modelu obrazującego piorun (zamodelowane przykłady przedstawia Rysunek 4.3.3), wraz z pozostałymi parametrami takimi jak np. wymuszenie destrukcji kolizyjnych obiektów. Dla zwiększenia odczucia realizmu symulowanych 31

32 Projekt rozwiązania i opis wybranych elementów implementacji piorunów są one losowo skalowane oraz rotowane wokół pionowej osi Z. Całość zaś pokrywana jest samoświecącym białą barwą materiałem thunder_light. Dodatkowe sprawdzenie typu materiału obiektu kolizyjnego pozwala na symulację czerwonej poświaty podczas uderzenia w metalowy przedmiot. Rys Modele piorunów Fragmentu kodu odpowiedzialny za dynamiczne umiejscawianie obiektu pioruna prezentuje się następująco: void CStorm::simulateThunder(int zonenumber) { SEntitySpawnParams params; params.vposition= RandPlace(); params.pclass = genv->pentitysystem-> GetClassRegistry()->FindClass("Thunder"); IEntity* propeentity = genv->pentitysystem->spawnentity(params, false); if (propeentity) { // ustaw paramtery obiektu SmartScriptTable tableentityproperties; propeentity->getscripttable()->getvalue( "Properties", tableentityproperties); params.ppropertiestable = tableentityproperties; if (tableentityproperties->havevalue("object_model")) tableentityproperties->setvalueany("object_model", "Game/Objects/thunderbolts/lightning2.cgf"); } if (tableentityproperties->havevalue("bdestroy")) tableentityproperties->setvalueany("bdestroy", 1); genv->pentitysystem->initentity(propeentity, params); } else { GameWarning("Blad tworzenia pioruna"); } 32

33 Projekt rozwiązania i opis wybranych elementów implementacji W momencie inicjalizacji obiektu dalsza obsługa jego zachowania kontrolowana jest przez odpowiadający mu skrypt LUA. Zatem możliwe są płynne przejścia pomiędzy LUA oraz C++ w obu kierunkach Wiatr jako poprawa funkcjonalności silnika Pomimo wielu zalet silnik CryEngine, będący przedmiotem zainteresowania niniejszej pracy, posiada również szereg niedopracowanych zagadnień. Dla produktu firmy Crytek, jak i innych dynamicznie rozwijanych projektów, zgłoszenia błędów oraz towarzyszące im liczne poprawki to rzecz w zupełności naturalna. Część błędów implementacji jest stale wykrywana podczas testów funkcjonalnych nowych części silnika oraz regresji wskazujących utratę poprawności działania wybranych fragmentów funkcjonalności. Zatem kolejne wersje silnika CryEngine oprócz jego rozbudowy przynoszą także eliminacje błędów zgłaszanych przez samych użytkowników. W zależności od typu projektu, którego realizacja opiera się na CryEngine ie dokładnie testowane są jego poszczególne fragmenty. Przykładowa rozbudowa o zjawisko naturalne jakim jest burza wykazała brak poprawności działania funkcji SetWind odpowiedzialnej za imitację wiatru. Czas trwania procesu zgłoszenia problemu i oczekiwania na kolejną wersję z nadzieją na jego naprawę był nieakceptowalny dla zachowania terminów realizacji omawianego projektu. Szczęśliwie implementacja własnej wersji wiatru nie nastręczała istotnych problemów. Wśród licznego zbioru funkcji oferowanych przez silnik znajdują się bowiem dwie bardzo przydatne w tym przypadku: GetEntitiesInBox oraz Action. Funkcja GetEntitiesInBox, której argumenty definiują prostokątny obszar przeszukiwań, rodzaj oraz maksymalną ilość elementów uzupełnia dodatkowo przekazaną listę obiektami spełniającymi zadane warunki, jednocześnie znajdujące się wewnątrz tegoż obszaru. Kolejnym krokiem algorytmu pozorowania wiatru musi być symulacja oddziaływania jego siły na poszczególne obiekty wyłonionego zbioru. Metoda Action dostępna dla każdego obiektu typu IEntity wymaga przekazania struktury jednoznacznie identyfikującej wykonanie zamierzonej akcji. Jedną z akceptowalnych jest struktura pe_action_impulse, której pole impulse typu Vec3 określa kierunek oraz długość wektora impulsu jaki zostanie przyłożonym do danego obiektu. Poznanie metody Action wraz z zestawem akceptowalnych struktur akcji otwiera przed projektantami gier szerokie możliwości oddziaływania na obiekty znajdujące się wewnątrz planszy. Dla utrwalenia istoty tego tematu przedstawiono poniżej fragment 33

34 Projekt rozwiązania i opis wybranych elementów implementacji krótko omówionej metody symulującej działanie wiatru, wraz z dodatkowymi komentarzami: void CStorm::SimulateWind() { //... IPhysicalEntity *plistbuf[32], **pplist = plistbuf; // wyłonienie elementów objętych działaniem wiatru int numentities = genv->pphysicalworld->getentitiesinbox( wpos-checkoffset,wpos+checkoffset,pplist,ent_all,1024); for (int i=0; i<numentities; ++i) { EntityId id = ppworld->getphysicalentityid(pplist[i]); planszy // sprawdzenie czy obiekt ma fizyczną reprezentację na IPhysicalEntity *ppent = genv->pphysicalworld-> GetPhysicalEntityById(id); if (NULL!= ppent) { // akcja symulujaca impuls pe_action_impulse imp; imp.impulse = *currwinddirection; } } } // wymuszenie wykonania akcji ppent->action(&imp); Efektem działania takiego podejścia jest realistycznie wyglądające oddziaływanie na obiekty znajdujące się w obszarze działania burzy wraz z płynną zmianą jego kierunku. Dodatkowym efektem zwiększającym naturalność odbioru symulacji są losowe podmuchy, których prawdopodobieństwo wystąpienia jest wartością jednego z parametrów określanych przez użytkownika Problemy nierozwiązane W tym rozdziale opisane zostały problemy, których niestety nie udało się rozwiązać. Większość zaistniałych kłopotów wynika z ograniczeń dostępności wybranych części kodu silnika CryEngine. Próba uzyskania efektu spływania kropli wody po przezroczystych okularach, obserwowanych z pierwszoosobowej perspektywy gracza, omówiona została w punkcie Punkt opisuje zaistniały problem wydajnościowy występujący podczas złożonej animacji rozbicia spadającej kropli deszczu. 34

35 Projekt rozwiązania i opis wybranych elementów implementacji Problem spływania kropli wody po twarzy gracza Ciekawym efektem towarzyszącym symulacji burzy byłaby dodatkowa interakcja z postacią znajdującą się w obrębie jej oddziaływania. Wszyscy gracze oglądający świat przedstawiony oczami bohatera (z perspektywy pierwszej osoby) mieliby wrażenie spływania wody po okularach zaraz po wejściu w obszar burzy. Podobny efekt widoczny jest już w silniku CryEngine w chwili opuszczania przez gracza zbiornika z wodą (np. rzeki). Analogiczne odtworzenie podobnego odczucia okazało się jednak niemożliwym. Producenci silnika zastrzegli sobie prawa do tej części kodu implementacji, która jest odpowiedzialna za rysowanie widoku pierwszoosobowej perspektywy. Próba ominięcia tego fragmentu znacząco komplikowałaby algorytm i z tego powodu została pominięta Napotkane problemy wydajnościowe Innym problemem, jaki stawia przed projektantami silnik CryEngine jest ograniczenie akceptowanych transformacji animacji do rotacji i przesunięcia. Niestety z tego powodu duże kłopoty przysparzało zasymulowanie animacji rozbicia kropli deszczu połączonej z efektem rozchodzenia się kręgów wody w kałużach. Zaproponowane przez autora niniejszej pracy rozwiązanie polegające na połączeniu standardowej animacji rozbicia kropli wody z pojawieniem się animowanej tekstury imitującej rozchodzące się kręgi wody znacząco wpłynęło na wydajność całej symulacji. Z tego powodu konieczne było zrezygnowanie z tej dodatkowej animacji. Należy jednak pamiętać o istnieniu łatwych w tworzeniu animowanych tekstur, których przykład zaprezentowany został na Rysunku

36 Projekt rozwiązania i opis wybranych elementów implementacji Rys Animowana tekstura kręgów wody 36

37 Ocena rozwiązania 5. Ocena rozwiązania Weryfikacja jakości rozwiązania symulacji burzy, jako ilustracji możliwości rozbudowy silnika CryEngine, może być wyrażona jedynie poprzez subiektywne oceny użytkowników. Podrozdział 5.1 stanowi zbiór zebranych opinii i odczuć osób, którym została przestawiona końcowa wersja burzy. Kolejny podrozdział stanowi ocenę złożoności procesu rozbudowy silnika CryEngine przedstawioną przez autora niniejszej pracy Jakość symulacji Efekty uzyskane w końcowych symulacjach wyglądają naturalnie, jeżeli burza obserwowana jest z dużej odległości. Niestety bliższe spojrzenie na poszczególne elementy symulacji odkrywa istotne niedoskonałości. Zasadniczą jest ograniczony zbiór animacji rozbicia kropli wody. Animacje te powinny być generowane na nowo dla każdego przypadku. Niestety jest to niezwykle złożony problem, który mógłby stanowić odrębny temat pracy dyplomowej. Ponadto ograniczenia wynikające z założeń wbudowanego mechanizmu obsługi animacji prawdopodobnie wymagałyby jego nowej, autorskiej implementacji. Istotną sprawą dotyczącą spadających kropli deszczu jest również brak ich odzwierciedlenia na powierzchni generowanych kałuż. Te dwa oddzielne byty musiałyby być ze sobą ściśle powiązane. Brak dostępności fragmentu kodu źródłowego silnika odpowiedzialnego za efekt kałuż stanowi poważny kłopot naprawy tego artefaktu. 37

38 Ocena rozwiązania Rys. 5.1 Porównanie błysku z zewnątrz (A) i wnętrza burzy (B) Na rysunku 5.1 przedstawione zostały dwa obrazki przedstawiające błysk towarzyszący piorunom widziany spoza obszaru burzy (A) oraz w jej wnętrzu (B). Jasność efektu obserwowana wewnątrz burzy jest zbyt intensywna. Na górnym rysunku łatwo jest dostrzec przybliżoną lokalizację wyładowania atmosferycznego. Na dolnym rysunku efekt jest na tyle rozmyty, że trudno wyróżnić jakiekolwiek kształty, a całość wygląda sztucznie. Przyczyną powstawania tego artefaktu jest zbyt wysoki współczynnik załamania światła przez krople deszczu, który został ustalony na stałe przez producentów silnika. W rozdziale 4.5 omówiona została implementacja wiatru. Wykonane testy symulacji burzy w zróżnicowanych środowiskach wykazały brak wpływu wiatru na część roślinności. Dokładna analiza problemu wykazała uproszczony sposób implementacji obiektów typu Vegetation. Założenie jakie towarzyszyło ich powstawaniu redukowało ich interakcję z innymi obiektami jedynie do wykrywania kolizji. Niemożliwe okazało się więc wykonywanie na nich jakichkolwiek złożonych akcji, w tym wymuszenia impulsu. 38

39 Ocena rozwiązania 5.2. Ocena złożoności procesu rozbudowy silnika Przedstawiony proces rozbudowy silnika CryEngine o nowy obiekt rozpoczął się od opracowania koncepcji wyglądu całego zjawiska. Zdefiniowane założenia były stopniowo weryfikowane w czasie trwania implementacji. Poziom skomplikowania silnika umożliwia jego swobodną analizę. Natomiast czas tworzenia nowych obiektów jest ściśle uzależniony od stopnia znajomości silnika i procesu jego rozbudowy. Patrząc na symulację jako złożenie poszczególnych elementów można powiedzieć, że zabrakło w niej kilku szczegółów. Całość jednak prezentuje się realistycznie i stanowi dobrą podstawę do dalszego rozwoju. 39

40 Podsumowanie 6. Podsumowanie W ramach niniejszej pracy przedstawiona została możliwość rozbudowy silnika CryEngine. Jako przykładową symulację zjawiska naturalnego wykorzystującą omawiany silnik wybrano burzę. Zaprezentowana technika jej realizacji była celowo dobrana tak, aby obejmowała najważniejsze fragmenty dostępnej części kodu, możliwe do szeroko pojętej rozbudowy. Przedstawiony został schemat budowy silnika wraz z wybranymi mechanizmami. Ponadto przybliżone zostały podstawowe aspekty programowania hybrydowego oraz współpracy silnika z popularnym oprogramowaniem Autodesk 3ds Max. Niestety przy dynamicznym rozwoju silnika, jest on obecnie słabo udokumentowany z punktu widzenia programistów. Dokumentacja dostępna na oficjalnej stronie producenta opisuje tylko podstawowe informacje dotyczące możliwości jego rozbudowy, które ponadto zostały wielokrotnie modyfikowane. Głównym źródłem wiedzy pozostaje więc prężnie rozwijane forum poświęcone silnikowi oraz przede wszystkim umiejętność analizowania jego kodu. W dalszej części pracy zaprezentowaną symulację burzy można rozbudować na wiele sposobów. Poza dodatkowymi efektami wizualnymi, mechanizm aktualizacji stanu obiektu może być rozszerzony w taki sposób, aby uwzględniał złożoną interakcję z innymi zjawiskami naturalnymi. Umieszczona w ramach większego programu mogłaby znaleźć szerokie zastosowania badań zachowania ludzi w razie nagłych zmian pogodowych. Stworzenie autorskiego mechanizmu destrukcji obiektów mogłoby stanowić kolejne udoskonalenie dla silnika CryEngine 3 oraz być tematem pracy magisterskiej. Kontynuacja analizy tego bogatego silnika może odkryć kolejne możliwości poprawy efektów jego działania. Projektowanie wirtualnych rzeczywistości będących odzwierciedleniem naturalnego środowiska stało się ostatnio bardzo popularne. Coraz częściej producenci analizując oczekiwania graczy odchodzą od surrealistycznych przestrzeni starając się możliwie dokładnie odwzorować zachowanie natury. Silnik CryEngine z całą pewnością na długo pozostanie trafnym wyborem zarówno dla złożonych projektów, jak również jako doskonałe narzędzie szkolenia młodych adeptów programowania wirtualnych środowisk. 40

41 7. Bibliografia 1. D. Tracy, S. Tracy. CryENGINE 3 Cookbook. Pack Publishing, S. Tracy, P. Reindell. CryENGINE 3 Game Development Beginner's Guide. Pack Publishing, Grafika komputerowa 4. CryEngine 3 dokumentacja, Integracja pomiędzy LUA oraz C Artykuł prezentujący silniki gier ilniki_gier_cz._ html 6. Oficjalna dokumentacja CryEngine Definicja silnika gier 8. CryEngine - licencje 9. Porównanie silników gier CryEngine 3 dokumentacja, Instalacja wtyczek orter+plugins 11. Kelly L. Murdock. 3ds Max 8. Biblia. Helion, CryEngine 3 dokumentacja, Struktura skryptów +Script+Entity 41

42 Zawartość płyty CD 8. Zawartość płyty CD Na załączonej płycie CD znajdują się: tekst pracy w pliku Symulacja zjawiska naturalnych CryEngine.pdf, kod źródłowy nowo dodanych oraz zmodyfikowanych klas silnika CryEngine (w katalogu GameDll), skrypty LUA stworzone w ramach realizowanego projektu (w katalogu Skrypty), obiekty i animacje projektu stworzone w programie 3ds Max 2010 (w katalogu Obiekty i animacje), pozostałe obiekty dodane do silnika CryEngine (w katalogu Pozostałe obiekty), filmy prezentujące projektowane zjawisko naturalne przy zróżnicowanych wartościach parametrów (w katalogu Filmy), przykładowe rozwiązania zadań laboratoryjnych (w katalogu Laboratoria). 42

43 Załączniki 9. Załączniki Załącznik A. Zapoznanie ze środowiskiem CryEngine 3 Free SDK 1. Wstęp CryEngine 3 to silnik do gier umożliwiający projektantowi bardzo dużą swobodę w budowaniu własnych przestrzeni, w których toczona będzie rozgrywka. Studio developerskie Crytek odpowiedzialne za rozwój silnika dostarcza edytor graficzny CryENGINE 3 Sandbox Editor pozwalający na projektowanie wspomnianych plansz w sposób wysoce przyjazny użytkownikowi. Dzięki niemu stworzenie własnej gry jest możliwe bez znajomości języków programowania. Znając najbardziej efektowne gry stworzone dzięki silnikowi CryEngine można wysnuwać marzenia o stworzeniu własnej gry, która mogłaby podbić serca wszystkich graczy. Należy mieć świadomość, że zostały one stworzone przez liczne zespoły programistów i grafików pracujących nad jednym projektem przez wiele miesięcy. Dzięki edytorowi Sandbox wchodzącego w skład większego pakietu CryEngine 3 Free SDK możliwe jest wykonanie autorskiego projektu w domowych warunkach. Skrypt ten stanowi wprowadzenie w temat tworzenia scen w programie CryEngine 3 Sandbox i podzielony został na dwie części. Pierwsza z nich omawia wygląd i organizację interfejsu użytkownika. Druga jest przeglądem dostępnych w programie obiektów oraz instrukcją tworzenia prostej mapy, która jest celem laboratorium. 2. CryEngine 3 Sandbox podstawy Rysunek A.1 prezentuje interfejs użytkownika dostępny w głównym oknie programu. Został on podzielony na pięć zasadniczych części: główny pasek menu, panel poleceń (ang. RollupBar), pasek stanu, konsolę oraz widok tworzonej sceny (ang. Viewport). 43

44 Załączniki Rys. A.1 Interfejs użytkownika 2.1 Główny pasek menu Rysunek A.2 przedstawia organizację głównego paska menu (ang. menu bar). Pozwala on na szybki dostęp użytkownika do licznych funkcji edytora Sandbox. Znajdują się tutaj: obsługa podstawowych operacji wejścia-wyjścia, modyfikacji obiektów znajdujących się w tworzonej scenie (m.in. przesuwanie, skalowanie, łączenie elementów) oraz złożonych modyfikacji terenu i zarządzania materiałami. Całość jest intuicyjna i nie stanowi problemu nawet dla początkujących użytkowników. Rys. A.2 Menu główne 2.2 Widok główny Widok główny stanowi centralną część edytora, która umożliwia podgląd i nawigację tworzonego projektu. Wszystkie nowo dodane obiekty, modyfikacja terenu oraz zmiana nałożonych materiałów renderowanie są w czasie rzeczywistym. Poruszanie się wewnątrz sceny odbywa się za pomocą przycisków W,A,S,D oraz myszy. Przytrzymanie prawego przycisku myszy umożliwia obrót bieżącej kamery, a kombinacja klawiszy CTRL+G pozwala na natychmiastowe przejście do trybu gry. Wyjście ze wspomnianego trybu wymaga naciśnięcia klawisza Escape [1 rozdz. 1]. 44

45 Załączniki 2.3 Panel poleceń Rysunek A.3 pokazuje panel poleceń dostępny z prawej strony ekranu głównego, który został zorganizowany w strukturę drzewiastą rozdzielającą kolejne poziomy poleceń. Rys. A.3 Panel poleceń Pierwsza zakładka zawiera narzędzia tworzenia obiektów, jak również stanowi miejsce wyświetlania i modyfikacji ich właściwości. Wszystkie elementy dostępne w edytorze podzielone są tutaj na grupy, a umieszczanie ich w modelowanej scenie odbywa się na zasadzie przeciągnij i upuść. W wielu przypadkach warto dodatkowo skorzystać z opcji śledzenia terenu przycisk Follow Terrain. Dzięki temu nowo dodawane obiekty automatycznie będą przylegały do terenu mapy. 3. Edycja terenu Teren nowo utworzonej sceny domyślnie jest płaską powierzchnią wody. Niniejszy rozdział przedstawia proceduralne generowanie terenu. Mimo iż nie jest to zawsze właściwe podejście w perspektywie finalnego produktu to stanowi bardzo dobry przykład dla początkujących użytkowników i umożliwia szybką generację prototypu tworzonej mapy [1]. Wybierając ikonę edycji terenu bądź pozycję Edit Terrain z menu Terrain użytkownik może przejść do okna edycji terenu (Rys. A.4). 45

System zarządzający grami programistycznymi Meridius

System zarządzający grami programistycznymi Meridius System zarządzający grami programistycznymi Meridius Instytut Informatyki, Uniwersytet Wrocławski 20 września 2011 Promotor: prof. Krzysztof Loryś Gry komputerowe a programistyczne Gry komputerowe Z punktu

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Laboratorium z przedmiotu Programowanie obiektowe - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia.

Bardziej szczegółowo

SZYBKO ZROZUMIEĆ VISUAL BASIC 2012 Artur Niewiarowski -

SZYBKO ZROZUMIEĆ VISUAL BASIC 2012 Artur Niewiarowski - S t r o n a 2 SZYBKO ZROZUMIEĆ VISUAL BASIC 2012 Artur Niewiarowski - Copyright by Artur Niewiarowski 2013 ISBN: 978-83-937802-0-4 - Artur Niewiarowski Self-Publishing - All rights reserved. Wszelkie prawa

Bardziej szczegółowo

Informatyka I stopień (I stopień / II stopień) Ogólnoakademicki (ogólno akademicki / praktyczny)

Informatyka I stopień (I stopień / II stopień) Ogólnoakademicki (ogólno akademicki / praktyczny) Załącznik nr 7 do Zarządzenia Rektora nr 10/12 z dnia 21 lutego 2012r. KARTA MODUŁU / KARTA PRZEDMIOTU Kod Nazwa Nazwa w języku angielskim Obowiązuje od roku akademickiego 2012/2013 Programy grafiki rastrowej,

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Laboratorium z przedmiotu - zestaw 02 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas i obiektów z wykorzystaniem dziedziczenia. Wprowadzenie teoretyczne.

Bardziej szczegółowo

Komputerowe Systemy Przemysłowe: Modelowanie - UML. Arkadiusz Banasik arkadiusz.banasik@polsl.pl

Komputerowe Systemy Przemysłowe: Modelowanie - UML. Arkadiusz Banasik arkadiusz.banasik@polsl.pl Komputerowe Systemy Przemysłowe: Modelowanie - UML Arkadiusz Banasik arkadiusz.banasik@polsl.pl Plan prezentacji Wprowadzenie UML Diagram przypadków użycia Diagram klas Podsumowanie Wprowadzenie Języki

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

Podstawy Programowania Obiektowego

Podstawy Programowania Obiektowego Podstawy Programowania Obiektowego Wprowadzenie do programowania obiektowego. Pojęcie struktury i klasy. Spotkanie 03 Dr inż. Dariusz JĘDRZEJCZYK Tematyka wykładu Idea programowania obiektowego Definicja

Bardziej szczegółowo

Technologie informacyjne - wykład 12 -

Technologie informacyjne - wykład 12 - Zakład Fizyki Budowli i Komputerowych Metod Projektowania Instytut Budownictwa Wydział Budownictwa Lądowego i Wodnego Politechnika Wrocławska Technologie informacyjne - wykład 12 - Prowadzący: Dmochowski

Bardziej szczegółowo

UML w Visual Studio. Michał Ciećwierz

UML w Visual Studio. Michał Ciećwierz UML w Visual Studio Michał Ciećwierz UNIFIED MODELING LANGUAGE (Zunifikowany język modelowania) Pozwala tworzyć wiele systemów (np. informatycznych) Pozwala obrazować, specyfikować, tworzyć i dokumentować

Bardziej szczegółowo

Informatyka I stopień (I stopień / II stopień) Ogólnoakademicki (ogólno akademicki / praktyczny)

Informatyka I stopień (I stopień / II stopień) Ogólnoakademicki (ogólno akademicki / praktyczny) KARTA MODUŁU / KARTA PRZEDMIOTU Załącznik nr 7 do Zarządzenia Rektora nr 10/12 z dnia 21 lutego 2012r. Kod Nazwa Nazwa w języku angielskim Obowiązuje od roku akademickiego 2012/2013 Programy grafiki rastrowej,

Bardziej szczegółowo

Procesowa specyfikacja systemów IT

Procesowa specyfikacja systemów IT Procesowa specyfikacja systemów IT BOC Group BOC Information Technologies Consulting Sp. z o.o. e-mail: boc@boc-pl.com Tel.: (+48 22) 628 00 15, 696 69 26 Fax: (+48 22) 621 66 88 BOC Management Office

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

WOJSKOWA AKADEMIA TECHNICZNA

WOJSKOWA AKADEMIA TECHNICZNA WOJSKOWA AKADEMIA TECHNICZNA LABORATORIUM ANALIZA I MODELOWANIE SYSTEMÓW INFORMATYCZNYCH Stopień, imię i nazwisko prowadzącego Stopień, imię i nazwisko słuchacza Grupa szkoleniowa mgr inż. Łukasz Laszko

Bardziej szczegółowo

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1 Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja

Bardziej szczegółowo

Informatyka I stopień (I stopień / II stopień) Ogólnoakademicki (ogólno akademicki / praktyczny) kierunkowy (podstawowy / kierunkowy / inny HES)

Informatyka I stopień (I stopień / II stopień) Ogólnoakademicki (ogólno akademicki / praktyczny) kierunkowy (podstawowy / kierunkowy / inny HES) Załącznik nr 7 do Zarządzenia Rektora nr 10/12 z dnia 21 lutego 2012r. KARTA MODUŁU / KARTA PRZEDMIOTU Kod Nazwa Programy grafiki rastrowej, wektorowej i 3d Nazwa w języku angielskim Programs of raster,

Bardziej szczegółowo

OpenAI Gym. Adam Szczepaniak, Kamil Walkowiak

OpenAI Gym. Adam Szczepaniak, Kamil Walkowiak OpenAI Gym Adam Szczepaniak, Kamil Walkowiak Plan prezentacji Programowanie agentowe Uczenie przez wzmacnianie i problemy związane z rozwojem algorytmów Charakterystyka OpenAI Gym Biblioteka gym Podsumowanie

Bardziej szczegółowo

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki Object-oriented programming Najpopularniejszy obecnie styl (paradygmat) programowania Rozwinięcie koncepcji programowania strukturalnego

Bardziej szczegółowo

Tworzenie i obsługa wirtualnego laboratorium komputerowego

Tworzenie i obsługa wirtualnego laboratorium komputerowego Uniwersytet Mikołaja Kopernika Wydział Fizyki, Astronomii i Informatyki Stosowanej Michał Ochociński nr albumu: 236401 Praca magisterska na kierunku informatyka stosowana Tworzenie i obsługa wirtualnego

Bardziej szczegółowo

Programowanie obiektowe - 1.

Programowanie obiektowe - 1. Programowanie obiektowe - 1 Mariusz.Masewicz@cs.put.poznan.pl Programowanie obiektowe Programowanie obiektowe (ang. object-oriented programming) to metodologia tworzenia programów komputerowych, która

Bardziej szczegółowo

Dodatkowo planowane jest przeprowadzenie oceny algorytmów w praktycznym wykorzystaniu przez kilku niezależnych użytkowników ukończonej aplikacji.

Dodatkowo planowane jest przeprowadzenie oceny algorytmów w praktycznym wykorzystaniu przez kilku niezależnych użytkowników ukończonej aplikacji. Spis Treści 1. Wprowadzenie... 2 1.1 Wstęp... 2 1.2 Cel pracy... 2 1.3 Zakres pracy... 2 1.4 Użyte technologie... 2 1.4.1 Unity 3D... 3 2. Sztuczna inteligencja w grach komputerowych... 4 2.1 Zadanie sztucznej

Bardziej szczegółowo

SCENARIUSZ LEKCJI. Streszczenie. Czas realizacji. Podstawa programowa

SCENARIUSZ LEKCJI. Streszczenie. Czas realizacji. Podstawa programowa Autorzy scenariusza: SCENARIUSZ LEKCJI OPRACOWANY W RAMACH PROJEKTU: INFORMATYKA MÓJ SPOSÓB NA POZNANIE I OPISANIE ŚWIATA. PROGRAM NAUCZANIA INFORMATYKI Z ELEMENTAMI PRZEDMIOTÓW MATEMATYCZNO-PRZYRODNICZYCH

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Laboratorium z przedmiotu Programowanie obiektowe - zestaw 03 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas abstrakcyjnych i interfejsów. Wprowadzenie

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

Model referencyjny doboru narzędzi Open Source dla zarządzania wymaganiami

Model referencyjny doboru narzędzi Open Source dla zarządzania wymaganiami Politechnika Gdańska Wydział Zarządzania i Ekonomii Katedra Zastosowań Informatyki w Zarządzaniu Zakład Zarządzania Technologiami Informatycznymi Model referencyjny Open Source dla dr hab. inż. Cezary

Bardziej szczegółowo

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost; Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze

Bardziej szczegółowo

Szablony funkcji i klas (templates)

Szablony funkcji i klas (templates) Instrukcja laboratoryjna nr 3 Programowanie w języku C 2 (C++ poziom zaawansowany) Szablony funkcji i klas (templates) dr inż. Jacek Wilk-Jakubowski mgr inż. Maciej Lasota dr inż. Tomasz Kaczmarek Wstęp

Bardziej szczegółowo

Język Java część 2 (przykładowa aplikacja)

Język Java część 2 (przykładowa aplikacja) Programowanie obiektowe Język Java część 2 (przykładowa aplikacja) Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej pawel.rogalinski @ pwr.wroc.pl Java Java przykładowa

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

MonoGame. Wieloplatformowe gry w C# Mateusz Cicheński

MonoGame. Wieloplatformowe gry w C# Mateusz Cicheński MonoGame Wieloplatformowe gry w C# Mateusz Cicheński Plan prezentacji Założenia Alternatywy Narzędzia Różnice między WP8, ios, Android DEMO Podsumowanie Założenia CEL: Stworzenie wieloplatformowej gry

Bardziej szczegółowo

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery

XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery http://xqtav.sourceforge.net XQTav - reprezentacja diagramów przepływu prac w formacie SCUFL przy pomocy XQuery dr hab. Jerzy Tyszkiewicz dr Andrzej Kierzek mgr Jacek Sroka Grzegorz Kaczor praca mgr pod

Bardziej szczegółowo

Uniwersytet Mikołaja Kopernika. Wydział Matematyki i Informatyki Wydział Fizyki, Astronomii i Informatyki Stosowanej

Uniwersytet Mikołaja Kopernika. Wydział Matematyki i Informatyki Wydział Fizyki, Astronomii i Informatyki Stosowanej Uniwersytet Mikołaja Kopernika Wydział Matematyki i Informatyki Wydział Fizyki, Astronomii i Informatyki Stosowanej Marcin HENRYKOWSKI Nr albumu: 158069 Praca magisterska na kierunku Informatyka Archiwizacja

Bardziej szczegółowo

Zagadnienia (1/3) Data-flow diagramy przepływów danych ERD diagramy związków encji Diagramy obiektowe w UML (ang. Unified Modeling Language)

Zagadnienia (1/3) Data-flow diagramy przepływów danych ERD diagramy związków encji Diagramy obiektowe w UML (ang. Unified Modeling Language) Zagadnienia (1/3) Rola modelu systemu w procesie analizy wymagań (inżynierii wymagań) Prezentacja różnego rodzaju informacji o systemie w zależności od rodzaju modelu. Budowanie pełnego obrazu systemu

Bardziej szczegółowo

Wykład Ćwiczenia Laboratorium Projekt Seminarium

Wykład Ćwiczenia Laboratorium Projekt Seminarium WYDZIAŁ ELEKTRONIKI KARTA PRZEDMIOTU Nazwa w języku polskim Języki programowania Nazwa w języku angielskim Programming languages Kierunek studiów (jeśli dotyczy): Informatyka - INF Specjalność (jeśli dotyczy):

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

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

Szablony funkcji i szablony klas

Szablony funkcji i szablony klas Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2011 Bogdan Kreczmer Niniejszy dokument

Bardziej szczegółowo

PROGRAM MICROSOFT DEVELOPER NETWORK ACADEMIC ALLIANCE MSDN AA

PROGRAM MICROSOFT DEVELOPER NETWORK ACADEMIC ALLIANCE MSDN AA PROGRAM MICROSOFT DEVELOPER NETWORK ACADEMIC ALLIANCE MSDN AA Wydział Matematyczno-Przyrodniczy Szkoła Nauk Ścisłych Koło Naukowe Informatyków FRAKTAL Opracował : Michał Wójcik, II rok MU IiE CZYM JEST

Bardziej szczegółowo

Programowanie obiektowe

Programowanie obiektowe Laboratorium z przedmiotu - zestaw 03 Cel zajęć. Celem zajęć jest zapoznanie z praktycznymi aspektami projektowania oraz implementacji klas abstrakcyjnych i interfejsów. Wprowadzenie teoretyczne. Rozważana

Bardziej szczegółowo

Tester oprogramowania 2014/15 Tematy prac dyplomowych

Tester oprogramowania 2014/15 Tematy prac dyplomowych Tester oprogramowania 2014/15 Tematy prac dyplomowych 1. Projekt i wykonanie automatycznych testów funkcjonalnych wg filozofii BDD za pomocą dowolnego narzędzia Jak w praktyce stosować Behaviour Driven

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

Dokument Detaliczny Projektu Temat: Księgarnia On-line Bukstor

Dokument Detaliczny Projektu Temat: Księgarnia On-line Bukstor Koszalin, 15.06.2012 r. Dokument Detaliczny Projektu Temat: Księgarnia On-line Bukstor Zespół projektowy: Daniel Czyczyn-Egird Wojciech Gołuchowski Michał Durkowski Kamil Gawroński Prowadzący: Dr inż.

Bardziej szczegółowo

Tworzenie oprogramowania

Tworzenie oprogramowania Tworzenie oprogramowania dr inż. Krzysztof Konopko e-mail: k.konopko@pb.edu.pl 1 Tworzenie oprogramowania dla systemów wbudowanych Program wykładu: Tworzenie aplikacji na systemie wbudowanym. Konfiguracja

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

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ), PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ), Program 351203 Opracowanie: Grzegorz Majda Tematyka zajęć 1. Wprowadzenie do aplikacji internetowych

Bardziej szczegółowo

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami. UML a kod w C++ i Javie Projektowanie oprogramowania Dokumentowanie oprogramowania Diagramy przypadków użycia Przewoznik Zarzadzanie pojazdami Optymalizacja Uzytkownik Wydawanie opinii Zarzadzanie uzytkownikami

Bardziej szczegółowo

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej. Polimorfizm jest filarem programowania obiektowego, nie tylko jeżeli chodzi o język C++. Daje on programiście dużą elastyczność podczas pisania programu. Polimorfizm jest ściśle związany z metodami wirtualnymi.

Bardziej szczegółowo

PRZEWODNIK PO PRZEDMIOCIE

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

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

SPIS TREŚCI. Do Czytelnika... 7

SPIS TREŚCI. Do Czytelnika... 7 SPIS TREŚCI Do Czytelnika.................................................. 7 Rozdział I. Wprowadzenie do analizy statystycznej.............. 11 1.1. Informacje ogólne..........................................

Bardziej szczegółowo

Programowanie w języku Python. Grażyna Koba

Programowanie w języku Python. Grażyna Koba Programowanie w języku Python Grażyna Koba Kilka definicji Program komputerowy to ciąg instrukcji języka programowania, realizujący dany algorytm. Język programowania to zbiór określonych instrukcji i

Bardziej szczegółowo

JavaFX. Technologie Biznesu Elektronicznego. Wydział Informatyki i Zarządzania Politechnika Wrocławska

JavaFX. Technologie Biznesu Elektronicznego. Wydział Informatyki i Zarządzania Politechnika Wrocławska JavaFX - wprowadzenie JavaFX Wydział Informatyki i Zarządzania Politechnika Wrocławska Definicja JavaFX - wprowadzenie Definicja Historia JavaFX Script Rich Internet Application JavaFX - rodzina technologii

Bardziej szczegółowo

Koncepcja wirtualnej pracowni GIS w oparciu o oprogramowanie open source

Koncepcja wirtualnej pracowni GIS w oparciu o oprogramowanie open source Koncepcja wirtualnej pracowni GIS w oparciu o oprogramowanie open source Dr inż. Michał Bednarczyk Uniwersytet Warmińsko-Mazurski w Olsztynie Wydział Geodezji i Gospodarki Przestrzennej Katedra Geodezji

Bardziej szczegółowo

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Program, to lista poleceń zapisana w jednym języku programowania zgodnie z obowiązującymi w nim zasadami. Celem programu jest przetwarzanie

Bardziej szczegółowo

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy - Narzędzie Windows Forms - Przykładowe aplikacje 1 Narzędzia Windows Form Windows Form jest narzędziem do tworzenia aplikacji dla

Bardziej szczegółowo

TEMAT : KLASY DZIEDZICZENIE

TEMAT : KLASY DZIEDZICZENIE TEMAT : KLASY DZIEDZICZENIE Wprowadzenie do dziedziczenia w języku C++ Język C++ możliwa tworzenie nowej klasy (nazywanej klasą pochodną) w oparciu o pewną wcześniej zdefiniowaną klasę (nazywaną klasą

Bardziej szczegółowo

PRZEWODNIK PO PRZEDMIOCIE

PRZEWODNIK PO PRZEDMIOCIE Nazwa przedmiotu: Kierunek: Informatyka Rodzaj przedmiotu: moduł specjalności obowiązkowy: Inżynieria oprogramowania, Sieci komputerowe Rodzaj zajęć: wykład, laboratorium MODELOWANIE I SYMULACJA Modelling

Bardziej szczegółowo

The Binder Consulting

The Binder Consulting The Binder Consulting Contents Indywidualne szkolenia specjalistyczne...3 Konsultacje dla tworzenia rozwiazan mobilnych... 3 Dedykowane rozwiazania informatyczne... 3 Konsultacje i wdrożenie mechanizmów

Bardziej szczegółowo

REFERAT PRACY DYPLOMOWEJ

REFERAT PRACY DYPLOMOWEJ REFERAT PRACY DYPLOMOWEJ Temat pracy: Projekt i implementacja środowiska do automatyzacji przeprowadzania testów aplikacji internetowych w oparciu o metodykę Behavior Driven Development. Autor: Stepowany

Bardziej szczegółowo

Dokumentacja aplikacji Szachy online

Dokumentacja aplikacji Szachy online Projekt z przedmiotu Technologie Internetowe Autorzy: Jakub Białas i Jarosław Tyma grupa II, Automatyka i Robotyka sem. V, Politechnika Śląska Przedmiot projektu: Aplikacja internetowa w języku Java Dokumentacja

Bardziej szczegółowo

Politechnika Krakowska im. Tadeusza Kościuszki. Karta przedmiotu. obowiązuje studentów rozpoczynających studia w roku akademickim 2012/2013

Politechnika Krakowska im. Tadeusza Kościuszki. Karta przedmiotu. obowiązuje studentów rozpoczynających studia w roku akademickim 2012/2013 Politechnika Krakowska im. Tadeusza Kościuszki Karta przedmiotu obowiązuje studentów rozpoczynających studia w roku akademickim 01/013 Wydział Fizyki, Matematyki i Informatyki Kierunek studiów: Informatyka

Bardziej szczegółowo

Scenariusz lekcji opartej na programie Program nauczania informatyki w gimnazjum DKW-4014-87/99

Scenariusz lekcji opartej na programie Program nauczania informatyki w gimnazjum DKW-4014-87/99 Scenariusz lekcji opartej na programie Program nauczania informatyki w gimnazjum DKW-4014-87/99 Techniki algorytmiczne realizowane przy pomocy grafiki żółwia w programie ELI 2,0. Przedmiot: Informatyka

Bardziej szczegółowo

Politechnika Krakowska im. Tadeusza Kościuszki. Karta przedmiotu. obowiązuje w roku akademickim 2012/2013. Przedmioty kierunkowe

Politechnika Krakowska im. Tadeusza Kościuszki. Karta przedmiotu. obowiązuje w roku akademickim 2012/2013. Przedmioty kierunkowe Wydział Fizyki, Matematyki i Informatyki Politechnika Krakowska im. Tadeusza Kościuszki Karta przedmiotu obowiązuje w roku akademickim 01/013 Kierunek studiów: Informatyka Forma studiów: Stacjonarne Profil:

Bardziej szczegółowo

Projektowanie gier komputerowych. dr inż. Mariusz Szwoch

Projektowanie gier komputerowych. dr inż. Mariusz Szwoch Projektowanie gier komputerowych dr inż. Mariusz Szwoch Projektowanie gier komputerowych Sem. 7 studiów dziennych Profil dyplomowania: Inteligentne systemy interaktywne Wymiar: wykład 15 h (7 2h+1h) laboratorium

Bardziej szczegółowo

ZMODYFIKOWANY Szczegółowy opis przedmiotu zamówienia

ZMODYFIKOWANY Szczegółowy opis przedmiotu zamówienia ZP/ITS/11/2012 Załącznik nr 1a do SIWZ ZMODYFIKOWANY Szczegółowy opis przedmiotu zamówienia Przedmiotem zamówienia jest: Przygotowanie zajęć dydaktycznych w postaci kursów e-learningowych przeznaczonych

Bardziej szczegółowo

Sieciowe Technologie Mobilne. Laboratorium 2

Sieciowe Technologie Mobilne. Laboratorium 2 Sieciowe Technologie Mobilne Laboratorium 2 Tworzenie wieloplatformowych aplikacji mobilnych przy użyciu biblioteki PhoneGap. Łukasz Kamiński Laboratorium 2 Na dzisiejszym laboratorium skupimy się na implementacji

Bardziej szczegółowo

Diagramy ERD. Model struktury danych jest najczęściej tworzony z wykorzystaniem diagramów pojęciowych (konceptualnych). Najpopularniejszym

Diagramy ERD. Model struktury danych jest najczęściej tworzony z wykorzystaniem diagramów pojęciowych (konceptualnych). Najpopularniejszym Diagramy ERD. Model struktury danych jest najczęściej tworzony z wykorzystaniem diagramów pojęciowych (konceptualnych). Najpopularniejszym konceptualnym modelem danych jest tzw. model związków encji (ERM

Bardziej szczegółowo

Modelowanie jako sposób opisu rzeczywistości. Katedra Mikroelektroniki i Technik Informatycznych Politechnika Łódzka

Modelowanie jako sposób opisu rzeczywistości. Katedra Mikroelektroniki i Technik Informatycznych Politechnika Łódzka Modelowanie jako sposób opisu rzeczywistości Katedra Mikroelektroniki i Technik Informatycznych Politechnika Łódzka 2015 Wprowadzenie: Modelowanie i symulacja PROBLEM: Podstawowy problem z opisem otaczającej

Bardziej szczegółowo

Wykład 5: Klasy cz. 3

Wykład 5: Klasy cz. 3 Programowanie obiektowe Wykład 5: cz. 3 1 dr Artur Bartoszewski - Programowanie obiektowe, sem. 1I- WYKŁAD - podstawy Konstruktor i destruktor (część I) 2 Konstruktor i destruktor KONSTRUKTOR Dla przykładu

Bardziej szczegółowo

Projektowanie baz danych za pomocą narzędzi CASE

Projektowanie baz danych za pomocą narzędzi CASE Projektowanie baz danych za pomocą narzędzi CASE Metody tworzenia systemów informatycznych w tym, także rozbudowanych baz danych są komputerowo wspomagane przez narzędzia CASE (ang. Computer Aided Software

Bardziej szczegółowo

OfficeObjects e-forms

OfficeObjects e-forms OfficeObjects e-forms Rodan Development Sp. z o.o. 02-820 Warszawa, ul. Wyczółki 89, tel.: (+48-22) 643 92 08, fax: (+48-22) 643 92 10, http://www.rodan.pl Spis treści Wstęp... 3 Łatwość tworzenia i publikacji

Bardziej szczegółowo

Webowy generator wykresów wykorzystujący program gnuplot

Webowy generator wykresów wykorzystujący program gnuplot Uniwersytet Mikołaja Kopernika Wydział Fizyki, Astronomii i Informatyki Stosowanej Marcin Nowak nr albumu: 254118 Praca inżynierska na kierunku informatyka stosowana Webowy generator wykresów wykorzystujący

Bardziej szczegółowo

PRZEWODNIK PO PRZEDMIOCIE

PRZEWODNIK PO PRZEDMIOCIE Nazwa przedmiotu: Kierunek: Informatyka Rodzaj przedmiotu: obowiązkowy w ramach specjalności: Programowanie aplikacji internetowych Rodzaj zajęć: laboratorium PRZEWODNIK PO PRZEDMIOCIE I KARTA PRZEDMIOTU

Bardziej szczegółowo

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego. Umiejętność czytania oraz tworzenia diagramów klas UML jest podstawą w przypadku zawodu programisty. Z takimi diagramami będziesz spotykał się w przeciągu całej swojej kariery. Diagramy klas UML są zawsze

Bardziej szczegółowo

OPROGRAMOWANIE WSPOMAGAJĄCE ZARZĄDZANIE PROJEKTAMI. PLANOWANIE ZADAŃ I HARMONOGRAMÓW. WYKRESY GANTTA

OPROGRAMOWANIE WSPOMAGAJĄCE ZARZĄDZANIE PROJEKTAMI. PLANOWANIE ZADAŃ I HARMONOGRAMÓW. WYKRESY GANTTA OPROGRAMOWANIE WSPOMAGAJĄCE ZARZĄDZANIE PROJEKTAMI. PLANOWANIE ZADAŃ I HARMONOGRAMÓW. WYKRESY GANTTA Projekt to metoda na osiągnięcie celów organizacyjnych. Jest to zbiór powiązanych ze sobą, zmierzających

Bardziej szczegółowo

Dokumentacja projektu QUAIKE Architektura oprogramowania

Dokumentacja projektu QUAIKE Architektura oprogramowania Licencjacka Pracownia Oprogramowania Instytut Informatyki Uniwersytetu Wrocławskiego Jakub Kowalski, Andrzej Pilarczyk, Marek Kembrowski, Bartłomiej Gałkowski Dokumentacja projektu QUAIKE Architektura

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

Specjalność Systemy Aplikacyjne Grafiki i Multimediów. Wydział Informatyki, Politechnika Białostocka

Specjalność Systemy Aplikacyjne Grafiki i Multimediów. Wydział Informatyki, Politechnika Białostocka Specjalność Systemy Aplikacyjne Grafiki i Multimediów Wydział Informatyki, Politechnika Białostocka 1 2/4/2013 Agenda Sylwetka absolwenta Siatka zajęć Wykorzystanie grafiki komputerowej Znaczenie gospodarcze

Bardziej szczegółowo

Usługi analityczne budowa kostki analitycznej Część pierwsza.

Usługi analityczne budowa kostki analitycznej Część pierwsza. Usługi analityczne budowa kostki analitycznej Część pierwsza. Wprowadzenie W wielu dziedzinach działalności człowieka analiza zebranych danych jest jednym z najważniejszych mechanizmów podejmowania decyzji.

Bardziej szczegółowo

Monitoring procesów z wykorzystaniem systemu ADONIS

Monitoring procesów z wykorzystaniem systemu ADONIS Monitoring procesów z wykorzystaniem systemu ADONIS BOC Information Technologies Consulting Sp. z o.o. e-mail: boc@boc-pl.com Tel.: (+48 22) 628 00 15, 696 69 26 Fax: (+48 22) 621 66 88 BOC Management

Bardziej szczegółowo

Automatyczne tworzenie trójwymiarowego planu pomieszczenia z zastosowaniem metod stereowizyjnych

Automatyczne tworzenie trójwymiarowego planu pomieszczenia z zastosowaniem metod stereowizyjnych Automatyczne tworzenie trójwymiarowego planu pomieszczenia z zastosowaniem metod stereowizyjnych autor: Robert Drab opiekun naukowy: dr inż. Paweł Rotter 1. Wstęp Zagadnienie generowania trójwymiarowego

Bardziej szczegółowo

1. WYMAGANIA WSTĘPNE W ZAKRESIE WIEDZY, UMIEJĘTNOŚCI I INNYCH KOMPETENCJI

1. WYMAGANIA WSTĘPNE W ZAKRESIE WIEDZY, UMIEJĘTNOŚCI I INNYCH KOMPETENCJI KARTA PRZEDMIOTU przedmiotu Stopień studiów i forma Rodzaj przedmiotu Grupa kursów Zaawansowane techniki analizy systemowej oparte na modelowaniu warsztaty Studia podyplomowe Obowiązkowy NIE Wykład Ćwiczenia

Bardziej szczegółowo

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

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018 Informatyka I Klasy i obiekty. Podstawy programowania obiektowego dr inż. Andrzej Czerepicki Politechnika Warszawska Wydział Transportu 2018 Plan wykładu Pojęcie klasy Deklaracja klasy Pola i metody klasy

Bardziej szczegółowo

DLA SEKTORA INFORMATYCZNEGO W POLSCE

DLA SEKTORA INFORMATYCZNEGO W POLSCE DLA SEKTORA INFORMATYCZNEGO W POLSCE SRK IT obejmuje kompetencje najważniejsze i specyficzne dla samego IT są: programowanie i zarządzanie systemami informatycznymi. Z rozwiązań IT korzysta się w każdej

Bardziej szczegółowo

Analiza i projektowanie oprogramowania. Analiza i projektowanie oprogramowania 1/32

Analiza i projektowanie oprogramowania. Analiza i projektowanie oprogramowania 1/32 Analiza i projektowanie oprogramowania Analiza i projektowanie oprogramowania 1/32 Analiza i projektowanie oprogramowania 2/32 Cel analizy Celem fazy określania wymagań jest udzielenie odpowiedzi na pytanie:

Bardziej szczegółowo

Analiza i projektowanie obiektowe 2016/2017. Wykład 10: Tworzenie projektowego diagramu klas

Analiza i projektowanie obiektowe 2016/2017. Wykład 10: Tworzenie projektowego diagramu klas Analiza i projektowanie obiektowe 2016/2017 Wykład 10: Tworzenie projektowego diagramu klas Jacek Marciniak Wydział Matematyki i Informatyki Uniwersytet im. Adama Mickiewicza 1 Plan wykładu 1. Projektowy

Bardziej szczegółowo

Struktura systemu operacyjnego. Opracował: mgr Marek Kwiatkowski

Struktura systemu operacyjnego. Opracował: mgr Marek Kwiatkowski Struktura systemu operacyjnego Schemat budowy systemu operacyjnego model warstwowy Schemat budowy systemu operacyjnego części składowe Większość systemów operacyjnych opiera się o koncepcję jądra, która

Bardziej szczegółowo

Nadzorowanie stanu serwerów i ich wykorzystania przez użytkowników

Nadzorowanie stanu serwerów i ich wykorzystania przez użytkowników Uniwersytet Mikołaja Kopernika w Toruniu Wydział Matematyki i Informatyki Wydział Fizyki, Astronomii i Informatyki Stosowanej Tomasz Kapelak Nr albumu: 187404 Praca magisterska na kierunku Informatyka

Bardziej szczegółowo

Układy VLSI Bramki 1.0

Układy VLSI Bramki 1.0 Spis treści: 1. Wstęp... 2 2. Opis edytora schematów... 2 2.1 Dodawanie bramek do schematu:... 3 2.2 Łączenie bramek... 3 2.3 Usuwanie bramek... 3 2.4 Usuwanie pojedynczych połączeń... 4 2.5 Dodawanie

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

Instrukcja użytkownika

Instrukcja użytkownika Instrukcja użytkownika Bydgoszcz 2017 Strona: 1/12 Spis treści 1 Konfiguracja i obsługa funkcjonalności... 3-1.1 Wstęp... 3 1.2 Konfiguracja stacji klienckiej... 3 1.3 Weryfikacja istniejącego dokumentu...

Bardziej szczegółowo

Wykorzystanie szkolnych pracowni komputerowych w nauczaniu przedmiotów ogólnokształcących i zawodowych

Wykorzystanie szkolnych pracowni komputerowych w nauczaniu przedmiotów ogólnokształcących i zawodowych Wykorzystanie szkolnych pracowni komputerowych w nauczaniu przedmiotów ogólnokształcących i zawodowych (dla nauczycieli przedmiotów matematyczno-przyrodniczych) Przeznaczenie Szkolenie przeznaczone jest

Bardziej szczegółowo

AUREA BPM HP Software. TECNA Sp. z o.o. Strona 1 z 7

AUREA BPM HP Software. TECNA Sp. z o.o. Strona 1 z 7 AUREA BPM HP Software TECNA Sp. z o.o. Strona 1 z 7 HP APPLICATION LIFECYCLE MANAGEMENT Oprogramowanie Application Lifecycle Management (ALM, Zarządzanie Cyklem życia aplikacji) wspomaga utrzymanie kontroli

Bardziej szczegółowo

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE

INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE Studia podyplomowe dla nauczycieli INFORMATYKA, TECHNOLOGIA INFORMACYJNA ORAZ INFORMATYKA W LOGISTYCE Przedmiot JĘZYKI PROGRAMOWANIA DEFINICJE I PODSTAWOWE POJĘCIA Autor mgr Sławomir Ciernicki 1/7 Aby

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

S YSTEM O PERACYJNY L INUX W PARCOWNI

S YSTEM O PERACYJNY L INUX W PARCOWNI S YSTEM O PERACYJNY L INUX W PARCOWNI SZKOLNEJ Technologia informatyczna w obecnym czasie zmienia się bardzo szybko i trudno jest za nią nadążyć. Zmieniają się również narzędzia dzięki, którym mamy do

Bardziej szczegółowo

Teraz bajty. Informatyka dla szkół ponadpodstawowych. Zakres rozszerzony. Część 1.

Teraz bajty. Informatyka dla szkół ponadpodstawowych. Zakres rozszerzony. Część 1. Teraz bajty. Informatyka dla szkół ponadpodstawowych. Zakres rozszerzony. Część 1. Grażyna Koba MIGRA 2019 Spis treści (propozycja na 2*32 = 64 godziny lekcyjne) Moduł A. Wokół komputera i sieci komputerowych

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

Listy powiązane zorientowane obiektowo

Listy powiązane zorientowane obiektowo Listy powiązane zorientowane obiektowo Aby zilustrować potęgę polimorfizmu, przeanalizujmy zorientowaną obiektowo listę powiązaną. Jak zapewne wiesz, lista powiązana jest strukturą danych, zaprojektowaną

Bardziej szczegółowo

Spis treści. Księgarnia PWN: Roland Zimek - Swish Max3

Spis treści. Księgarnia PWN: Roland Zimek - Swish Max3 Księgarnia PWN: Roland Zimek - Swish Max3 Spis treści Wprowadzenie... 11 1. Opis programu i instalacja... 15 1.1. Nowości w SWiSH Max3... 15 1.1.1. Projekty... 15 1.1.2. Ścieżka ruchu... 16 1.1.3. Narzędzie

Bardziej szczegółowo