projekt
Transkrypt
projekt
Gra wykorzystująca rzeczywistość rozszerzoną Zaawansowane systemy grafiki komputerowej – projekt Paweł Tarasiuk, 186875 16 sierpnia 2013 1 1 Wstęp Niniejszy projekt stanowi prostą grę komputerową, której kluczowym elementem jest wykorzystanie rzeczywistości rozszerzonej. Gra rozgrywana jest za pomocą elementów rysowanych w miejscu, w którym na obrazie z kamery wykryte zostały markery – są to działo i cel. Gracz steruje rotacją działa (w dwóch kierunkach), z którego wystrzelony może zostać pocisk. Celem gry jest trafienie pociskiem w cel. Inne ustawienie markerów działa oraz celu w przestrzeni oznacza konieczność innego ustawienia działa i na tym właśnie polega atrakcja przygotowanej gry. Szczegóły interfejsu oraz zasad związanych z samą fizyką gry opisane są w kolejnych sekcjach. 2 Zastosowane technologie Projekt został wykonany w języku Java, wybrane przeze mnie środowisko programistyczne to Eclipse. processing został (zgodnie z tym, czym jest on naprawdę) zastosowany jako biblioteka Javy i posłużył do rysowania wszystkich elementów interfejsu graficznego oraz obsługi sterowania klawiaturą. Obliczenia związane z geometrią przestrzenną także zostały zaimplementowane przy wykorzystaniu klas z biblioteki processing (PMatrix, PVector). Ze względu na błędy w zdobywającej popularność wersji beta, które zniechęciły mnie podczas poprzednich ćwiczeń laboratoryjnych (np. błąd 173) zastosowana została wersja stabilna – processing 1.5.1. Obiekt PApplet dziedziczy po widgecie z biblioteki AWT, więc aby wyświetlać aplikację w oknie, osadziłem go wewnątrz obiektu Frame z AWT. Biblioteka AWT może być uważana za przestarzałą, ale w tym wypadku nie ma to żadnych negatywnych skutków, gdyż za pomocą AWT nie są rysowane żadne elementy interfejsu graficznego ani napisy (Frame to po prostu systemowe okno) – a przecież dziedziczenie po AWT stosowane jest także w aktywnie rozwijanych projektach takich jak np. SWT. Stosowanie w tym miejscu dodatkowych bibliotek nie dałoby żadnej korzyści, a wiązałoby się z dodatkowym narzutem. Do obsługi elementów rzeczywistości rozszerzonej wykorzystany został NyArToolkit. Jakkolwiek bardzo doceniam jakość wykrywania markerów przez narzędzia zawarte w tej bibliotece, sporym problemem okazały się braki w dokumentacji (odczuwalnie przynajmniej z punktu widzenia osób nie znających języka japońskiego). Zastosowanie tej biblioteki szczęśliwie ograniczyło się do wskazywania macierzy przekształceń pozwalającej rysować obiekty pośrodku wykrytego markera, tak aby odpowiednio obrócona płaszczyzna XZ pokrywała się z płaszczyzną markera. Macierze wskazywane przez odpowiednie metody obiektu MultiMarker pozwoliły na dokonanie wszystkich obliczeń geometrycznych potrzebnych w ramach niniejszego projektu. Podając MultiMarkerowi z NyArToolkit pewne podstawowe parametry obrazu, który ma być analizowany (np. jaki rozmiar względny ma być przypisywany wykrytemu markerowi), można było działać na dowolnym obiekcie PImage (typ z biblioteki processing) na którym było widać markery. Podstawowe zastosowa- 2 nie programu związane jest z analizą klatek pochodzących z kamery podłączonej do komputera – do tego celu wykorzystana została biblioteka gsvideo. Tworzenie projektu nie zawsze jednak przebiegało w warunkach stosownych do kamerowania prawdziwych markerów – w takich wypadkach zamiast obrazu z kamery podstawiana była cały czas ta sama klatka wczytana z pliku graficznego. Tworzenie tego projektu ani na chwilę nie zmusiło mnie do opuszczania systemu operacyjnego GNU/Linux tudzież do uruchamiania maszyn wirtualnych – co (przynajmniej w moich oczach) dobrze świadczy o twórcach wybranych przeze mnie bibliotek. Trzeba pamiętać, że choć sama Java jest wieloplatformowa, to wszystkie trzy wymienione biblioteki wykorzystują specyficzne operacje niskopoziomowe (jak np. obsługa kamerki) albo wymagające dużej wydajności (processing). We wszystkich przypadkach dostępne były jednak odpowiednie natywne biblioteki współdzielone pod 64-bitową architekturę GNU/Linux albo źródła umożliwiające samodzielne przygotowanie takich bibliotek natywnych. 3 Szczegółowe zasady Programowo obliczane są położenia, rotacje i rozmiary działa oraz celu w bezwzględnym układzie współrzędnych (na podstawie wygenerowanych przez NyArToolkit macierzy przekształceń). Gracz decyduje o rotacji umieszczonego na jednym ze znaczników działa, na drugim ze znaczników rysowany jest cel. Sens dla zabawy ma obrócenie działa w dziwny sposób (nawet umieszczenie kartki ze znacznikiem pionowo), więc jako płaszczyznę odniesienia stosuję płaszczyznę z celem. Gdy któryś z markerów przestaje być widoczny (przysłonięcie kartki lub przesunięcie jej poza pole widzenia kamery), wykorzystywana jest ostatnia informacja o pozycji obiektu, która była pewna – jest to podejście dużo bardziej estetyczne niż znikanie obiektów. Dotyczy to także „pechowych” klatek na których wykrycie markera się nie udaje, mimo iż jest on widoczny – dzięki zastosowanemu podejściu nie powoduje to „migania” obiektów ani utrudnień w grze. 3 W wybranym przez gracza momencie, z czubka lufy działa wystrzeliwany jest pocisk, który ma pewną narzuconą wartość prędkości początkowej, skierowanej zgodnie z kierunkiem ustawienia lufy. Dalszy tor pocisku wyznaczany jest poprzez symulację ruchu jednostajnie przyspieszonego, z przyspieszeniem symulującym grawitacyjne – tzn. skierowanym „w dół”, prostopadle do płaszczyzny odniesienia. Pocisk eksploduje, gdy zetknie się z działem lub celem, lub gdy znajdzie się po przeciwnej stronie płaszczyzny odniesienia niż był w poprzedniej klatce. Po wybuchu pocisku działo jest resetowane do losowej rotacji (aby powtórzenie udanego strzału nie było zbyt proste) i tworzony jest nowy, gotowy do wystrzelenia pocisk. Strzał jest uznawany za udany, gdy wybuchający pocisk jest odpowiednio blisko celu (wybuchem objęta jest nieco większa kula, niż zajmowana przez sam pocisk – zatem można zdobyć punkt także trafiając w płaszczyznę odniesienia tuż obok celu). Kolizję z działem oraz celem wykrywane są w najprostszy możliwy sposób (każdy z tych kształtów jest aproksymowany jako kula, co ma odzwierciedlenie w kształcie modeli tych obiektów). Kolizja pocisku z lufą w ogóle nie jest sprawdzana, bo i tak jest niemożliwa (działo nie może zostać uniesione pionowo do góry – graniczna wartość kąta to około 88◦ ). 4 Interfejs użytkownika Rotacją działa steruje się za pomocą klawiszy W, S (unoszenie i podnoszenie), A, D (obracanie wokół osi prostopadłej do markera działa). Strzał wykonywany jest w momencie wciśnięcia klawisza X. Z pozoru banalne podejście do sterowania działem jest jednocześnie podejściem najprostszym i najwygodniejszym – rozważania na temat „czy nie zastosować myszy” skończyły się na wniosku, że o ile byłoby to ciekawe wyzwanie programistyczne, to wygoda korzystania z programu by spadła. 4 W oknie aplikacji wyświetlany jest obraz z kamerki wraz z dorysowanym działem, celem oraz ewentualnie pociskiem. Ponadto w lewym górnym rogu pokazywane są łatwe do zrozumienia ikonki opisujące celność trzech ostatnich strzałów. 5 Podobne projekty Najprostsze gry wykorzystujące rzeczywistość rozszerzoną oparte są na pojedynczym markerze, jak np. wykonany przez pewnego programistę wyścig samochodowy. Kluczową różnicą takich gier w porównaniu do mojego projektu jest to, że u mnie zachodzą dosłowne interakcje między obiektami znajdującymi się na różnych markerach. Sprytne wykorzystanie wielu markerów zaobserwowałem w demonstracji budzącego mój podziw projektu wykorzystania elementów rzeczywistości rozszerzonej do gry w World of Warcraft. W uogólnieniu – pewien marker wyznacza płaszczyznę gry, a drugi służy do sterowania. O ile takie podejście równie trudne pod względem samej geometrii co moje, to idea wykorzystania wielu markerów jest w moim odczuciu całkiem inna. Pewne podobieństwo do swojego projektu stwierdzam natomiast w przypadku gry typu Tower Defense stworzonej przez Nathana Marshaka z University of Pennsylvania. Postacie z tamtej gry spacerują między obiektami leżącymi na (dowolnie ustawionych względem siebie na powierzchni) wielu znacznikach. Podobieństwo do zasad mojej gry polega na tym, że rozgrywka odbywa się przy udziale wielu sporadycznie przesuwanych markerów, oraz że kluczowe jest wyznaczanie ścieżek od obiektu z jednego markera do drugiego. Oczywiście wspomniany projekt był rozwijany znacznie dłużej od mojego i ze znacznie ambitniejszymi założeniami, co ma odzwierciedlenie np. w jakości zastosowanych modeli 5 elementów gry. 6 Wnioski Jakkolwiek mało odkrywcze by się to nie wydawało, moim pierwszym wnioskiem jest to, że jeżeli szukam wspólnego układu współrzędnych dla wielu różnych obiektów, najlepiej aby był to po prostu układ bezwzględny, na którym operuję po podstawieniu jednostkowej macierzy przekształceń. Nawet jeżeli wektor siły ciążenia ma być prostopadły do jakiejś innej powierzchni (a zatem skierowany pod nietypowym kątem w układzie bezwzględnym), to takie właśnie podejście okazało się przy programowaniu najwygodniejsze. Kolejny wniosek dotyczy sterowania grą osadzoną w przestrzeni trójwymiarowej. Kursor myszy nadaje się praktycznie tylko do wskazywania punktu na ekranie, natomiast wszelkiego rodzaju obracanie obiektów najwygodniej jest realizować za pomocą klawiatury. Drobne problemy podczas tworzenia projektu związane były ze stosowaniem wybranych przez siebie niestandardowych wzorców markerów. Braki w dokumentacji stanowiły utrudnienie w wykrywaniu tego błędu, jednak odpowiednią informację udało mi się wyszukać dzięki obserwacji różnic między przykładami a moim intuicyjnym podejściem. Domyślna konfiguracja NyArToolkit zakłada, że opisany w specjalnym pliku kwadratowy marker o boku 4 powinien być obramowany czarną ramką o grubości 2. Dokonany wybór bibliotek okazał się udany, gdyż projekt działa. Wydajność dokonywanej analizy obrazu jest dla mnie wręcz zaskakująca – w połączeniu z wyborem prostych modeli do dorysowywania, obciążenie mojego laptopa podczas testów jest naprawdę symboliczne, a żadne klatki z kamery nie muszą być przeskakiwane. 7 Bibliografia • http://www.creativeapplications.net/processing/augmented-realitywith-processing-tutorial-processing/ – opis zastosowania NyArToolkit w języku angielskim, znacznie przydatniejszy od oficjalnej dokumentacji • http://cpbotha.net/2010/03/04/processing-gsvideo-nyartoolkiton-linux-x86_64/ – udany przypadek zastosowania wybranego przeze mnie zestawu bibliotek w 64-bitowym systemie GNU/Linux (i to kilka lat temu, gdy biblioteki były mniej dojrzałe i kwestia ta sprawiała więcej trudności) • http://www.hitl.washington.edu/artoolkit/documentation/ – dokumentacja oryginalnego ArToolkit ułatwia zrozumienie NyArToolkitu • Algebra liniowa z geometrią – A. Białynicki-Birula, Warszawa 1979 6