SlideShare a Scribd company logo
1 of 30
Download to read offline
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME        19 listopada 2009




          Wprowadzenie do Raycasting w J2ME

                               Marcin Majak
                         164000@student.pwr.wroc.pl

                            Politechnika Wrocławska
                              Wydział Elektroniki
         Studenckie Koło Naukowe Informatyki Systemów Autonomicznych
                                i Adaptacyjnych2


                                 19 listopada 2009




Marcin Majak                                                         Raycasting     1/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME        19 listopada 2009

Plan prezentacji


  1    Wprowadzenie

  2    Początkowe ustalenia

  3    Obliczanie odległości od obiektów

  4    Ostateczny rezultat

  5    Rysowanie podłogi

  6    Rysowanie sufitu



      Marcin Majak                                                         Raycasting     2/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME        19 listopada 2009

Plan prezentacji


  1    Wprowadzenie

  2    Początkowe ustalenia

  3    Obliczanie odległości od obiektów

  4    Ostateczny rezultat

  5    Rysowanie podłogi

  6    Rysowanie sufitu



      Marcin Majak                                                         Raycasting     3/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME                        19 listopada 2009

Z czym startujemy



 1   int[][] RozkladPlanszy=new int [][]
 2   {
 3   {1,1,1,1,1,1,1},
 4   {1,0,0,0,1,0,1},
 5   {1,0,0,0,1,0,1},
 t
 6   {1,0,0,0,0,0,1},
 7   {1,0,0,0,0,0,1},
 8   {1,0,0,0,0,0,1},
 9   {1,1,1,1,1,1,1},
10   };

                                                                            Przykładowy rozkład planszy

           Rozkład planszy
           Położenie gracza



       Marcin Majak                                                                        Raycasting      4/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME                              19 listopada 2009

Czym jest RayCasting?

  Raycasting można rozumieć jako próbę imitacji otaczającego
  świata; to transformacja bardzo ubogiego zbioru danych
  reprezentujących prostą mapę świata na projekcję 3D,
  wykorzystując przy tym śledzenie promieni światła rzucanych od
  obserwatora w stronę obserwowanego obiektu.




             Przykładowa transformacja prostej mapy na obraz 3D, Rysunki pochodzą ze strony
                                http://www.permadi.com/tutorial/raycast



   Marcin Majak                                                                               Raycasting     5/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME        19 listopada 2009

Różnica między Raycasting, a Raytracing

  Przez większość programistów Raycasting jest uważany za
  podklasę metody Raytracing, jednak jest znacznie “szybszy” ze
  względu na ustalenie pewnych warunków i pozbycie się zbędnych
  zależności geometrycznych.

  Raycasting:
       “Rzucanie“ promieni odbywa się w grupach, np. dla ekranu
       100x100 wystarczy tylko 100 promieni
       Proste kształty geometryczne
       Metoda bardzo szybka, nie wymaga dużego nakładu pamięci
  Raytracing:
       Każdy promień śledzony jest osobno, co oznacza, że dla ściany
       100x100 należy dokownać 104 operacji.
       Prawie każdą figurę geometryczną można uzyskać
       Metoda znacznie wolniejsza, wymagająca dużej liczby
       obliczeń.
   Marcin Majak                                                         Raycasting     6/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME        19 listopada 2009

Plan prezentacji


  1    Wprowadzenie

  2    Początkowe ustalenia

  3    Obliczanie odległości od obiektów

  4    Ostateczny rezultat

  5    Rysowanie podłogi

  6    Rysowanie sufitu



      Marcin Majak                                                         Raycasting     7/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME                         19 listopada 2009

Warunki wstępne




 Wielkość gracza w stosunku do ścian i pole widzenia


                                                                    Zakres śledzonych promieni

         Wybierz układ współrzędnych aby później wykonywać
         obliczenia zgodnie z przyjętą orientacją.
         Głównym założeniem jest fakt, że ściany są zawsze
         prostopadłe do podłogi.
         Ustal wielkość ściany, na której będą prezentowane wyniki tgz.
         “Projection Plane”.
         Wybierz kąt widzenia gracza, jego położenie, wielkość i
         odległość od “Projection Plane”.
    Marcin Majak                                                                         Raycasting        8/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME               19 listopada 2009

Kilka wyjaśnień




                           Ogólne ustawienie gracza przed “Projection Plane”



  Początkowe ustalenia:
       Rozmiar ściany “Projection Plane”: 320x200 pixeli
       Odległość gracza od “Projection Plane“: 277

   Marcin Majak                                                                Raycasting     9/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME           19 listopada 2009

Kilka wyjaśnień

       Kąt pomiędzy poszczególnymi promieniami: 60/320◦




                               Pole widzenia gracza i rzucane promienie




   Marcin Majak                                                           Raycasting    10/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME         19 listopada 2009

Plan prezentacji


  1    Wprowadzenie

  2    Początkowe ustalenia

  3    Obliczanie odległości od obiektów

  4    Ostateczny rezultat

  5    Rysowanie podłogi

  6    Rysowanie sufitu



      Marcin Majak                                                         Raycasting    11/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME         19 listopada 2009

Obliczanie odległości DDA


  Algorytm:
       Na podstawie ustawienia gracza i kąta widzenia wydziel 30
       promieni w lewą stronę i 30 w prawą stronę gracza.
       Czekaj do momentu, gdy promień nie uderzy w przeszkodę.
       Oblicz odległość aktualnego promienia od przeszkody.
       Narysuj pionowe odcinki odwrotnie proporcjonalne do
       obliczonej odległości zgodnie z zasadami perspektywy
       przestrzennej. Im dalej nastąpiła kolizja ze ścianką labiryntu,
       tym mniejszy powinien być pionowy pasek przedstawiający ten
       fragment ścianki na wyświetlaczu telefonu.
       Wyśrodkuj otrzymane paski względem linii horyzontu.



   Marcin Majak                                                         Raycasting    12/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME         19 listopada 2009

Obliczanie odległości DDA




                                     Sposób obliczania odległości


   Marcin Majak                                                         Raycasting    13/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME          19 listopada 2009

Sprawdzanie kolizji w poziomie
  Jak obliczyć poziome przecięcie z przeszkodą:




                                Sposób obliczania poziomego przecięcia



   Marcin Majak                                                          Raycasting    14/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME         19 listopada 2009

Sprawdzanie kolizji w poziomie



       Znajdź pierwsze poziome(Y) przecięcie z komórką. Ustal znak
       punktu w zależności od tego jak prowadzony jest promień.
       Oblicz X przy użyciu formuły X = rozmiar komórki/ tan α
       Sprawdź czy promień nie uderzył w przeszkodę, jeśli tak oblicz
       odległość
       Jeżeli nie ma przeszkody wylicz następne przecięcie
       rozszerzając współrzędne Xnew = Xold + Xconst ,
       Ynew = Yold + Yconst




   Marcin Majak                                                         Raycasting    15/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME          19 listopada 2009

Sprawdzanie kolizji w pionie

  Jak obliczyć pionowe przecięcie z przeszkodą:




                                Sposób obliczania pionowego przecięcia


   Marcin Majak                                                          Raycasting    16/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME         19 listopada 2009

Sprawdzanie kolizji w pionie



       Znajdź pierwsze pionowe(X) przecięcie z komórką. Ustal znak
       punktu w zależności od tego jak prowadzony jest promień.
       Oblicz Y przy użyciu formuły Y = rozmiar komórki · tan α
       Sprawdź czy promień nie uderzył w przeszkodę, jeśli tak oblicz
       odległość
       Jeżeli nie ma przeszkody wylicz następne przecięcie
       rozszerzając współrzędne Xnew = Xold + Xconst ,
       Ynew = Yold + Yconst




   Marcin Majak                                                         Raycasting    17/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME         19 listopada 2009

Ostateczne oblicznie odległości




   Marcin Majak                                                         Raycasting    18/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME         19 listopada 2009

Ostateczne oblicznie odległości



  Do obliczenia odległości między obserwatorem, a przeszkodą
  bierzemy krótszy z promieni uzyskanych na poprzednich slajdach.

  Kilka sposobów obliczenia ostatecznej odległości:
       |P D| = |Px − Dx |/ cos α, |P E| = |Py − Ey |/ cos α
       |P D| =        (Px − Dx )2 + (Py − Dy )2 ,
       |P E| =        (Px − Ex )2 + (Py − Ey )2




   Marcin Majak                                                         Raycasting    19/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME                        19 listopada 2009

Efekt rybiego oka

  Aby pozbyć się efektu “Rybiego oka” należy nasze otrzymane
  wcześniej wyniki przeskalować:

         Poprawna odległość = Zniekształcona odległość · cos β                                     (1)




                                                              Sposób jak pozbyć się tego efektu


                                                                    RayCastingRybieOko.zip
              Efekt rybiego oka


   Marcin Majak                                                                       Raycasting     20/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME         19 listopada 2009

Plan prezentacji


  1    Wprowadzenie

  2    Początkowe ustalenia

  3    Obliczanie odległości od obiektów

  4    Ostateczny rezultat

  5    Rysowanie podłogi

  6    Rysowanie sufitu



      Marcin Majak                                                         Raycasting    21/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME         19 listopada 2009




Ostateczne wyrażenie do obliczenia wysokości przedmiotu
widzianego przez obserwatora:
                            HRzeczywiste
                     h=                  · DP rojectionP lane                      (2)
                            DP romienia




                                Jak wyliczyć ostateczną wysokość




 Marcin Majak                                                         Raycasting     22/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME              19 listopada 2009




                      Ostateczny efekt   RayCastingPrzykladowyWynik.zip

Marcin Majak                                                              Raycasting    23/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME         19 listopada 2009

Plan prezentacji


  1    Wprowadzenie

  2    Początkowe ustalenia

  3    Obliczanie odległości od obiektów

  4    Ostateczny rezultat

  5    Rysowanie podłogi

  6    Rysowanie sufitu



      Marcin Majak                                                         Raycasting    24/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME         19 listopada 2009

Rysowanie podłogi
  Rysowanie podłogi należy rozpocząć od punktu, w którym kończy
  się nasz Projection Plane. Formuła na wyliczenie pierwszego
  przecięcia promienia z podłogą jest następująca:
                                     Hgracza
                  odległość do P =             · DP P         (3)
                                    HsrodekP P




   Marcin Majak                                                         Raycasting    25/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME         19 listopada 2009

Jak uzyskać prawidłowy wynik
  Aby wyliczyć rzeczywistą odległość podłogi od oczu gracza należy
  przeskalować otrzymany powyżej wynik:
                                       odległość od P
               Prawdziwa odległość =                            (4)
                                            cos β




                                      Sposób rysowania podłogi
   Marcin Majak                                                         Raycasting    26/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME         19 listopada 2009

Plan prezentacji


  1    Wprowadzenie

  2    Początkowe ustalenia

  3    Obliczanie odległości od obiektów

  4    Ostateczny rezultat

  5    Rysowanie podłogi

  6    Rysowanie sufitu



      Marcin Majak                                                         Raycasting    27/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME             19 listopada 2009

Rysowanie sufitu
  Rysowanie sufitu jest podobne to omówionego wcześniej rysowania
  podłogi. Również należy wyznaczyć początkową odległość
  obserwatora od punktu przecięcia z sufitem.




                          Sposób rysowania sufitu    RayCastingOkienko.zip


   Marcin Majak                                                             Raycasting    28/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME         19 listopada 2009

Kolejne spotkanie




  Temat: Subversion - system kontroli wersji
  Prowadzenie: Michał Walczak
  Data: 26.11.2009, godzina: 17.00
  Gdzie: sala 23 C-3




   Marcin Majak                                                         Raycasting    29/30
Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME                               19 listopada 2009

Więcej informacji

       Kontakt z autorem:
       164000@student.pwr.wroc.pl
       Strona koła naukowego ISA2
       http://autonom.ict.pwr.wroc.pl/
       Strona warsztatów:
       http://autonom.ict.pwr.wroc.pl/∼mstachniuk
       Adres tego dokumentu:
       http://autonom.ict.pwr.wroc.pl/∼mstachniuk/files/warsztaty2009/05-raycasting-2009.11.19.pdf
       J2ME Tworzenie gier – Janusz Grzyb
       ftp://ftp.helion.pl/online/j2metg/j2metg-3.pdf
       Creating 2D Action Games with the Game API
       http://developers.sun.com/mobility/midp/articles/game/
       Wikipedia: Raycasting
       http://pl.wikipedia.org/wiki/Ray casting
       Strona z tutorial’em
       http://www.permadi.com/tutorial/raycast/
       NetBeans
       http://www.netbeans.org/




   Marcin Majak                                                                           Raycasting        30/30

More Related Content

More from MarcinStachniuk

Wroclaw GraphQL - GraphQL in Java
Wroclaw GraphQL - GraphQL in JavaWroclaw GraphQL - GraphQL in Java
Wroclaw GraphQL - GraphQL in JavaMarcinStachniuk
 
[DevCrowd] GraphQL - gdy API RESTowe to za mało
[DevCrowd] GraphQL - gdy API RESTowe to za mało[DevCrowd] GraphQL - gdy API RESTowe to za mało
[DevCrowd] GraphQL - gdy API RESTowe to za małoMarcinStachniuk
 
GraphQL - gdy API RESTowe to za mało
GraphQL - gdy API RESTowe to za małoGraphQL - gdy API RESTowe to za mało
GraphQL - gdy API RESTowe to za małoMarcinStachniuk
 
BruJUG Brussels GraphQL when RESR API is to less - lessons learned
BruJUG Brussels GraphQL when RESR API is to less - lessons learnedBruJUG Brussels GraphQL when RESR API is to less - lessons learned
BruJUG Brussels GraphQL when RESR API is to less - lessons learnedMarcinStachniuk
 
[WroclawJUG] Continuous Delivery in OSS using Shipkit
[WroclawJUG] Continuous Delivery in OSS using Shipkit[WroclawJUG] Continuous Delivery in OSS using Shipkit
[WroclawJUG] Continuous Delivery in OSS using ShipkitMarcinStachniuk
 
Continuous Delivery in OSS using Shipkit.org
Continuous Delivery in OSS using Shipkit.orgContinuous Delivery in OSS using Shipkit.org
Continuous Delivery in OSS using Shipkit.orgMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedMarcinStachniuk
 
GraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learnedGraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learnedMarcinStachniuk
 
Java Web Start – jak żyć z tą dziwną technologią
Java Web Start – jak żyć z tą dziwną technologiąJava Web Start – jak żyć z tą dziwną technologią
Java Web Start – jak żyć z tą dziwną technologiąMarcinStachniuk
 
Zarządzanie zmianami w schemacie relacyjnych baz danych
Zarządzanie zmianami w schemacie relacyjnych baz danychZarządzanie zmianami w schemacie relacyjnych baz danych
Zarządzanie zmianami w schemacie relacyjnych baz danychMarcinStachniuk
 
Inicjatywa NoSQL na przykładzie db4o
Inicjatywa NoSQL na przykładzie db4oInicjatywa NoSQL na przykładzie db4o
Inicjatywa NoSQL na przykładzie db4oMarcinStachniuk
 
Automatic mechanism data migration between relational and object database
Automatic mechanism data migration between relational and object databaseAutomatic mechanism data migration between relational and object database
Automatic mechanism data migration between relational and object databaseMarcinStachniuk
 
Zastosowanie obiektowych baz danych na przykładzie db4o
Zastosowanie obiektowych baz danych na przykładzie db4oZastosowanie obiektowych baz danych na przykładzie db4o
Zastosowanie obiektowych baz danych na przykładzie db4oMarcinStachniuk
 
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017MarcinStachniuk
 

More from MarcinStachniuk (20)

Wroclaw GraphQL - GraphQL in Java
Wroclaw GraphQL - GraphQL in JavaWroclaw GraphQL - GraphQL in Java
Wroclaw GraphQL - GraphQL in Java
 
[DevCrowd] GraphQL - gdy API RESTowe to za mało
[DevCrowd] GraphQL - gdy API RESTowe to za mało[DevCrowd] GraphQL - gdy API RESTowe to za mało
[DevCrowd] GraphQL - gdy API RESTowe to za mało
 
GraphQL - gdy API RESTowe to za mało
GraphQL - gdy API RESTowe to za małoGraphQL - gdy API RESTowe to za mało
GraphQL - gdy API RESTowe to za mało
 
BruJUG Brussels GraphQL when RESR API is to less - lessons learned
BruJUG Brussels GraphQL when RESR API is to less - lessons learnedBruJUG Brussels GraphQL when RESR API is to less - lessons learned
BruJUG Brussels GraphQL when RESR API is to less - lessons learned
 
[WroclawJUG] Continuous Delivery in OSS using Shipkit
[WroclawJUG] Continuous Delivery in OSS using Shipkit[WroclawJUG] Continuous Delivery in OSS using Shipkit
[WroclawJUG] Continuous Delivery in OSS using Shipkit
 
Continuous Delivery in OSS using Shipkit.org
Continuous Delivery in OSS using Shipkit.orgContinuous Delivery in OSS using Shipkit.org
Continuous Delivery in OSS using Shipkit.org
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learnedGraphQL - when REST API is to less - lessons learned
GraphQL - when REST API is to less - lessons learned
 
GraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learnedGraphQL - when REST API is not enough - lessons learned
GraphQL - when REST API is not enough - lessons learned
 
Java Web Start – jak żyć z tą dziwną technologią
Java Web Start – jak żyć z tą dziwną technologiąJava Web Start – jak żyć z tą dziwną technologią
Java Web Start – jak żyć z tą dziwną technologią
 
Zarządzanie zmianami w schemacie relacyjnych baz danych
Zarządzanie zmianami w schemacie relacyjnych baz danychZarządzanie zmianami w schemacie relacyjnych baz danych
Zarządzanie zmianami w schemacie relacyjnych baz danych
 
Inicjatywa NoSQL na przykładzie db4o
Inicjatywa NoSQL na przykładzie db4oInicjatywa NoSQL na przykładzie db4o
Inicjatywa NoSQL na przykładzie db4o
 
Automatic mechanism data migration between relational and object database
Automatic mechanism data migration between relational and object databaseAutomatic mechanism data migration between relational and object database
Automatic mechanism data migration between relational and object database
 
Zastosowanie obiektowych baz danych na przykładzie db4o
Zastosowanie obiektowych baz danych na przykładzie db4oZastosowanie obiektowych baz danych na przykładzie db4o
Zastosowanie obiektowych baz danych na przykładzie db4o
 
Wprowadzenie do J2ME
Wprowadzenie do J2MEWprowadzenie do J2ME
Wprowadzenie do J2ME
 
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
Continuous Delivery w projekcie Open Source - Marcin Stachniuk - DevCrowd 2017
 

04 Wprowadzenie do Raycasting'u w j2me

  • 1. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Wprowadzenie do Raycasting w J2ME Marcin Majak 164000@student.pwr.wroc.pl Politechnika Wrocławska Wydział Elektroniki Studenckie Koło Naukowe Informatyki Systemów Autonomicznych i Adaptacyjnych2 19 listopada 2009 Marcin Majak Raycasting 1/30
  • 2. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Plan prezentacji 1 Wprowadzenie 2 Początkowe ustalenia 3 Obliczanie odległości od obiektów 4 Ostateczny rezultat 5 Rysowanie podłogi 6 Rysowanie sufitu Marcin Majak Raycasting 2/30
  • 3. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Plan prezentacji 1 Wprowadzenie 2 Początkowe ustalenia 3 Obliczanie odległości od obiektów 4 Ostateczny rezultat 5 Rysowanie podłogi 6 Rysowanie sufitu Marcin Majak Raycasting 3/30
  • 4. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Z czym startujemy 1 int[][] RozkladPlanszy=new int [][] 2 { 3 {1,1,1,1,1,1,1}, 4 {1,0,0,0,1,0,1}, 5 {1,0,0,0,1,0,1}, t 6 {1,0,0,0,0,0,1}, 7 {1,0,0,0,0,0,1}, 8 {1,0,0,0,0,0,1}, 9 {1,1,1,1,1,1,1}, 10 }; Przykładowy rozkład planszy Rozkład planszy Położenie gracza Marcin Majak Raycasting 4/30
  • 5. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Czym jest RayCasting? Raycasting można rozumieć jako próbę imitacji otaczającego świata; to transformacja bardzo ubogiego zbioru danych reprezentujących prostą mapę świata na projekcję 3D, wykorzystując przy tym śledzenie promieni światła rzucanych od obserwatora w stronę obserwowanego obiektu. Przykładowa transformacja prostej mapy na obraz 3D, Rysunki pochodzą ze strony http://www.permadi.com/tutorial/raycast Marcin Majak Raycasting 5/30
  • 6. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Różnica między Raycasting, a Raytracing Przez większość programistów Raycasting jest uważany za podklasę metody Raytracing, jednak jest znacznie “szybszy” ze względu na ustalenie pewnych warunków i pozbycie się zbędnych zależności geometrycznych. Raycasting: “Rzucanie“ promieni odbywa się w grupach, np. dla ekranu 100x100 wystarczy tylko 100 promieni Proste kształty geometryczne Metoda bardzo szybka, nie wymaga dużego nakładu pamięci Raytracing: Każdy promień śledzony jest osobno, co oznacza, że dla ściany 100x100 należy dokownać 104 operacji. Prawie każdą figurę geometryczną można uzyskać Metoda znacznie wolniejsza, wymagająca dużej liczby obliczeń. Marcin Majak Raycasting 6/30
  • 7. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Plan prezentacji 1 Wprowadzenie 2 Początkowe ustalenia 3 Obliczanie odległości od obiektów 4 Ostateczny rezultat 5 Rysowanie podłogi 6 Rysowanie sufitu Marcin Majak Raycasting 7/30
  • 8. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Warunki wstępne Wielkość gracza w stosunku do ścian i pole widzenia Zakres śledzonych promieni Wybierz układ współrzędnych aby później wykonywać obliczenia zgodnie z przyjętą orientacją. Głównym założeniem jest fakt, że ściany są zawsze prostopadłe do podłogi. Ustal wielkość ściany, na której będą prezentowane wyniki tgz. “Projection Plane”. Wybierz kąt widzenia gracza, jego położenie, wielkość i odległość od “Projection Plane”. Marcin Majak Raycasting 8/30
  • 9. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Kilka wyjaśnień Ogólne ustawienie gracza przed “Projection Plane” Początkowe ustalenia: Rozmiar ściany “Projection Plane”: 320x200 pixeli Odległość gracza od “Projection Plane“: 277 Marcin Majak Raycasting 9/30
  • 10. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Kilka wyjaśnień Kąt pomiędzy poszczególnymi promieniami: 60/320◦ Pole widzenia gracza i rzucane promienie Marcin Majak Raycasting 10/30
  • 11. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Plan prezentacji 1 Wprowadzenie 2 Początkowe ustalenia 3 Obliczanie odległości od obiektów 4 Ostateczny rezultat 5 Rysowanie podłogi 6 Rysowanie sufitu Marcin Majak Raycasting 11/30
  • 12. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Obliczanie odległości DDA Algorytm: Na podstawie ustawienia gracza i kąta widzenia wydziel 30 promieni w lewą stronę i 30 w prawą stronę gracza. Czekaj do momentu, gdy promień nie uderzy w przeszkodę. Oblicz odległość aktualnego promienia od przeszkody. Narysuj pionowe odcinki odwrotnie proporcjonalne do obliczonej odległości zgodnie z zasadami perspektywy przestrzennej. Im dalej nastąpiła kolizja ze ścianką labiryntu, tym mniejszy powinien być pionowy pasek przedstawiający ten fragment ścianki na wyświetlaczu telefonu. Wyśrodkuj otrzymane paski względem linii horyzontu. Marcin Majak Raycasting 12/30
  • 13. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Obliczanie odległości DDA Sposób obliczania odległości Marcin Majak Raycasting 13/30
  • 14. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Sprawdzanie kolizji w poziomie Jak obliczyć poziome przecięcie z przeszkodą: Sposób obliczania poziomego przecięcia Marcin Majak Raycasting 14/30
  • 15. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Sprawdzanie kolizji w poziomie Znajdź pierwsze poziome(Y) przecięcie z komórką. Ustal znak punktu w zależności od tego jak prowadzony jest promień. Oblicz X przy użyciu formuły X = rozmiar komórki/ tan α Sprawdź czy promień nie uderzył w przeszkodę, jeśli tak oblicz odległość Jeżeli nie ma przeszkody wylicz następne przecięcie rozszerzając współrzędne Xnew = Xold + Xconst , Ynew = Yold + Yconst Marcin Majak Raycasting 15/30
  • 16. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Sprawdzanie kolizji w pionie Jak obliczyć pionowe przecięcie z przeszkodą: Sposób obliczania pionowego przecięcia Marcin Majak Raycasting 16/30
  • 17. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Sprawdzanie kolizji w pionie Znajdź pierwsze pionowe(X) przecięcie z komórką. Ustal znak punktu w zależności od tego jak prowadzony jest promień. Oblicz Y przy użyciu formuły Y = rozmiar komórki · tan α Sprawdź czy promień nie uderzył w przeszkodę, jeśli tak oblicz odległość Jeżeli nie ma przeszkody wylicz następne przecięcie rozszerzając współrzędne Xnew = Xold + Xconst , Ynew = Yold + Yconst Marcin Majak Raycasting 17/30
  • 18. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Ostateczne oblicznie odległości Marcin Majak Raycasting 18/30
  • 19. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Ostateczne oblicznie odległości Do obliczenia odległości między obserwatorem, a przeszkodą bierzemy krótszy z promieni uzyskanych na poprzednich slajdach. Kilka sposobów obliczenia ostatecznej odległości: |P D| = |Px − Dx |/ cos α, |P E| = |Py − Ey |/ cos α |P D| = (Px − Dx )2 + (Py − Dy )2 , |P E| = (Px − Ex )2 + (Py − Ey )2 Marcin Majak Raycasting 19/30
  • 20. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Efekt rybiego oka Aby pozbyć się efektu “Rybiego oka” należy nasze otrzymane wcześniej wyniki przeskalować: Poprawna odległość = Zniekształcona odległość · cos β (1) Sposób jak pozbyć się tego efektu RayCastingRybieOko.zip Efekt rybiego oka Marcin Majak Raycasting 20/30
  • 21. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Plan prezentacji 1 Wprowadzenie 2 Początkowe ustalenia 3 Obliczanie odległości od obiektów 4 Ostateczny rezultat 5 Rysowanie podłogi 6 Rysowanie sufitu Marcin Majak Raycasting 21/30
  • 22. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Ostateczne wyrażenie do obliczenia wysokości przedmiotu widzianego przez obserwatora: HRzeczywiste h= · DP rojectionP lane (2) DP romienia Jak wyliczyć ostateczną wysokość Marcin Majak Raycasting 22/30
  • 23. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Ostateczny efekt RayCastingPrzykladowyWynik.zip Marcin Majak Raycasting 23/30
  • 24. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Plan prezentacji 1 Wprowadzenie 2 Początkowe ustalenia 3 Obliczanie odległości od obiektów 4 Ostateczny rezultat 5 Rysowanie podłogi 6 Rysowanie sufitu Marcin Majak Raycasting 24/30
  • 25. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Rysowanie podłogi Rysowanie podłogi należy rozpocząć od punktu, w którym kończy się nasz Projection Plane. Formuła na wyliczenie pierwszego przecięcia promienia z podłogą jest następująca: Hgracza odległość do P = · DP P (3) HsrodekP P Marcin Majak Raycasting 25/30
  • 26. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Jak uzyskać prawidłowy wynik Aby wyliczyć rzeczywistą odległość podłogi od oczu gracza należy przeskalować otrzymany powyżej wynik: odległość od P Prawdziwa odległość = (4) cos β Sposób rysowania podłogi Marcin Majak Raycasting 26/30
  • 27. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Plan prezentacji 1 Wprowadzenie 2 Początkowe ustalenia 3 Obliczanie odległości od obiektów 4 Ostateczny rezultat 5 Rysowanie podłogi 6 Rysowanie sufitu Marcin Majak Raycasting 27/30
  • 28. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Rysowanie sufitu Rysowanie sufitu jest podobne to omówionego wcześniej rysowania podłogi. Również należy wyznaczyć początkową odległość obserwatora od punktu przecięcia z sufitem. Sposób rysowania sufitu RayCastingOkienko.zip Marcin Majak Raycasting 28/30
  • 29. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Kolejne spotkanie Temat: Subversion - system kontroli wersji Prowadzenie: Michał Walczak Data: 26.11.2009, godzina: 17.00 Gdzie: sala 23 C-3 Marcin Majak Raycasting 29/30
  • 30. Studenkie Koło Naukowe ISA2 Warsztaty programistyczne J2ME 19 listopada 2009 Więcej informacji Kontakt z autorem: 164000@student.pwr.wroc.pl Strona koła naukowego ISA2 http://autonom.ict.pwr.wroc.pl/ Strona warsztatów: http://autonom.ict.pwr.wroc.pl/∼mstachniuk Adres tego dokumentu: http://autonom.ict.pwr.wroc.pl/∼mstachniuk/files/warsztaty2009/05-raycasting-2009.11.19.pdf J2ME Tworzenie gier – Janusz Grzyb ftp://ftp.helion.pl/online/j2metg/j2metg-3.pdf Creating 2D Action Games with the Game API http://developers.sun.com/mobility/midp/articles/game/ Wikipedia: Raycasting http://pl.wikipedia.org/wiki/Ray casting Strona z tutorial’em http://www.permadi.com/tutorial/raycast/ NetBeans http://www.netbeans.org/ Marcin Majak Raycasting 30/30