poniedziałek, 13 marca 2017

[DSP2017] 5# Holowizja - strzał palcem

Witam ponownie w moich wizjach holograficznych. Na razie kontynuuję zaznajamianie się z platformą HoloLens. Dziś coś napiszę o gestach za pomocą dłoni.

Ze spraw poruszanych w rozdziale trzecim Holograms 101E: Introduction with Emulator oraz Holograms 211: Gesture póki co wybrałem sobie do sprawdzenia kursor z feedbackiem na pojawienie się dłoni oraz obsługę zdarzenia “air tap”. Podnosimy palec, zgłaszamy w ten sposób gotowość. Jeśli potem go opuścimy, to tak jakbyśmy kliknęli, tyle że w powietrzu. W jednej wersji HoloLens jest jeszcze clicker, by go używać zamiast ciągle swojego palca.

Możliwości w obsłudze gestów jest więcej. Można zdarzenie nawigacji wykorzystać do obracania przedmiotu za pomocą palca, czy też w ogóle śledzić dłonie i używać ich do manipulacji. HoloLens może też podpowiadać, kiedy nasze dłonie będą blisko wyjścia poza jego obszar obserwacji.

Za pomocą emulatora można zasymulować pojawienie się dłoni lewej i prawej z podaniem ich położenia:

EmulatorSettings

Naciśnięcie Enter oznacza “air tap”, a jeśli naciśniemy Alt i trzymajac prawy przycisk myszy zaczniemy przesuwać kursor, to nawet zdarzenie nawigacji/przewijania zasymulujemy i obrócimy sobie np. kosmonautę z Holograms 211. 

Holo akademia bazuje na elementach dość wczesnej wersji Holo Toolkit. W przykładzie podanym poniżej wypróbowałem najnowszą wersję toolkita pod kątem kursora i air tap.

Zacznijmy od kursora z feedbackiem. Chodzi o to, by po pojawieniu się dłoni kursor zmienił swoją postać np. na dłoń. Na scenie z sześcianem znanej z HoloVision3 poprzedni kursor zastąpiłem nowym z pliku CursorWithFeedback.prefab (Assets > HoloToolkit > Input > Prefabs > Cursor).

Teraz pora na obsługę “kliknięcia”. W tym celu w katalogu Scripts w Assets utworzyłem nowy skrypt C# o nazwie CubeCommands i przypiąłem do sześcianu. Kod skryptu przedstawia się następująco:

public class CubeCommands : MonoBehaviour, IInputClickHandler
{
    public void OnInputClicked(InputEventData eventData)
    {
        if (!this.GetComponent<Rigidbody>())
        {
            var rigidbody = gameObject.AddComponent<Rigidbody>();
            rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
        }
    }
}

Jak widzimy, zaimplementowałem metodę OnInputClicked z interfejsu IInputClickHandler. Jeśli obiekt nie miał poczucia grawitacji, czyli obiektu Rigidbody, to dodaję mu taki. Sześcian po zajściu takiego zdarzenia powinien spaść w dół (dla zmniejszenia zamieszania z kolorem wyrzuciłem poprzedni skrypt ustawiajacy kolor sześcianu na czerwony po objęciu go wzrokiem).

Odpalam i … nie działa. Szybko na logikę wywnioskowałem, że może potrzeba jakiegoś odniesienia, by sześcian miał na co spaść. I tak do sceny dołożyłem płaszczyznę, czyli obiekt typu Plane (Hierarchy: Create –> 3D Object –> Plane). Ustawiłem to nieco, by lepiej wyglądało w kamerze, sześcian też poprawiłem. Dla lepszego nastroju zmieniłem sobie światło na kolor niebieski. Dokładne ustawienia można odczytać sobie w Unity z tego projektu, pobierając go z gałęzi HoloVision4 na github.

Eksportuję once again do Visual Studio. Odpalam:

Schot1

Jak w ustawieniach emulatora pokażę lewą dłoń, to kursor zmieni się w dłoń. Taką postać też przyjmie podczas “klikania palcem”. Naciskam Enter i buch, szescian leci w dół!

Schot2

Hurra! 

Zamierzałem się jeszcze pobawić obracaniem sześcianu przy pomocy nowego Holo Toolkit, ale w jego plikach testowych i komponentach nie widzę dobrego przykładu na obsługę zdarzenia nawigacji/scrollowania. Ludzie pytają o to na forach, więc jest coś na rzeczy. Zawsze mogę użyć elementów bazujących na starszym toolkicie z akademii HoloLens, ale może znajdę działające rozwiązanie przy pomocy najnowszego API. Zobaczymy. Jak znajdę, na pewno o tym napiszę. A tymczasem do zobaczenia w następnym odcinku.

Brak komentarzy: