You are on page 1of 16

Wrocaw, 16 czerwca 2011 Jakub Jdryszek, Mateusz Korel, Wiktor awski, Bartomiej Piekarski Kamil Pokadowski Micha Skuza

171055 171133 171062 171160 170993 171172

RubiQ Cube 2011


Projekt z przedmiotu Projekt Zespoowy Rok akademicki 2010/2011, kierunek: INF, specjalno: INS.

PROWADZCY: Dr in. Andrzej Kozik

Spis treci
1. 2. 3. 4. 5. 6. Zaoenia projektowe ......................................................................................................2 Cele projektu ...................................................................................................................2 Szczegy implementacyjne.............................................................................................3 Zasady gry..................................................................................................................... 12 Elementy dodatkowe ..................................................................................................... 13 Interfejs uytkownika .................................................................................................... 14

Bibliografia .......................................................................................................................... 15

1. Zaoenia projektowe
Projekt mia na celu stworzenie symulacji gry, w ktrej gracz ukada kostk Rubika. Zakadano stworzenie dwch wersji gry: gracz steruje za pomoc myszy i klawiatury, gracz steruje za pomoc urzdzenia Kinect. Ponadto gra miaa przechowywa najlepsze wyniki graczy, ktre bd pamitane lokalnie (w pliku XML) oraz globalnie w centralnej bazie danych, gdzie bd wyniki rnych graczy. Kady z graczy powinien mie moliwo utworzenia wasnego profilu na jednym komputerze mona gra na rnych profilach. Prace nad projektem zostay podzielone na 3 moduy: interfejs (GUI) i baza danych uytkownikw wraz ze stron WWW projektu (Jakub Jdryszek i Mateusz Korel), obsuga Kinecta (Wiktor awski i Bartomiej Piekarski), przygotowanie funkcjonalnego modelu kostki Rubika (Kamil Pokadowski i Micha Skuza).

2. Cele projektu
Celami projektu byy m.in.: nabycie praktycznych umiejtnoci programowania z wykorzystaniem Windows Presentation Foundation (WPF), zapoznanie si z jzykiem opisu interfejsu uytkownika XAML (eXtensible Application Markup Language), opanowanie komunikacji z baz danych, z poziomu aplikacji bazujcej na .NET Framework 4.0, zapoznanie si z urzdzeniem Kinect oraz bibliotekami do komunikacji z nim, poznanie sposobw modelowania grafiki 3D z wykorzystaniem WPF, 2

udoskonalenie umiejtnoci pracy w grupie i zaznajomienie z narzdziami j wpierajcymi.

3. Szczegy implementacyjne
3.1 Graficzny model kostki Do uzyskania graficznej prezentacji kostki Rubika posuono si silnikiem graficznym WPF, bazujcym na .NET 3 i wchodzcym w skad WinFX. WPF daje moliwo integracji m.in. interfejsu uytkownika, dokumentw, grafiki zarwno 2D jaki i 3D, multimediw itd. Na potrzeby niniejszego projektu wykorzystano interfejs uytkownika, a take elementy grafiki trjwymiarowej. Ponadto interfejs programowania aplikacji WPF bazuje na jzyku XML, a dokadniej na jego zoptymalizowanej czci XAML, sucej do opisu bogatych wizualnych interfejsw, a tym samym pozwala na odseparowanie warstwy prezentacji i logiki biznesowej. Graficzna cz GUI wykorzystuje grafik wektorow budowan z uyciem akceleratorw grafiki 3D i efektw graficznych udostpnianych przez WGF (Windows Graphics Foundation). Model kostki zosta stworzony przy uyciu 27 modeli szecianw, gdzie kady z nich znajduje si w 3 rnych (okrelonych) paszczyznach przestrzeni, ktre wyznaczaj ciany obracanej kostki. W celu uzyskania w/w efektu stworzono dwie klasy: Cube klasa odzwierciedlajca szecian w przestrzeni, tzn. jego graficzn prezentacj, a w szczeglnoci jego umiejscowienie w ukadzie odniesienia, rozmiar, kolory cian; RubikCube klasa zawierajca tablic 27 obiektw klasy Cube,

reprezentujcych ca kostk oraz metody suce m.in. do obrotw caej kostki lub wybranych cian. 3.1.1 Klasa Cube Klasa Cube suy do graficznego przedstawienia szecianu w ukadzie wsprzdnych XYZ. Podstaw do jego stworzenia byo moliwo rysowania siatki, ktra reprezentuje powierzchni umiejscowion w przestrzeni trjwymiarowej. W szczeglnoci tak powierzchni mona jednoznacznie zdefiniowa przy uyciu wsprzdnych 3 punktw, co oznacza, e w/w siatka moe by zoona z trjktw. Dla duych i zoonych powierzchni 3

odpowiednia ilo takich trjktw stanowi dobre przyblienie szukanych ksztatw. Prawidowa reprezentacja siatki w przestrzeni skada si z : wierzchokw trjktw, skadajcych si na siatk; wektorw normalnych do zdefiniowanych trjktw, ktre stanowi iloczyny wektorowe (rys. 1), ktre wykorzystywane s m.in. do prawidowego owietlenia trjkta

Rysunek 1 Iloczyn wektorowy dla jednego trjkta siatki

okrelenia barwy wiata rozproszenia dla powierzchni owietlanej Model szecianu skada si z 12 trjktw opisujcych jego powierzchni (po dwa na kad cian), dla ktrych osobno obliczane s wektory normalne (przy uyciu iloczynu wektorowego). Konstruktor klasy Cube przyjmuje w argumentach pozycj jednego punktu szecianu wierzchoek nr 1 (rys. 2), rozmiar boku oraz 6 kolorw okrelajcych ciany bryy:
public szescian(Point3D position, double rozmiar, Color c_front, Color c_back, Color c_left, Color c_right, Color c_down, Color c_up)

Rysunek 2 Graficzne reprezentacja szecianu w przestrzeni

Do najwaniejszych metod tej klasy nale: public void transformByMatrix(Matrix3D matrix) metoda odpowiedzialna za transformacj wszystkich punktw szecianu (8 wierzchokw) w przestrzeni przez macierz podawan w argumencie. Jest ona niezbdna przy takich transformacjach jak obroty caej kostki lub wybranych cian oraz przesunicia o wektor; public Color GetWallColor(int wallNumber) metoda zwracajca kolor ciany szecianu podany w argumencie. Wykorzystanie tej funkcji jest konieczne przy sprawdzaniu czy model kostki Rubika jest rozwizany, tzn. czy kolory na kadej powierzchni caej kostki s jednakowe; public Model3DGroup konstruuj_szescian() wymaga si uycia tej metody po kadej transformacji wykonanej na punktach szecianw w celu uzyskania modelu szecianu dla nowo wyznaczonych wsprzdnych (tworzenie siatki trjktw oraz wektorw normalnych dla niej); public void correctPoint(int nr, Point3D newPoint) metoda wykorzystywana do manualnego wpisania nowych wsprzdnych dla punktu okrelonego w argumencie. 5

3.1.2 Klasa RubikCube Dziki klasie RubikCube jest moliwe przedstawienie kostki Rubika w przestrzeni trjwymiarowej. W tym celu klasa przechowuje tablic 27 obiektw klasy Cube, ktre odpowiednio umiejscowione w ukadzie wsprzdnych tworz model caej kostki.

Rysunek 3 Kostka Rubika zoona z 27 szecianw

Domylne ustawienia pozycji obserwatora to (60, 50 , 0), co oznacza, e znajduje si ona nad osi OX, mona zmieni przy uyciu metody SetCamera(). Jednak rekomendowane jest pozostawienie ustawie predefiniowanych. W przypadku ich zmiany, zalecane jest, aby zmieni rwnie kierunek padania wiata na odwrotny do przyjtej pozycji (np. dla pozycji (10,20,30) odpowiedni kierunek to (-10, -20, -30)). Niespenienie tej zasady moe skutkowa niewaciwym wywietlaniem kolorw kostki.

RubikCube wymaga, aby w konstruktorze przekaza referencj do obiektu klasy ViewPort3D, na ktrym caa scena bdzie rysowana. Metody klasy RubikCube mona podzieli na 4 zasadnicze grupy: a) Metody generalne public void przerysujScene() metoda czyci scen, a nastpnie wykorzystujc biece wsprzdne wszystkich obiektw klasy Cube.cs na nowo przerysowuje ca scen; public void SetCamera public void zmienKierunekSwiatla b) Metody obrotw caej kostki public void CubeRotation(int kat, bool horizontal) metoda odpowiedzialna za obrt caego modelu kostki. Pierwszy parametr funkcji okrela kt (w stopniach) obrotu, natomiast drugi okrela jeden z dwch moliwych obrotw: wzgldem osi OY oraz wzgldem osi OZ;

Rysunek 4 Osie obrotu kostki Rubika

dwie metody prywatne odpowiedzialne za faktyczn zmian pooenia wierzchokw. Jedna z nich odpowiada za stworzenie macierzy transformacji oraz zastosowanie jej, druga wykonuje animacj obrotu o ten sam kt, dajc efekt pynnej zmiany pooenia. c) Metody obrotw cian public void WallFocus(int SetNumber) dla uzyskania obrotu wszystkie ciany kostki Rubika wymagane byo zdefiniowanie 9 paszczyzn obrotu, z ktrych kada jest odpowiedzialna za obrt 9 bazowych szecianw stworzono tablice przechowujce numery okrelonych obiektw klasy Cube. WallFocus wyrnia wskazan w argumencie cian (1-9), gdzie pierwsza trjka oznacza ciany od lewego czoa kostki do tyu, druga trjka od prawego czoa, pozostaa odpowiada za poziome warstwy.

Rysunek 5 Wyrnienie cian 1-3

Rysunek 6 Wyrnienie cian 4-6

Rysunek 7 Wyrnienie cian 7-9

Samo wyrnienie ciany polega na przesuniciu 8 szecianw o pewien, okrelony wektor wzgldem rodka rozpatrywanej ciany. W ten sposb uzyskiwany jest efekt rozszerzania si szecianw, bdcych w danej paszczynie. public void obroc_sciane(int nr_sciany, int kat) oraz public void

obroc_scianeAnimation (int nr_sciany, int kat) metody odpowiedzialne za obracanie ciany podanej w argumencie o wskazany kt. Obie metody powinny by wywoywane jednoczenie z identycznymi argumentami, poniewa dokonuje kalkulacji nowego pooenia punktw, natomiast druga odpowiada za sam animacj.

Rysunek 8 Przykady obrotw wyrnionych cian

d) Metody sprawdzajce public bool isSolved() metoda sprawdzajca, czy kostka jest uoona prawidowo, tzn. wszystkie kolory s na waciwych miejscach. Zwraca warto true w przypadku zgodnoci oraz false, kiedy kostka pozostaje nieuoona; public int ReturnActiveWall() metoda zwracajca numer aktywnej (wyrnionej) ciany; public void SetAnimationTime(int miliseconds) ustawia czas animacji przewidziany na jednorazowy obrt caej kostki, bd wybranej ciany; public int repairCube() kluczowa funkcja, ktra naprawia bdy zaokrgle nakadane przez wielokrotne wywoywanie wszystkich obrotw na kostce. Rekomendowane jest, aby uywa jej przy kadym obrocie kostki. Zwraca warto 1, gdy dokonano poprawy wsprzdnych oraz 0, gdy jej nie dokonano.

10

3.2 Obsuga kinecta Do obsugi Kinecta wykorzystana zostaa biblioteka openNI.net. Przygotowany zosta take system logowania przy pomocy bibliotek NLog. Tworzc okno rozgrywki, pierwszym elementem jest pobranie referencji do klasy odpowiadajcej za zapis do logw, przy pomocy statycznej metody

GetCurrentClassLogger(). Aby mc wywietla obraz z Kinecta oraz rysowa na nim punkty identyfikujce poszczeglne czci ciaa, naleao w pliku XAML uy znacznikw typu Canvas oraz Image. Tworzc okno rozgrywki tworzony jest obiekt klasy zaprojektowanej specjalnie na potrzeby tego projektu GameController. W konstruktorze przekazywana jest do niej referencja do gwnego okna, eby mc z niej manipulowa obiektami typu Canvas oraz Image. Do obsugi biblioteki openNI jest wymagany obiekt klasy Context, do ktrego przekazywana jest nazwa pliku XML z odpowiednimi ustawieniami. Na podstawie utworzonego obiektu klasy Context mona utworzy DepthGenerator i ImageGenerator. Aby skorzysta z moliwoci tej biblioteki, naleao dodatkowo utworzy obiekty klas UserGenerator, SkeletonCapability i PoseDetectionCapability. Do rozrniania poszczeglnych pozycji, wymagane jest jeszcze utworzenie sownika staww. Po dokonaniu preferowanych ustawie, wywoywana jest metoda StartGenerating() dla obiektu klasy UserGenerator. Aby uzyska wraenie rwnolegoci dziaa, stworzone zostay 3 wtki, ktre odpowiaday za przerysowywanie sceny, wybr cian (poprzez odpowiednie pozycje) i poruszanie kostk (poprzez analiz ruchu). Aby mc wykorzystywa w pniejszej analizie dane czci ciaa, naley je doda do sownika staww - metoda GetJoints(). W jej wntrzu naley wywoa metod GetJoint() dla odpowiednich czci ciaa z 2 parametrami numer uytkownika docelowego oraz jedna z wartoci typu wyliczeniowego SkeletonJoint. Docelowo typ ten przechowuje duo czci ludzkiego ciaa, ale biblioteka jeszcze nie implementuje ich obsugi. Przerysowywanie obrazu polega na usuniciu z nakadki na obrazie z Kinecta wszystkich dodatkowych elementw, a nastpnie dodanie ich na nowo w zaktualizowanych pozycjach na potrzeby projektu zostaa wykorzystana jedynie elipsa o tych samych atrybutach szerokoci i wysokoci (czyli koo) oraz kostka, ktra zostaa opisana wczeniej. Wsprzdne XYZ danej czci ciaa w przestrzeni mona odczytywa na bieco z tablicy 11

aktualizowanej automatycznie przez bibliotek openNI. Aby nie doszo do zjawiska wycigw wtkw, obraz wideo z Kinecta naley zablokowa, pobra pojedyncz bitmap, a nastpnie go odblokowa. Wtek ledzcy ruch dziaa w ptli gorcego czekania z wartoci Sleep rwn 100 milisekund. Gdy przemieszczenie w osi poziomej lub pionowej przekroczy warto progow, wywoywana jest metoda obracajca aktywn cian. Wtek wyboru odpowiedniej ciany rwnie dziaa w ptli gorcego czekania, ale poniewa nie jest tu badane przemieszczenie, to aktualny stan moe by sprawdzany znacznie czciej 22 milisekundy. W pierwszej kolejnoci sprawdzane jest czy uytkownik chce odznaczy dan cian. Poniewa biblioteka wykorzystujca Kinecta nie jest w swoim dziaaniu bezbdna (szczeglnie podczas analizy pozycji uytkownikw w lunych strojach), naleao wprowadzi pewien margines bdu. Marginesy bdw s wykorzystywane podczas analizy kadej pozycji, gdy uytkownik powinien uzyska przynajmniej jedn poziom lini. System posiada obecnie wewntrzne ograniczenie na maksymaln liczb

uytkownikw. Nie zosta przygotowany tryb multiplayer, wic maksymalna liczba wykrytych uytkownikw (obecnie 4) moe jednoczenie operowa na tej samej kostce Rubika. Obsuga Kinecta bya utrudniona, poniewa nie pojawio si jeszcze SDK Microsoftu do jego obsugi. Poza tym interfejs naley obsugiwa przy pomocy myszki bo dostpno urzdzenia nie pozwolia na zaimplementowanie jego obsugi przy pomocy Kinecta.

4. Zasady gry
Zabawa kostk polega na takim uoeniu kwadratw, aby na kadej cianie wszystkie posiaday jeden kolor. Skada si ona z 26 szecianw i przegubu umieszczonego w rodku. Przegub ten umoliwia kadej z zewntrznych warstw kostki obrt wok osi prostopadej do danej warstwy i przechodzcej przez rodek kostki. Liczba kombinacji rnych uoe kostki 333 wynosi 43 252 003 274 489 856 000 (ponad 43 tryliony).

12

5. Elementy dodatkowe
5.1 Zarzdzanie profilami graczy Oprcz samej gry zosta stworzony system zarzdzania profilami graczy. Zarzdzanie profilami. Do zarzdzania profilami wykorzystywany jest lokalny plik 'profiles.xml', ktry zawiera utworzone profile przez uytkownikw gry. Budowa pliku zawierajcego profile jest nastpujca: 1) Wze gwny o nazwie 'Users' zawierajcy utworzone profile uytkownikw. Dodatkowo posiada on 2 atrybuty: 'last' - atrybut przechowujcy login ostatnio zalogowanego uytkownika oraz 'level' - atrybut przechowujcy ostatnio ustawiony poziom gry. 2) Dalej w hierarchi definiowane s poszczeglne profile. Kady z profili skada si z trzech wzw - jednego gwnego 'User' okrelajcego definicj profilu oraz dwch podrzdnych wzw 'UserName' oraz 'Password' zawierajcych informacj danych uytkownika. Haso jako wze 'Password' przechowywane jest w formie zaszyfrowanej algorytmem MD5. Aby uy wczeniej zdefiniowanego profilu wystarczy na stronie profilw wybra dany login z listy oraz wpisa haso dla profilu, po czym klikn 'Use profile'. Haso jest szyfrowane funkcj skrtu MD5 i porwnywane z hasem zakodowanym w pliku profiles.xml. Jeli hasa s jednakowe uytkownik staje si aktywny, czyli wszystkie wyniki zostan zapisane na jego konto oraz przy ponownym uruchomieniu gry, gdy pniej nie nastpi ponowna zmiana aktywnego uytkownika, zostanie uyty ten profil. Aby utworzy nowy profil wystarczy na stronie profilw poda login dla nowego uytkownika oraz wpisa haso dla profilu, po czym klikn 'Create profile'. Jeli baza danych jest dostpna oraz podany login nie istnieje ju w bazie uytkownikw to nowy uytkownik zostanie utworzony oraz stanie si aktywny, czyli wszystkie wyniki zostan zapisane na jego konto, a take przy ponownym uruchomieniu gry, gdy pniej nie nastpi ponowna zmiana aktywnego uytkownika zostanie uyty ten profil. Dodatkowo do bazy danych zostanie wprowadzony nowy uytkownik z danymi formularza, czyli login oraz haso zaszyfrowane w MD5 oraz, w lokalnym pliku 'profiles.xml' zostanie dodany nowy wpis o utworzonym

13

profilu (potrzebne wzy zostan utworzone wedug wczeniej opisanej hierarchii w pliku profilw). 5.2 Ranking wynikw Przy wykorzystaniu profili graczy utworzono centralny ranking wynikw. Wyniki globalne s przechowywane w bazie danych, natomiast lokalne w pliku scores.xml. Po przejciu do menu Statistics wida lokalne wyniki. Po klikniciu przycisku Update wyniki lokalne s przesyane do bazy danych, a z bazy pobierane s nowe, ktrych nie ma jeszcze lokalnie. 5.3 Strona WWW powicona grze oraz Fan Page na Facebooku Ponadto stworzona zostaa strona informacyjna opisujca gr oraz zawierajca centraln baz wynikw graczy. Dodatkowo zosta stworzony fan page na facebooku. Adresy: Strona WWW: http://lisu.homelinux.org/~angel/rubiq Fan page: http://www.facebook.com/pages/Rubiq-Cube/105023389589931

6. Interfejs uytkownika
Nie wszystkie elementy mona obsuy przy pomocy Kinecta, wic przygotowane zostay 2 wersje aplikacji jedna czciowo obsuguje Kinecta, a druga korzysta tylko z myszki i klawiatury. W obu przypadkach menu gwne obsugiwane jest przy pomocy myszki. Jedyna z opcji, ktra obsugiwana jest inaczej to Start Game. Pojawia si nowe okno z instrukcj po lewej. Na rodku ekranu znajduje si kostka Rubika. W wersji z Kinectem po prawej stronie pojawia si rwnie okno z widokiem, z kamery wbudowanej w urzdzenie. Aby uaktywni obsug przy pomocy Kinecta, naley ustawi si w pozycji przypominajcej greck liter . Poprawne wykrycie uytkownika zostanie zasygnalizowane pojawieniem si punktw kontrolnych na szkielecie. Bd one poda za uytkownikiem. Moliwe jest 9 rodzajw zaznaczonych cian oraz mona niczego nie zaznacza i wtedy dokonuje si obrotu caej kostki. Lew rk wybiera si odpowiednie ciany, a praw wykonuje obroty. Badane s rnice pooe prawej doni w krtkich odcinkach 14

czasu. Jeeli przesunicie bdzie wystarczajco due, wykonany zostanie obrt o 45. Dla bardziej energicznego ruchu moliwe jest jednorazowe wykonanie obrotu o 90. W przypadku obrotu caej kostki moliwe s obroty o 90 i 180. Kostka lub jej wybrana ciana jest obracana w kierunku zgodnym z kierunkiem przemieszczenia prawej doni. Patrzc na nachylon do poziomu kostk, mona w pionie wyodrbni 6 rnych cian. Z przodu widoczne s 2 ciany boczne. Aby wybra odpowiedni z nich, naley stan w rozkroku lub ze zczonymi nogami. W obu przypadkach lewy okie powinien by na wysokoci ramienia. Kt w okciu powinien wynosi okoo 90, a lewa rka powinna by skierowana w pionie do gry. Jedn z 3 cian wybiera si poprzez skrty ciaa lewa strona z przodu, na rwni z praw i lewa strona z tyu. Naley jednak uwaa, eby lewa do nie znalaza si za ramieniem, poniewa przy pomocy wykorzystanej biblioteki, tracony jest obraz szkieletu. Aby wybiera w cianach poziomych, naley lew do umieszcza na wysokoci czoa, na wysokoci torsu lub na poziomie pasa. Aby dokona odznaczenia cian, naley wyprostowa lew rk w okciu i unie lew do na wysoko ramienia. Te same czynnoci mona wykona przy pomocy klawiatury w wersji, ktra nie wykorzystuje Kinecta. W trakcie gry mierzony jest czas od wykonania pierwszego ruchu kostk. Uoenie kostki sygnalizowane jest odpowiednim komunikatem. Aby wyj z aktualnej rozgrywki, naley wcisn przycisk ESC. W opcji Profile ustawiane s dane dotyczce konta nazwa uytkownika i haso. Natomiast w Statistics przechowywane s najlepsze wyniki mona uy przycisku Update, eby pobra aktualne dane rankingowe z serwera. W Settings moemy ustawi level. Odpowiada on liczbie przesuni majcych na celu wymieszanie kostki. Przycisk Exit zamyka aplikacj.

Bibliografia
[1] Stephens Rod, WPF Programmers Reference, Wiley Publishing, 2010. [2] Nathan A., Windows Presentation Foundation Unleashed, Sams Publishing, 2007. [3] MacDonald M., Pro WPF in C# 2008 Windows Presentation Foundation with .NET 3.5, APress, 2008.

15

[4] Witryna powicona technologiom Windows Presentation Foundation oraz Windows Forms, http://windowsclient.net [5] Strona powicona technologii WPF, http://www.wpftutorial.net [6] GRSKI J., Inynieria oprogramowania w projekcie informatycznym, Mikom, Warszawa, 1999. [7] Rysowanie Kinectem za pomoc biblioteki OpenNI,
http://www.studentguru.gr/blogs/vangos/archive/2011/02/09/kinect-and-wpfpainting-with-kinect-using-openni.aspx

[8] Tutorial 3D dla Windows Presentation Foundation,


http://kindohm.com/technical/WPF3DTutorial.htm

[9] Dokumentacja biblioteki OpenNI, http://openni.org/documentation

16

You might also like