Dawno, dawno temu, ludzkość marzyła o pełnej integracji komputerów z życiem codziennym. Jak wiadomo, niezbyt się to udało, przynajmniej taki stan mamy na dzień dzisiejszy.
Jedną z technologii związanych z integracją świata wirtualnego i rzeczywistego jest szeroko pojęte Augmented Reality. Działanie AR opiera się na różnych implementacjach i rozwiązaniach, natomiast wspólny jest efekt: nałożenie, w czasie rzeczywistym, dodatkowych informacji wirtualnych na obraz świata rzeczywistego - zależnie od formy albo jako HUD na światłoprzepuszczalnej powierzchni, albo jako modyfikacje obrazu z kamery cyfrowej. Niżej zamieszczam pomysł prostego rozwiązania AR stosowalny, gdy dysponujemy zestawem: GPS + akcelerometr/żyroskop+kompas cyfrowy.
Rysowanie elementów AR oprzemy o dowolną bibliotekę do grafiki 3D - XNA, Direct3D, OpenGL lub cokolwiek innego. Co nam potrzebne, to generowanie macierzy widoku z kamery trzywektorowej (pozycja, kierunek, góra) oraz generowanie macierzy projekcji bazującej na kątach.
Założenia
Dla niewielkich (kilka km) odległości można przyjąć, że Ziemia jest płaska. Uznajmy więc, że punkt, w którym się znajdujemy (na podstawie danych GPS) ma pozycję (0,0,0), a jedna sekunda kątowa to 100 jednostek układu współrzędnych. Na tej podstawie rozmieśćmy poszczególne elementy do wyświetlenia w przestrzeni 3D (można założyć, że przy braku wysokości definiujemy jakąś rozsądną - albo 0, albo odpowiednik 1-3m powyżej pozycji telefonu). Warto założyć też, że północ określa nam "przód" widoku (standardowy).
Pozycja
Celem optymalizacji, nie przeliczamy wszystkich punktów co klatkę. Załóżmy po prostu, że początkowa pozycja GPS to (0,0,0) i przekształcajmy ją odpowiednio zależnie od naszego przemieszczenia. Ważna uwaga: wysokość podawana przez odbiorniki GPS jest bardzo niedokładna, sugeruję (jeśli nie jest koniecznie potrzebna) zakładać, że zawsze wynosi 0. Oczywiście, jeśli przemieścimy się o około 30-60% "zmapowanego" obszaru, który traktujemy jako płaski, warto przeliczyć wyświetlane punkty - dokładność AR spada wraz ze wzrostem odległości pomiędzy dwoma teoretycznie "płaskimi" punktami.
float3 pos = float3(gps.LatitudeFloat * AR.LatitudeToUnitFactor, gps.LongitudeFloat * AR.LongitudeToUnitFactor, 0);
if(pos.Length > AR.MaxDistance/2)
RecalculatePositions();
Kierunek
Z kierunkiem jest znacznie więcej zabawy. Przyjmijmy, że wektor float3(0,0,1) odpowiada odbiornikowi skierowanemu na północ. Określając kąt z kompasu cyfrowego oraz kąt nachylenia telefonu ustalamy wektor kierunku na potrzeby AR.
float3 direction = float3(0,0,1).RotateX( ( accelUP *float3(0,1,0) ).Angle( float3(0,0,1) ) ).RotateY( compassAngle );
Wektor góry
Tutaj sprawa jest prosta - używamy wektora podawanego przez akcelerometr, obróconego względem danych z kompasu.
float3 up = accelUP.RotateY( compassAngle );
Projekcja
W przypadku macierzy projekcji (FOV) potrzebujemy informacje: o kątach, jakie odbiera kamera oraz o zasięgu, w jakim chcemy renderować. Kąty trzeba zbadać empirycznie (nie wiem, czy jakaś platforma zwraca takie informacje), natomiast FOV ustawiamy na odległość, do jakiej zakładamy odczyt punktów.
Rendering końcowy
Renderujemy obiekty (bryły albo point sprites) korzystając z określonych wcześniej (dla każdej klatki) macierzy projekcji oraz widoku, następnie obraz tak otrzymany nanosimy na obraz z kamery. Dokładność rozwiązania jest wystarczająca, żeby na jego bazie opracować np. interaktywny przewodnik po mieście, natomiast w wypadku tworzenia np. nawigacji, przeliczanie punktów przy przemieszczeniu może działać zbyt wolno dla większości urządzeń.
Dwie dodatkowe uwagi:
- celem wykrywania kliknięcia wykrywamy standardowo kolizję półprostej (algorytmy z tym związane są w każdej właściwie grze FPS), natomiast przy wielu nachodzących na siebie punktach możemy spokojnie użyć odległości od kamery do wyznaczenia punktu "na przedzie"
- jeśli chcemy w jakiś sposób wykryć zaslanianie punktów przez np. budynki (co, moim zdaniem, zwykle nie ma sensu), konieczne jest w jakiś "sprytny" sposób przysłonięcie niewidocznych elementów - np. przez wyrenderowanie do Z-bufora przybliżonych brył budynków).
Brak komentarzy:
Prześlij komentarz