piątek, 14 kwietnia 2017

[DSP2017] 14# Aaa, goni mnie zombi - preludium do gry

Zbliżamy się do półmetku, pasowałoby scalić dotychczasową wiedzę w jakąś prostą grę na HoloLens. Chciałbym sobie powalczyć z jakimiś stworami, które zaatakują mnie w pokoju. Strzelałbym sobie do nich laserem albo hm… wyrzutnią rakiet, one też mogłby mnie atakować. Najwyżej… zginę zastrzelony. BTW czy można zginąć w HoloLens?  Taka wizja na walkę w pokoju na początek wystarczy.

Pasowałoby jednak najpierw podszkolić się z samego Unity i pisania w nim gier. Rzuciłem okiem na kilka książek o Unity, całkiem dobrym wstępem wydaje się Unity for Absolute Beginners. Pokazuje sporo szczegółowych praktycznych kroków przy tworzeniu sceny z ogrodem, strachem na wróble, jakimiś dziwnymi stworzeniami (hm ni to świnia, królik, chomik)… Nie wiem czy jest tylko dla żółtodziobów, w każdym razie ukazuje sporo uporządkowanej wiedzy w oparciu o dość efektowną scenę i efekty, a nie każda książka jest taka. Eksperymentowałem coś z importem modelu i animowaniem go w trybie Humanoid. Odkryłem też polski portal http://mwin.pl/, który skupia się na Unity i grach, szczególnie interesujący wydaje się tam Unity3d FPS Tutorial złożony z kilkunastu odcinków. Jednak po jakimś czasie uznałem, że wejdę w temat przerabiając najpierw jakieś tutoriale z samego Unity. Jest tam esencja praktyki pokazywana na wideo. Najbardziej póki co przykuła moją uwagę gra Survival Shooter. Tam gracza reprezentuje biały skrzat ze strzelbą, a podążają za nim złe zombie, kojarzące mi się nieco… z misiem Uszatkiem.

Dziś napiszę trochę o tym, co zwróciło moja uwagę po wykonaniu 4 pierwszych części tutorialu:

Co prawda do HoloLens najbardziej przydatny myśle okaże się zombi z 4-tej części, ale wszędzie można się czegoś dowiedzieć. 

I tak przykładowo, biały skrzat (gracz) jest wiązany z Animator Controller-em PlayerAC, do którego przekazywane są parametry na tranzycjach między stanami. Dzięki temu możemy potem z poziomu skryptów sterować przechodzeniem między stanami animacji. Hola, hola może bardziej po kolei. Jak utworzymy Animator Controller, przeciągniemy go na obiekt Player i potem wejdziemy w zakładkę Animator, to stany możemy łatwo dodać przeciągając elementy Death, Idle i Move z modelu Player. Kolor pomarańczowy oznacza stan domyślny, jeśli chcemy by był to inny stan niż pierwszy przez nas przeciągnięty wystarczy wybrać Set As Layer Default State w menu kontekstowym pożądanego stanu. Tranzycję tworzymy na stanie wybierając z menu kontekstowego Make Transition i przeciągając ją na wskazany stan docelowy. Parametry definiuje się w zakładce Parameters. W tym przypadku jest to IsWalking typu bool oraz Die typu Trigger. Teraz w inspektorze tranzycji można w sekcji Conditions wskazać parametry, od ktorych będzie zależne działanie przejścia.

Game2

Skrypt PlayerMovement podpięty pod obiekt Player dzięki linii:

anim.SetBool("IsWalking", walking);

powoduje, że obiekt animatora ustawia zmienną IsWalking, co wpływa na odpalenie animacji Move dla skrzata.

Zarówno skrzat, jak i zombi mają obiekty typu RigidBody i collider (kapsuła, a w przypadku zombi także sfera). Jak już wiemy pozwala to m.in na odbicia i wykrywanie kolizji. Najciekawszy jest jednak tutaj zupełnie dla mnie nowy element NavMeshAgent. To dzięki niemu wrogie nam zombi wie, gdzie jesteśmy i wie, jak podążać za nami!!!  Zombi za nami idzie dzięki prostemu skryptowi EnemyMovement:

public class EnemyMovement : MonoBehaviour
{
    Transform player;   
    UnityEngine.AI.NavMeshAgent nav;

    void Awake ()
    {
        player = GameObject.FindGameObjectWithTag ("Player").transform;       
        nav = GetComponent <UnityEngine.AI.NavMeshAgent> ();
    }

    void Update ()
    {        
       nav.SetDestination (player.position);       
    }
}

Game1

Co się przesunę choćby klawiszami S, W, A, D to zombi i tak do mnie przyjdzie po jakimś czasie dłuższym lub krótszym. Nieuchronnie zawsze do mnie dotrze. Robi się groźnie, a do dopiero początek. Przede mną walka z całą armią zombie i to na dodatek w moim własnym pokoju!  Trzeba nabrać sił podczas świąt, by ta walka była wygrana.

poniedziałek, 10 kwietnia 2017

[DSP2017] 13# Vuforia, HoloLens, a także… czajnik na głowie

Vuforia to biblioteka pozwalająca wyłapywać przedmioty z otaczającej nas rzeczywistości i dodawać do nich dodatkowe elementy czy poddawać animacji… Mogą to być płaskie obrazy, ale także przestrzenne przedmioty jak np. podełko po ciastkach, zabawka itd oraz specjalne znaczniki. Vuforia wspiera Unity, platformy mobilne tj. Android, iOS czy Windows Universal, a także HoloLens!

Na początek kilka przydatnych linków, na które rzuciłem okiem, by zapoznać się z tematem:

Vuforia jest dostępna jako rozszerzenie  dla Unity w postaci pakietu. Możemy go zaimportować do naszego projektu. Również sztandarowy przykład ładujemy do Unity jako rozszerzenie (już bez osobnego importu rozszerzenia Vuforii, które jest w nim). Po jego otwarciu w Unity widzimy dwa czajniki, w czasie działania aplikacji pojawią się wtedy, gdy zostaną wykryte skojarzone z nimi obrazki.

Capture03

Aby móc to odpalić, musimy wcześniej wygenerować sobie klucz licencyjny (do deweloperskiej zabawy bez publikacji, sprzedaży, wdrożeń jest darmowy). Niestety, jeśli dysponujemy tylko emulatorem HoloLens, to tego nie sprawdzimy. Vuforia pozwala co prawda jeszcze używać kamery internetowej do podglądu sceny w trybie Play w samym Unity, ale w przypadku projektu dla HoloLens to nie działa, o czym pisze nawet w dokumentacji. Wobec takiej sytuacji mógłbym tutaj zakończyć tego posta albo nie poruszać w ogóle takiej tematyki, ale wpisy HoloLens, Unity and Recognition with Vuforia (Part 1) oraz HoloLens, Unity and Recognition with Vuforia (Part 2) zachęciły mnie na tyle, że postanowiłem nawet bez integracji z HoloLens wypróbować rozpoznawanie własnych przedmiotów przez Vuforię.

Na pierwszy raz niech idzie płaski obraz. Wyjąłem jeden z moich singli z szuflady, położyłem na parapecie i zrobiłem mu zdjęcie. Wyciąłem tak by mieć zdjecie tylko przedniej okładki. Na portalu Vuforii w sekcji Develop –> Target Manager założyłem swoją bazę o nazwie HoloVision dla Device (w urządzeniu, nie przez chmurę). Następnie wybrałem Add Target i pojawiło się następujące okienko dialogowe:

Capture1

Wybrałem Single Image, wybrałem mój obrazek z dysku (aha, skompresowałem go by zajmował mniej niż 2MB, bo jest limit na rozmiar). Podałem szerokość 12cm w metrach jako 0.12.

Database

Po chwili przetwarzania obraz został dodany do bazy. Widzimy, że dostał 5 gwiazdek, więc powinien być łatwo rozpoznawalny. W jego szczegółach możemy zobaczyć punkty znaczące oznaczone kolorem żółtym. Całą bazę pobrałem jako pakiet Unity naciskając Download Database.

Capture04

Teraz wziąłem sobie przykład ImageTargets-6-2-10.unitypackage z Core Features dla Unity. Zaimportowałem do niego pakiet, który przed chwilą pobrałem ze strony. Automatycznie jednak to nie poszło. W Assets musiałem odszukać teksturę madryt_scaled z mojej bazy do rozpoznawania i ustawić w inspektorze Texture Type na Default i Texture Shape na 2D.

Capture01

Następnie na ImageTargetChips (mogły być też ImageTargetStones czy ImageTargetTarmac) w skrypcie ImageTargetBehaviour zmieniłem Database na moją HoloVision, co spowodowało także zmianę Image Target na jedyny zawarty w niej obraz, czyli madryt. Szerokość ustawiła się na 0.12, a wysokość odpowiednio się przeliczyła.

Capture02 X

Zaznaczam ARCamera (jeden z najważniejszych elementów Vuforii w Unity) w Hierarchy i z poziomu jej inspektora otwieram ustawienia dla Vuforii. Do pola App License Key wklejam deweloperski klucz licencyjny, który wcześniej utworzyłem sobie na portalu. Aha, ważne jest, aby w sekcji Datasets nasza baza była załadowana i aktywna. W moim przypadku tak nie było i przy HoloVision zaznaczyłem oba checki. Na dole w sekcji Webcam można zarządzać ustawieniami kamery internetowej, która może posłużyć dla trybu Play w Unity.

Uwaga. Teraz podam przepis na najbardziej oryginalne selfie, jakie sobie kiedykolwiek zrobiłem. Włączam tryb Play w Unity. Nad głową w dłoni trzymam płytę, która powinna zostać rozpoznana i bach, pojawia się nad nią czajnik, którego w rzeczywistości nie ma!

CzajnikX

Nawiasem mówiąc wyszło…. takie małe nawiązanie do Zaciera, który w realu na koncertach nosi często garnek lub czajnik na głowie –SmileTo chyba najbardziej zwariowany odcinek, powstał dość spontanicznie, ale tak jest chyba właśnie najlepiej. Zobaczymy, co następnym razem urodzi się pod moją czaszką.

niedziela, 9 kwietnia 2017

[DSP2017] 12# Holowizja - rzut piłką w pokoju

Weekend, najwyższy czas już coś napisać. Mam na tapecie jeszcze co najmniej parę koncepcji związanych z HoloLens czy Unity, które chciałbym tutaj w najbliższym czasie wypróbować. Nie ukrywam, że z fizycznymi okularami tych rzeczy byłoby więcej i mogłyby być jeszcze ciekawsze jak choćby  na blogu https://mtaulty.com/ prosto z UK. Tym niemniej podziałamy wszędzie tam, gdzie będzie to możliwe.

Dziś przyszło mi do głowy, by porzucać sobie piłką po pokoju. W Unity możemy związać siłę z wybranym przedmiotem, nie musi to być grawitacja, o której kiedyś już wspominałem.

Na warsztat wziąłem scenę z HoloVision7, która zamieniła się dziś w HoloVision9. Jednak zanim do tego doszło miałem problem z załadowaniem projektu do Unity, zresztą nie tylko tego. Stało się to pobraniu moich źródeł z githuba. Przy każdym skrypcie w inspektorze pojawił się żołty trójkąt informujący o jego niezaładowaniu. Koniec końców zrobiłem sobie na boku nowy projekt w Unity, zaimportowałem do niego HoloToolkit (dla kompatybilności HoloToolkit-Unity-v1.5.5.0.unitypackage, ale wiem jest już nowszy) i okazało się, że w pobranych z githuba źródłach nie było wszystkich plików z HoloToolkit (plugin dla x64 i x86), a także plików *.rsp w katalogu Assets. Po ich przegraniu mogłem dalej działać.

Kamera na scenie otrzymała wcześniej używany już skrypt SetGlobalListener, a także nowy o nazwie ThrowBall, który został przedstawiony poniżej:

public class ThrowBall : MonoBehaviour, IInputClickHandler
{
    public float ForceMagnitude = 300f;   

    public void OnInputClicked(InputEventData eventData)
    {
        Throw();
    }

    private void Throw()
    {
        var ball = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        ball.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);

        var rigidBody = ball.AddComponent<Rigidbody>();
        rigidBody.mass = 0.5f;
        rigidBody.position = transform.position;

        var transformForward = transform.forward;
        transformForward = Quaternion.AngleAxis(-10, transform.right) * transformForward;

        rigidBody.AddForce(transformForward * ForceMagnitude);
    }
}

Każde “kliknięcie” użytkownika (air tap) powoduje wyrzucanie piłki. Tworzony jest dynamicznie obiekt typu sfera, do którego dodawany jest element rigid body. Do niego przykładamy siłę o określonej wartości i kierunku. Piłka ma masę i może się zderzać z innymi przedmiotami lub ścianami pokoju.

Zamiast sześcianu i kuli stworzyłem trzy sześciany, tak że na dwóch stoi trzeci. Do każdego z nich także dodałem rigid body. Niestety sześciany po uruchomieniu aplikacji spadały w nicość zanim siatka pokoju się rysowała. W związku z tym opadnięcie sześcianów na podłogę wyzwalam 10 sekund po starcie.  Do każdego z nich przypiąłem taki skrypt:

public class GravityAfterSeconds: MonoBehaviour
{

    void Start()
    {
        StartCoroutine(Shoot());
    }

    IEnumerator Shoot()
    {

        yield return new WaitForSeconds(10);
        OnShoot();
    }

    public void OnShoot()
    {
        if (!this.GetComponent<Rigidbody>())
        {
            var rigidbody = this.gameObject.AddComponent<Rigidbody>();
            rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
        }
    }
}

Aha, zapomniałem dodać, że zmieniłem sobie czerwony materiał siatki pokoju na zielony, ale nie jest to bardzo istotne w tym scenariuszu. Na “dzień dobry” otrzymujemy widok:

Capture7

Klikam (prawy przycisk myszy lub Enter na emulatorze), wylatuje kula, uderza w “misterną” konstrukcję sześcianów, która się rozpada. Oto co z niej pozostało:

Capture8

Można uznać to za pierwszy mały krok w kierunku gry opartej o strzelanie. Nie wykluczam, że będzie jakaś kontunuacja tego wątku. Bo kto nie chciałby postrzelać sobie do postaci wychodzących ze ścian pokoju?

Do następnego razu.

środa, 5 kwietnia 2017

[DSP2017] 11# Mixed Reality Portal w Windows 10 Creators Update

Lżejszej tonacji trzymać się będziemy także dziś. W telegraficznym skrócie opowiem o rzeczywistości rozszerzonej w nadchodzącym Windows 10 Creators Update oznaczonym jako wersja 1703 (na PC premiera updatu 11 kwietnia , jako ręczna instalacja od 5). Jako Windows Insider jadę na najnowszym buildzie 15063.14.

Otóż od builda 15048 dostępne jest coś takiego jak Mixed Reality Portal. Jest to aplikacja, która po dołączeniu okularów (nie tylko HoloLens) ma pozwolić na podgląd widoku w czasie rzeczywistym, oferuje też tryb symulacji nie wymagający żadnych fizycznych urządzeń. Tryb symulacji ma jedną przewagę na HoloLens emulatorem - wykonuje się bezpośrednio w sesji desktopowego Windows 10, a nie jako maszyna wirtualna. Ma też pewne wady, o czym później. Kilka przydatnych linków:

Do szybkiego “zanurzenia się” w Mixed Reality Portal polecam poniższy filmik:

Wszystko git, ale własnych projektów wyeksportowanych z Unity do Visual Studio i ztargetowanych w manifeście na “Windows.Holographic” nie jestem wstanie wgrać na swój laptop z Windows 10. Jak zmienię target na Windows.Universal to aplikacja się wgra, ale nie uruchomi. Inna sprawa że symulator mi działa, ale moja nienajnowsza maszyna z Windows 10 nie została zaklasyfikowana przez instalator Mixed Reality Portal jako zdolna do wyświetlania mixed reality (podobnie jak autorowi ostatniego linka podanego powyżej wyskoczył mi krzyżyk przy karty graficznej i gniazdku USB 3.0, które… posiadam). Może to ma jakiś wpływ na brak możliwości wgrywania projektów targetowanych na Windows.Holographic? Ale nie wiem czy się powinny wgrywać, nie jest to nigdzie dokładnie opisane. Dokumentacja do symulatora Microsoft wspomina tylko ogólnie, że trzeba wgrać na lokalną maszynę Windows zamiast na emulator HoloLens. Inna jeszcze sprawa, że nie wgrałem jeszcze najnowszego Windows 15063 SDK (jakby to coś zmieniło to zaktualizuję tego posta). Póki co odpaliłem w Mixed Reality Portal swoją dość dawną już aplikację uniwersalną na Windows 10 do wyszukiwania klipów wideo na YouTube i ich pobierania:

mp1

Mam nadzieję że pomimo wskazania pewnych problemów zachęciłem do aktualizacji Windows 10 do najnowszej wersji. Przy odpowiedniej karcie i jakichś okularach do rozszerzonej rzeczywistości naprawdę można będzie popłynąć. To tyle na dziś. Widzimy się za parę dni.

sobota, 1 kwietnia 2017

[DSP2017] 10# Współdzielenie holowizji

Zwykle stawiam na ciężkie, mocno techniczne granie. Dziś będzie nieco krócej i lżej, mniej technicznie, z uwagi na pewne utrudnienia w emulacji. Zagadnienie, które nakreślę jest jednak bardzo interesujące i na pewno warto być świadomym możliwości HoloLens w tym zakresie. Niewykluczone zresztą, że kiedyś powrócę do tego tematu, bardziej uzbrojony.

O ile wizja kojarzy się nam zwykle z doznaniami jednostki, o tyle HoloLens pozwala także na wspólne przeżywanie wizji przez grupę użytkowników, która niekoniecznie musi być w jednym pokoju (wystarczy połączenie internetowe).

Zamieszczam krótkie podsumowanie do tutoriala Holograms 240: Sharing holograms, z którym zapoznałem się i częściowo zacząłem wykonywać. Pokazuje on dość wyczerpująco kilka funkcjonalności w zakresie współdzielenia:

1#  Kilka osób może widzieć to samo. Pierwsza osoba coś pokaże, inne osoby dołączają się później do sesji i mogą to zobaczyć. Na komputerze uruchamiany jest sharing service z HoloToolkit, który jest dostępny w sieci pod wskazanym adresem IP i na określonym porcie. Każdy z użytkowników wgrywa na swoją parę okularów aplikację, która zna namiary na wspomniany serwis.

image

Chłopak i dziewczyna z przyszłości –Smile

2# Poszczególne osoby z grupy współdzielącej wizję mogą być w niej reprezentowane jako avatary, związane z położeniem głowy. Avatary można sobie wybierać, a także je wyłączać.

image

Impreza u znajomych z przyszłości cz.1 –Smile

3# Grupa może wykonywać operację, której nie wykona pojedyncza jednostka. Przykładowo można wspólnie coś umieścić (np. w środku między dwiema osobami) lub zmienić (np. jak wszyscy staną w koło, to coś dodatkowo się pojawi)

image

Wspólne nakrywanie stolika –Smile

#4 Hologramy widziane przez grupę mogą oddziaływać z prawdziwymi elementami pokoju np. ścianami, meblami czy innymi osobami. Jakoś to mnie nawet nie dziwi, po wcześniejszych eksperymentach z mapowaniem przestrzennym dla pojedynczego użytkownika.

image

Impreza u znajomych z przyszłości cz.2

Wszystko dobrze, a co jeśli nie mamy fizycznych okularów albo mamy tylko jedną parę? Przy pomocy emulatora jesteśmy w stanie przetestować tę funkcjonalność, ale potrzebne są do tego trzy komputery. Na jednym odpalamy sharing service, na dwóch pozostałych Visual Studio i emulatory HoloLens z aplikacją. Nie jest możliwe, by na jednym komputerze był serwis i emulator. Więcej o tym można poczytać na forum HoloLens w wątkach Hologram sharing i Sharing Holograms in Hololens emulator. Nie pisze o tym na pierwszych stronach gazet –Smile

Nie dysponuję trzema PC-tami, a z uwagi na to, że emulator ma dość wysokie wymagania nie będę na razie też eksperymentować z maszynami wirtualnymi, zresztą o takim rozwiązaniu na forum nikt nie pisał.

Do zobaczenia następnym razem.

czwartek, 30 marca 2017

[DSP2017] 9# Holowizja - choć pomaluj mój świat na żółto i na niebiesko…

Dziś małe uzupełnienie poprzedniego odcinka. Pokażę krótko, jak pokolorować ściany, podłogę i sufit pokoju i bynajmniej nie mam tu na myśli pracy malarza… bo stanie się to tylko w naszej głowie z HoloLens.

Do sceny z  HoloVision7  dodaję game obiekt o nazwie SpatialProcessing, a do niego skrypty z HoloToolkit o nazwach SurfaceMeshesToPlanes i RemoveSurfaceVertices oraz skrypt PlaySpaceManager z Holograms 230: Spatial mapping (z zakomentowaną linią

SpaceCollectionManager.Instance.GenerateItemsInWorld(horizontal, vertical);

odpowiedzialną za umieszczanie obiektów na scenie)

R0

W SurfaceMeshesToPlanes wybieramy w Surface Plane Prefab komponent SurfacePlane. Z kolei w inspektorze tego ostatniego ustawiamy materiały dla ścian, sufitu, podłogi, stołu pokoju.

image

Materiały dla nich możemy zdefiniować sami albo dla testu wykorzystać z Holograms 230: Spatial mapping.

Generalnie chodzi o to by przetworzyć zmapowaną przestrzeń, wykryć w niej podłogę, ściany, sufit czy stół, a potem je pokolorować.

Oto co wynurzyło się przed moimi oczami (po przejściu przez ścianę cofając się do tyłu z początkowego punktu, który był zdaje się w jakimś pustościanie).

R6

Scena dostępna na github jako HoloVision8.

Chciałem jeszcze umieścić bez ingerencji użytkownika na ścianie jakiś przedmiot, ale okazało się to niezbyt proste. Owszem Holograms 230: Spatial mapping dostarcza skrypty, które to robią, ale zależą one od starszej początkowej wersji Holo toolkitu. W nowym HoloToolkicie odnajdziemy natomiast skrypt TapToPlace, który przypięty do obiektu sprawi, że gdy najedziemy na niego kursorem i naciśniemy, to obiekt będzie podążał za kursorem osadzając się na siatce pokoju. W testowej scenie toolkitu nawet to działa, na mojej scenie póki co nie uzyskałem tego efektu. Inna sprawa, że samo renderowanie tej siatki, a potem wykrywanie ścian i kolorowanie nie działa natychmiast, a losowo w emulatorze może wyświetlić się scena bez pokoju…

Cześć, do następnego zwariowanego odcinka –Smile

sobota, 25 marca 2017

[DSP2017] 8# Holowizja - gdy zwykły pokój przestaje być zwykłym pokojem…

A gdyby pokój, w którym siedzę lub stoję, przestał być zwykłym pokojem i wzbogacić go o elementy nowe, na które oddziałują te dotychczasowe prawdziwe ?

HoloLens dzięki mapowaniu przestrzennemu (spatial mapping) może spełnić takie życzenie. Dziś przejdziemy drogę dla absolutnie początkujących w tym zakresie. Zobaczymy dobrze znany już nam sześcian i kulę w powietrzu, które po umieszczeniu na nich kursora i wypowiedzeniu magicznego “Shoot down” spadną z pewnym łoskotem na podłogę pokoju, po drodze być może odbijając się od innych przedmiotów.

Room1

W pokazanym pokoju “zestrzelony” słowem sześcian spadł za czarną bryłę i straciłem go z oczu w tej perspektywie, natomiast “zestrzelona” kula odbiła się kilka razy i dotoczyła się do lewego kąta podłogi.

Room2

A teraz już do rzeczy i po kolei, jak takie coś osiągnąć i skąd ta czerwona siatka, o której jeszcze nic nie wspomniałem.

Na bazie poprzedniego przykładu HoloVision6 przygotowałem wyjściową scenę, do której dodamy przestrzenne mapowanie. Usunąłem zieloną płaszczyznę pod sześcianem i kulą. Kierując się większym komfortem, wyłączyłem sobie jęczące audio source na sześcianie (odznaczyłem checka), choć nie było to konieczne. W Edit > Project Settings > Player w sekcji Publishing Settings upewniamy się, czy SpatialPerception jest zaznaczone.

Teraz sprawa kluczowa. W Unity przeciągamy z Assets  HoloToolkit/SpatialMapping/Prefabs/SpatialMapping.prefab do Hierarchy na główny poziom. Zaznaczamy opcję Draw Visual Meshes. W Spatial Mapping Manager w Surface Material ustawiamy Wireframe (na screenie poniżej jest RedWireframe, ale o tym nieco później).

Room3

Jakbyśmy mieli fizyczne urządzenie, to otaczający nas pokój zostałby zmapowany za pomocą siatki podzielonej na trójkąty. Emulator nie pozostawia nas jednak całkowicie bez szans i oferuje kilka predefiniowanych pokojów, które można do niego załadować.

image

Po odpaleniu na emulatorze zobaczymy już białą siatkę pokoju.

Skanowanie prawdziwego pokoju za każdym razem jest nieco czasochłonną i skomplikowaną czynnością. Zeskanowany model można w Device Portal zapisać do pliku. Wchodzimy na zakładkę 3D View. Pod Spatial mapping naciskamy przycisk Update, co spodowoduje pokazanie się modelu. Następnie naciskamy przycisk Save.

 Room7

HoloToolkit także dostarcza przykładową siatkę pokoju. Znajdziemy ją w Assets w HoloToolkit/SpatialMapping/Tests/Meshes/SRMesh.obj. Jak przeciągniemy ją na pole Room Model skryptu Object Surface Observer w inspektorze SpatialMapping, to będzie prezentowana zamiast pokoju dostarczanego na żywo (czy też wybranego do załadowania w emulatorze).

Co nam to daje w stosunku do wcześniejszego ładowania przykładowego pokoju wprost z emulatora?  Otóż teraz już w Unity mogę podejrzeć tę siatkę przechodząc w tryb podglądu za pomocą przycisku play na górze.

Room4

Aha, czemu jest ona u mnie czerwona? Biała wydawała mi się zbyt banalna i przygotowałem sobie materiał o nazwie RedWireframe w Assets/Materials na podstawie kopii Wireframe dostarczanego przez HoloToolkit (w HoloToolkit/SpatialMapping/Materials). W inspektorze RedWireframe ustawiłem Wire color na czerwony. Następnie w inspektorze SpatialMapping w polu Surface Material ustawiłem ten materiał (skrypt Spatial Mapping Manager).

Siatkę pokoju w Unity zobaczyć możemy również na scenie. Wystarczy będąc w trybie podglądu przejść do zakładki Scene.

Room5

Przedstawioną tutaj scenę z siatką i bryłami w powietrzu udostępniłem jako HoloVision7 na github.

To oczywiście nie jest wszystko, co można osiągnąć w mapowaniu przestrzennym w HoloLens. Jak zawsze wskażę tu tutoriale z Holo Academy: Holograms 101E: Introduction with Emulator (ostatnia sekcja) oraz Holograms 230: Spatial mapping. Zmapowany pokój można sobie pokolorować, wykryć w nim ściany, podłogę i sufit, coś sobie na nich poumieszczać (programowo lub pozwolić na to samemu użytkownikowi naszej aplikacji). Uwzględnienie chowania się przedmiotów za inne przedmioty też jest istotne, można niewidoczne ich części prezentować w odmienny sposób np. jako siatkę. Sprawia to wrażenie jakbyśmy mieli Rentgen w oczach.

Kolejny równie awangardowy i niczym nieograniczony odcinek rodzi się już w mojej głowie. A zatem do następnego razu!