Trener ręczny — MRTK2

Menu trenera ręcznego

Trener ręczny jest modelowaną ręką 3D, która jest wyzwalana, gdy system nie wykrywa rąk użytkownika. Jest to zaimplementowane jako składnik "nauczania", który pomaga kierować użytkownika, gdy gest nie został nauczony. Jeśli użytkownicy nie wykonali określonego gestu przez pewien okres, ręce będą pętli z opóźnieniem. Trener ręczny może służyć do reprezentowania naciśnięcia przycisku lub odebrania hologramu.

Bieżący model interakcji reprezentuje szeroką gamę kontrolek gestów, takich jak przewijanie, dalekie wybieranie i bliskie naciśnięcie. Poniżej znajduje się pełna lista istniejących przykładów trenera hand:

  • Bliskie naciśnięcie — używane w przypadku przycisków lub bliskich obiektów z możliwością interakcji
  • Dalekie wybieranie — używane w przypadku obiektów, które są daleko
  • Move — służy do przenoszenia hologramu w przestrzeni
  • Obróć — służy do pokazywania, jak obracać hologramy lub obiekty
  • Skala — służy do pokazywania sposobu manipulowania hologramami w celu zwiększenia lub mniejszego rozmiaru
  • Ręczne przerzucanie — służy do tworzenia panelu startowego interfejsu użytkownika lub menu ręcznego
  • Palm up – używany do hummingbird moment w poza bokserskim doświadczeniem. Inną sugestią może być wyświetlenie panelu uruchamiania interfejsu użytkownika
  • Przewiń — służy do przewijania listy lub długiego dokumentu

Przykładowa scena

Przykłady można znaleźć w scenie HandCoachExample w obszarze: MixedRealityToolkit.Examples/Experimental/HandCoach/Scenes

Zasoby 3D ręczne

Zasoby można znaleźć w obszarze : MixedRealityToolkit.SDK/Experimental/HandCoach

Jakość

Jeśli zauważysz zniekształcenia siatki skóry, musisz upewnić się, że projekt używa odpowiedniej ilości stawów. Przejdź do pozycji Edytuj ustawienia projektu Quality Other Blend Weights (Edytuj > ustawienia > projektu) > Inne > wagi mieszanych. Upewnij się, że wybrano opcję "4 kości", aby zobaczyć Smooth Stawy. Ustawienie projektu

Skrypty

Wskazówka dotycząca interakcji

Skrypt InteractionHint.cs udostępnia funkcje otoki do wyzwalania animacji i zanikania na platformie ręcznej.

Jak skonfigurować wskazówkę interakcji

Aby skonfigurować wskazówkę interakcji, zaleca się użycie podanych prefab "StaticHandCoachRoot_L.prefab" i "StaticHandCoachRoot_R.prefab". Ten prefab zawiera skrypt InteractionHint i zestaw ręczny, a także odpowiednią hierarchię w celu zapewnienia, że dostarczone animacje wskazówek działają zgodnie z oczekiwaniami. W przeciwnym razie musisz umieścić skrypt na obiekcie gameObject jeden poziom nadrzędny z zestawu ręcznego z animatorem.

Właściwości inspektora

  • HideIfHandTracked Ten wartość logiczna określa, czy stan śledzenia rąk powinien być używany do ukrywania wizualizacji, gdy ręce użytkownika są śledzone. Jeśli ta wartość ma wartość false, zostanie użyta tylko właściwość skryptów "customShouldHideVisuals", aby określić, czy ukryć wskazówkę.

  • MinDelay Ta właściwość określa minimalne opóźnienie wyświetlania wizualizacji. Domyślnie wizualizacje dla ręki będą wyświetlane po tej wielu sekundach, jeśli ręce użytkownika nie są śledzone.

  • MaxDelay Ta właściwość określa maksymalne opóźnienie wyświetlania wizualizacji. Domyślnie wizualizacje dla ręki będą wyświetlane po tej wielu sekundach, nawet jeśli ręce użytkownika są śledzone.

  • UseMaxTimer Jeśli wartość logiczna jest ustawiona na wartość false, wyłącza maksymalny czasomierz i zezwala tylko na wyświetlanie wskazówek dłoni, gdy ręce użytkownika są poza widokiem, lub warunek niestandardowy zwraca wartość false.

  • Powtarza Ta właściwość określa, ile razy animacja wskazówek jest odtwarzana, gdy minie lub maksymalny czasomierz. Następnie wskazówka ukrywa się i czeka na opóźnienie ponownie.

  • Autoaktywowanie Gdy wartość logiczna jest ustawiona na true, wskazówka będzie automatycznie uruchamiana przez logikę czasomierza, gdy obiekt GameObject skryptu jest aktywny w hierarchii i skrypt jest włączony. Powinno to być ustawione na wartość false tylko wtedy, gdy zamierzasz ręcznie kontrolować wygląd i zaginięcie wskazówek za pomocą kodu.

  • AnimationState Nazwa stanu animacji, który powinien być odtwarzany, gdy wskazówka jest aktywna. Należy ustawić tę funkcję przed wywołaniem funkcji StartHintLoop() (podczas opcji OnEnable, jeśli jest zaznaczone autozaktywowanie).

Kontrolowanie interakcjiHint za pomocą skryptu

  • StartHintLoop Ta funkcja uruchamia pętlę show/hide, która w przeciwnym razie uruchamia wartość OnEnable, jeśli flaga AutoActivate ma wartość true.
  • StopHintLoop Ta funkcja wywołuje stan animacji wyblakłej, jeśli nie jest obecnie odtwarzana, a następnie zdezaktywuje pętlę show/hide i ustawi platformę ręczną nieaktywną w hierarchii.
  • AnimationState Ten ciąg określa, który stan animacji jest odtwarzany podczas pętli. Możesz zmienić ten ciąg, aby zmienić odtwarzany stan, ale należy to zrobić po wywołaniu polecenia StopHintLoop i ponownie wywołać metodę StartHintLoop po zmianie stanu.
  • CustomShouldHideVisuals Można to ustawić za pomocą własnej funkcji, która powinna zwracać wartość true, gdy chcesz ukryć wizualizacje dłoni (pamiętaj o minMaxTimer, w szczególności maksymalny parametr)

Zagadnienia dotyczące animacji niestandardowej

Zanikania są domyślnie ustawiane na 0,5 sekundy, więc wszelkie niestandardowe animacje utworzone do użytku z platformą powinny wynosić 1,5 sekundy, aby wszelkie istotne informacje zostały przekazane

Podany domyślny zanikanie i wynikanie stanów, Fade_In i Fade_Out można dostosować przez zmianę sygnatury czasowej drugiej ramki kluczowej, aby ustawić długość zanikania.

Animator i skrypt zostały skonfigurowane w sposób, który powinien uczynić konfigurację tak prostą, jak to możliwe. Aby dodać nowe stany animacji, po prostu zaimportuj fbx, upewnij się, że nazwa animacji jest ustawiona na unikatową nazwę i przeciągnij tę animację do animacji do animacji.

MoveToTarget

Skrypt MoveToTarget.cs udostępnia funkcje umożliwiające przeniesienie wskazówek ręki z pozycji śledzenia do pozycji docelowej w czasie.

Jak skonfigurować usługę MoveToTarget

Podane prefabryki "MovingHandCoachRoot_L.prefab" i "MovingHandCoachRoot_R.prefab" zawierają element MoveToTarget w hierarchii. Jeśli chcesz użyć tego skryptu we własnej konfiguracji, musisz umieścić go na głównym obiekcie gameobject zawierającym animatora dla swojej platformy.

Właściwości inspektora

  • TrackingObject Ustaw tę wartość za pomocą obiektu, który ma być obserwowany przez platformę przed rozpoczęciem ruchu. Zaleca się utworzenie pustego obiektu GameObject i przeniesienie go do określonej pozycji, aby ułatwić wskazanie śledzenia.
  • Targetobject Ustaw tę wartość za pomocą obiektu, do którego ma zostać przeniesiona platforma podczas ruchu. Zaleca się utworzenie pustego obiektu GameObject i przeniesienie go do określonej pozycji, aby ułatwić wskazanie śledzenia.
  • RootObject Ustaw wartość elementu nadrzędnego współużytkowanego między obiektem śledzenia i obiektu docelowego, aby można było poprawnie obliczyć względne pozycje. Uwzględniona prefab zawiera zarówno obiekty śledzące, jak i docelowe w hierarchii, ale można ustawić obiekt docelowy jako obiekt gameObject poza prefab i zmienić obiekt główny na udostępniony element nadrzędny.
  • Długość Czas przejścia z obiektu TrackingObject do obiektu TargetObject w sekundach powinien potrwać (w sekundach).
  • TargetOffset Przesunięcie z możliwością dostosowania w celu uzyskania obiektu GameObject do uzyskania odpowiedniej pozycji docelowej. Jest to przydatne, jeśli animacja zawiera przesunięcie położenia podczas animacji.
  • AnimacjaCurve Jest to domyślnie krzywa liniowa, ale można zmienić krzywą w celu zapewnienia złagodzenia/wyjścia podczas uruchamiania i zatrzymywania ścieżki ruchu.

Kontrolowanie polecenia MoveToTarget za pomocą skryptu

W skrypcie niestandardowym wywołaj metodę Follow(), gdy chcesz, aby platforma ręczna postępowała zgodnie z obiektem TrackingObject, a następnie wywołaj metodę MoveToTargetPosition(), gdy chcesz, aby zestaw ręczny rozpoczął ruch do obiektu TargetObject.

Kontrolowanie elementu MoveToTarget za pomocą animacji

W animacji, która musi zostać przeniesiona, ustaw dwa zdarzenia: jedno z wywołaniem Follow() i jedno z wywołaniem MoveToTargetPosition(). Postępuj zgodnie z instrukcjami w pierwszej ramce kluczowej, ponieważ powoduje, że platforma ręczna będzie postępować zgodnie z elementem TrackingObject. Właściwość MoveToTargetPosition powinna być ustawiona na ramce kluczowej, w której chcesz, aby platforma zaczęła przechodzić do obiektu docelowego. W ten sposób funkcja skryptu jest używana w podanych prefabach.

RotateAroundPoint

Skrypt RotateAroundPoint.cs udostępnia funkcję obracania wskazówek dłoni wokół punktu przestawnego w czasie.

Jak skonfigurować program RotateAroundPoint

Podane prefab "RotatingHandCoachRoot_L.prefab" i "RotatingHandCoachRoot_R.prefab" zawierają element RotateAroundPoint w hierarchii. Jeśli chcesz użyć tego skryptu we własnej konfiguracji, musisz umieścić go na głównym obiekcie gameobject zawierającym animatora dla swojej platformy.

Właściwości inspektora

  • Wyśrodkowany rodzic Ustaw tę wartość za pomocą obiektu nadrzędnego, który ma być przestawny.
  • Odwrotnyparent Ustaw tę opcję za pomocą elementu nadrzędnego, aby obrócić odwrotność do wyśrodkowanegoparu, aby zachować orientację dłoni w taki sam sposób. Ogólnie rzecz biorąc, będzie to obiekt nadrzędny ze skryptem InteractionHint.
  • Położenie przestawne Ustaw tę wartość na punkt, w którym chcesz, aby wskazówka zaczęła przesuwać się.
  • Długość Czas obrotu wokół centrum centrumparentu powinien potrwać (w sekundach).
  • AnimacjaCurve Jest to domyślnie krzywa liniowa, ale można zmienić krzywą w celu zapewnienia złagodzenia/wyjścia podczas uruchamiania i zatrzymywania ścieżki ruchu.
  • ObrótVector Ile stopni ma być obracanych wzdłuż każdej osi.

Kontrolowanie programu RotateAroundPoint za pomocą skryptu

W skryscie niestandardowym wywołaj metodę RotateToTarget(), gdy chcesz, aby platforma ręczna zaczęła obracać się wokół centrum centrumparentu. Jeśli pozycja ma zostać zresetowana do oryginalnej pozycji przestawnej, wykonaj wywołanie elementu ResetAndDeterminePivot().

Kontrolowanie elementu RotateAroundPoint za pomocą animacji

W animacji, która musi się przenieść, ustaw dwa zdarzenia: jedno z wywołaniem ResetAndDeterminePivot() i jedno z wywołaniem RotateToTarget(). Element ResetAndDeterminePivot powinien być ustawiony w pierwszej ramce kluczowej, ponieważ powoduje zresetowanie platformy ręcznej do położenia przestawnego. Właściwość RotateToTarget powinna być ustawiona na ramce kluczowej, w której chcesz, aby platforma zaczęła obracać się wokół wyśrodkowanego rodzica. W ten sposób funkcja skryptu jest używana w udostępnionych prefabach.