Systém sledování rukou používá jako vstup dlaně a prsty osoby. Data o poloze a otočení každého prstu, celé dlaně a gesty rukou jsou k dispozici. Od verze Unreal 4.26 je sledování rukou založené na modulu plug-in Unreal HeadMountedDisplay a používá společné rozhraní API pro všechny platformy a zařízení XR. Funkce jsou stejné pro systémy Windows Mixed Reality i OpenXR.
Hand pose
Ruční pozice umožňuje sledovat a používat ruce a prsty uživatelů jako vstup, ke kterým můžete přistupovat jak v blueprintech, tak v jazyce C++. Unreal API odesílá data jako souřadnicový systém s ticky synchronizovanými s Unreal Engine.


Hierarchii popisuje EHandKeypoint
výčet:

Všechna tato data můžete získat z rukou uživatele pomocí funkce Získat data kontroleru pohybu. Tato funkce vrátí XRMotionControllerData struktury. Níže je ukázkový skript podrobného plánu, který parsuje strukturu XRMotionControllerData, aby získala ručně společná umístění a nakreslí ladicí souřadnicový systém v umístění každého společného souboru.

Je důležité zkontrolovat, jestli je struktura platná a že se jedná o ruku. V opačném případě můžete získat nedefinované chování v přístupu k pozicím, otočením a radiovým polím.
Výčet EWMRHandKeypoint
popisuje kostní hierarchii ruky. Jednotlivé klíčové body najdete v podrobných plánech:

Úplný výčet jazyka C++ je uvedený níže:
enum class EWMRHandKeypoint : uint8
{
Palm,
Wrist,
ThumbMetacarpal,
ThumbProximal,
ThumbDistal,
ThumbTip,
IndexMetacarpal,
IndexProximal,
IndexIntermediate,
IndexDistal,
IndexTip,
MiddleMetacarpal,
MiddleProximal,
MiddleIntermediate,
MiddleDistal,
MiddleTip,
RingMetacarpal,
RingProximal,
RingIntermediate,
RingDistal,
RingTip,
LittleMetacarpal,
LittleProximal,
LittleIntermediate,
LittleDistal,
LittleTip
};
Číselné hodnoty pro každý výčtové písmeno najdete ve Windows.Perception.Lidé. Tabulka HandJointKind.
Podpora sledování rukou
Sledování rukou můžete použít v podrobných plánech přidáním funkce Podporuje sledování rukou z Windows Mixed Reality pro sledování > rukou:

Tato funkce vrátí true
, pokud je sledování rukou na zařízení podporované a false
pokud sledování rukou není k dispozici.

C++:
Zahrnout WindowsMixedRealityHandTrackingFunctionLibrary.h
.
static bool UWindowsMixedRealityHandTrackingFunctionLibrary::SupportsHandTracking()
Získání sledování rukou
K vrácení prostorových dat z ruky můžete použít GetHandJointTransform . Data se aktualizují každý rámec, ale pokud jste uvnitř rámce, vrácené hodnoty se ukládají do mezipaměti. Z důvodů výkonu se nedoporučuje mít v této funkci velkou logiku.

C++:
static bool UWindowsMixedRealityHandTrackingFunctionLibrary::GetHandJointTransform(EControllerHand Hand, EWMRHandKeypoint Keypoint, FTransform& OutTransform, float& OutRadius)
Tady je rozpis parametrů funkce GetHandJointTransform:
- Ruka – může to být levá nebo pravá ruka.
- Klíčové body – kost ruky.
- Transformace – souřadnice a orientace základu kosti. Můžete požádat o základ další kosti, abyste získali transformační data pro konec kosti. Speciální tip kosti dává konec distal.
- **Poloměr – poloměr základu kosti.
- **Návratová hodnota – true, pokud je kost sledována v tomto rámečku, nepravda, pokud kost není sledována.
Animace ručně živého odkazu
Hand poses are exposed to Animation using the Live Link plugin.
Pokud jsou povoleny moduly plug-in Windows Mixed Reality a Live Link:
- Výběrem možnosti Window > Live Link otevřete okno editoru Live Link.
- Výběr zdroje a povolení zdroje sledování rukou ve Windows Mixed Reality

Po povolení zdroje a otevření animačního prostředku rozbalte oddíl Animace na kartě Náhled scény také další možnosti.

Hierarchie ruční animace je stejná jako v EWMRHandKeypoint
. Animace se dá změnit pomocí WindowsMixedRealityHandTrackingLiveLinkRemapAsset:

Může být také podtříděn v editoru:

Ruční síť
Důležité
Ruční síť vyžaduje OpenXR.
Modul plug-in Microsoft OpenXR se musí použít, který je k dispozici na webu Unreal Marketplace nebo Na GitHubu.
Hand Mesh as a Tracked Geometry
Důležité
Získání rukou mřížky jako sledované geometrie v OpenXR vyžaduje, abyste volali nastavit použití hand mesh s povolenou geometrií sledování.
Chcete-li povolit tento režim, měli byste volat nastavit použití ruční sítě s povolenou geometrií sledování:

Poznámka:
Oba režimy není možné povolit současně. Pokud ho povolíte, druhý se automaticky zakáže.
Přístup k datům hand mesh

Než budete mít přístup k datům sítě rukou, budete muset:
- Vyberte prostředek ARSessionConfig, rozbalte Nastavení AR –> Nastavení mapování světa a zaškrtněte možnost Generovat data sítě ze sledované geometrie.
Níže jsou uvedeny výchozí parametry sítě:
- Použití dat mesh pro okluzi
- Generování kolizí pro data mesh
- Generování navigační sítě pro data mesh
- Vykreslení dat mesh v wireframe – ladicí parametr, který zobrazuje vygenerovanou síť
Tyto hodnoty parametrů se používají jako výchozí hodnoty prostorového mapování a mřížky rukou. V podrobných plánech nebo kódu pro libovolnou síť je můžete kdykoli změnit.
Referenční informace k rozhraní API jazyka C++
Slouží EEARObjectClassification
k vyhledání hodnot ručně spletu ve všech sledovaných objektech.
enum class EARObjectClassification : uint8
{
// Other types
HandMesh,
};
Následující delegáti se volají, když systém zjistí všechny sledované objekty, včetně mřížky rukou.
class FARSupportInterface
{
public:
// Other params
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableAdded)
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableUpdated)
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableRemoved)
};
Ujistěte se, že obslužné rutiny delegáta dodržují následující podpis funkce:
void UARHandMeshComponent::OnTrackableAdded(UARTrackedGeometry* Added)
K datům sítě můžete přistupovat prostřednictvím UARTrackedGeometry::GetUnderlyingMesh
:
UMRMeshComponent* UARTrackedGeometry::GetUnderlyingMesh()
Referenční informace k rozhraní API podrobného plánu
Práce se sítěmi rukou v podrobných plánech:
- Přidání komponenty ARTrackableNotify do objektu actor podrobného plánu

- Přejděte na panel Podrobnosti a rozbalte oddíl Události .

- Přepište při přidání, aktualizaci nebo odebrání sledované geometrie následujícími uzly v grafu událostí:

Vizualizace Hand Mesh v OpenXR
Doporučeným způsobem vizualizace ruční sítě je použití modulu plug-in XRVisualization epic společně s modulem plug-in Microsoft OpenXR.
V editoru podrobných plánů byste měli použít funkci Set Use Hand Mesh z modulu plug-in Microsoft OpenXR s povolenou XRVisualization jako parametr:

Ke správě procesu vykreslování byste měli použít Render Motion Controller z XRVisualization:

Výsledek:

Pokud potřebujete něco složitějšího, například vykreslení ruční mřížky pomocí vlastního shaderu, musíte mřížky získat jako trasovanou geometrii.
Paprsky rukou
Získání pozice ruky funguje u blízkých interakcí, jako je uchopování objektů nebo stisknutí tlačítek. Někdy ale potřebujete pracovat s hologramy, které jsou daleko od uživatelů. Toho lze dosáhnout pomocí ručních paprsků, které lze použít jako bodovací zařízení v C++ i Blueprints. Můžete nakreslit paprsek z ruky na vzdálený bod a s určitou pomocí unreal ray tracing vyberte hologram, který by jinak byl mimo dosah.
Důležité
Vzhledem k tomu, že všechny výsledky funkce mění každý rámec, jsou všechny volatelné. Další informace o čistých a nečistých nebo volatelných funkcích najdete v uživatelském identifikátoru GUID podrobného plánu u funkcí.
K získání dat pro ruční paprsky byste měli použít funkci Získat data kontroleru pohybu z předchozí části. Vrácená struktura obsahuje dva parametry, které můžete použít k vytvoření paprsku ruky – Aim Position a Aim Rotation. Tyto parametry tvoří paprsek směrovaný vaším loketem. Měli byste je vzít a najít hologram, na který odkazuje.
Níže je příklad určení, jestli paprsek ruky dosáhne widgetu a nastaví výsledek vlastního hitu:

Pokud chcete v podrobných plánech používat paprsky rukou, vyhledejte některou z akcí v HMD windows Mixed Reality:

Pokud k nim chcete získat přístup v jazyce C++, zahrňte WindowsMixedRealityFunctionLibrary.h
je do horní části souboru volajícího kódu.
Výčet
Máte také přístup ke vstupním případům v rámci EHMDInputControllerButtons, které lze použít v podrobných plánech:

Pro přístup v jazyce C++ použijte třídu výčtu EHMDInputControllerButtons
:
enum class EHMDInputControllerButtons : uint8
{
Select,
Grasp,
//......
};
Níže je rozpis dvou použitelných případů výčtu:
- Select – Uživatel aktivoval událost Select.
- Aktivované v HoloLensu 2 vzduchovým klepnutím, pohledem a potvrzením nebo tím, že řeknete "Vybrat" s povoleným hlasovým vstupem.
- Uchopte – uživatel aktivoval událost uchopení.
- Aktivované v HoloLensu 2 zavřením prstů uživatele na hologramu.
Stav sledování sítě rukou v jazyce C++ můžete získat pomocí výčtu EHMDTrackingStatus
uvedeného níže:
enum class EHMDTrackingStatus : uint8
{
NotTracked,
//......
Tracked
};
Níže je rozpis dvou použitelných případů výčtu:
- NotTracked – ruka není viditelná
- Tracked –- ruka je plně sledována
Struktura
Struktura PointerPoseInfo vám může poskytnout informace o následujících ručních datech:
- Původ – původ ruky
- Směr – směr ruky
- Nahoru – nahoru vektor ruky
- Orientace – kvaternion orientace
- Stav sledování – aktuální stav sledování
Ke struktuře PointerPoseInfo můžete přistupovat prostřednictvím podrobných plánů, jak je znázorněno níže:

Nebo s C++:
struct FPointerPoseInfo
{
FVector Origin;
FVector Direction;
FVector Up;
FQuat Orientation;
EHMDTrackingStatus TrackingStatus;
};
Functions
Všechny níže uvedené funkce je možné volat na každém snímku, což umožňuje nepřetržité monitorování.
- Získat informace o pozici ukazatele vrátí úplné informace o směru paprsku ruky v aktuálním snímku.
Blueprint:

C++:
static FPointerPoseInfo UWindowsMixedRealityFunctionLibrary::GetPointerPoseInfo(EControllerHand hand);
- Je uchopeno vrátí hodnotu true, pokud je ruka uchopena v aktuálním rámečku.
Blueprint:

C++:
static bool UWindowsMixedRealityFunctionLibrary::IsGrasped(EControllerHand hand);
- Je Vybráno stisknuto vrátí hodnotu true, pokud uživatel aktivoval volbu v aktuálním rámečku.
Blueprint:

C++:
static bool UWindowsMixedRealityFunctionLibrary::IsSelectPressed(EControllerHand hand);
- Je kliknutí na tlačítko vrátí hodnotu true, pokud je událost nebo tlačítko aktivováno v aktuálním rámečku.
Blueprint:

C++:
static bool UWindowsMixedRealityFunctionLibrary::IsButtonClicked(EControllerHand hand, EHMDInputControllerButtons button);
- Získání stavu sledování kontroleru vrátí stav sledování v aktuálním rámci.
Blueprint:

C++:
static EHMDTrackingStatus UWindowsMixedRealityFunctionLibrary::GetControllerTrackingStatus(EControllerHand hand);
Gesta
HoloLens 2 sleduje prostorová gesta, což znamená, že tato gesta můžete zachytit jako vstup. Sledování gest je založené na modelu předplatného. Pomocí funkce Konfigurovat gesta byste měli zařízení sdělit, která gesta chcete sledovat. Další podrobnosti o gestech najdete v dokumentu Základní použití HoloLens 2.
Windows Mixed Reality

Pak byste měli přidat kód pro přihlášení k odběru následujících událostí:


OpenXR
V OpenXR se události gest sledují prostřednictvím vstupního kanálu. Při interakci rukou může zařízení automaticky rozpoznávat gesta klepnutím a podržením, ale ne ostatní. Pojmenují se jako mapování OpenXRMsftHandInteraction Select a Grip. Nemusíte povolovat odběr, měli byste deklarovat události v Projectu Nastavení/ Engine/Input, stejně jako toto:

Funkci Podrobného plánu najdete v části Windows Mixed Reality Spatial Input a funkci C++ přidáním WindowsMixedRealitySpatialInputFunctionLibrary.h
do souboru kódu volání.

Výčet
Blueprint:

C++:
enum class ESpatialInputAxisGestureType : uint8
{
None = 0,
Manipulation = 1,
Navigation = 2,
NavigationRails = 3
};
Function
Funkci můžete povolit a zakázat zachytávání CaptureGestures
gest. Když povolené gesto aktivuje vstupní události, funkce se vrátí true
, pokud bylo zachycení gesta úspěšné a false
pokud dojde k chybě.
Blueprint:

C++:
static bool UWindowsMixedRealitySpatialInputFunctionLibrary::CaptureGestures(
bool Tap = false,
bool Hold = false,
ESpatialInputAxisGestureType AxisGesture = ESpatialInputAxisGestureType::None,
bool NavigationAxisX = true,
bool NavigationAxisY = true,
bool NavigationAxisZ = true);
Tady jsou klíčové události, které najdete v podrobných plánech a C++: 

const FKey FSpatialInputKeys::TapGesture(TapGestureName);
const FKey FSpatialInputKeys::DoubleTapGesture(DoubleTapGestureName);
const FKey FSpatialInputKeys::HoldGesture(HoldGestureName);
const FKey FSpatialInputKeys::LeftTapGesture(LeftTapGestureName);
const FKey FSpatialInputKeys::LeftDoubleTapGesture(LeftDoubleTapGestureName);
const FKey FSpatialInputKeys::LeftHoldGesture(LeftHoldGestureName);
const FKey FSpatialInputKeys::RightTapGesture(RightTapGestureName);
const FKey FSpatialInputKeys::RightDoubleTapGesture(RightDoubleTapGestureName);
const FKey FSpatialInputKeys::RightHoldGesture(RightHoldGestureName);
const FKey FSpatialInputKeys::LeftManipulationGesture(LeftManipulationGestureName);
const FKey FSpatialInputKeys::LeftManipulationXGesture(LeftManipulationXGestureName);
const FKey FSpatialInputKeys::LeftManipulationYGesture(LeftManipulationYGestureName);
const FKey FSpatialInputKeys::LeftManipulationZGesture(LeftManipulationZGestureName);
const FKey FSpatialInputKeys::LeftNavigationGesture(LeftNavigationGestureName);
const FKey FSpatialInputKeys::LeftNavigationXGesture(LeftNavigationXGestureName);
const FKey FSpatialInputKeys::LeftNavigationYGesture(LeftNavigationYGestureName);
const FKey FSpatialInputKeys::LeftNavigationZGesture(LeftNavigationZGestureName);
const FKey FSpatialInputKeys::RightManipulationGesture(RightManipulationGestureName);
const FKey FSpatialInputKeys::RightManipulationXGesture(RightManipulationXGestureName);
const FKey FSpatialInputKeys::RightManipulationYGesture(RightManipulationYGestureName);
const FKey FSpatialInputKeys::RightManipulationZGesture(RightManipulationZGestureName);
const FKey FSpatialInputKeys::RightNavigationGesture(RightNavigationGestureName);
const FKey FSpatialInputKeys::RightNavigationXGesture(RightNavigationXGestureName);
const FKey FSpatialInputKeys::RightNavigationYGesture(RightNavigationYGestureName);
const FKey FSpatialInputKeys::RightNavigationZGesture(RightNavigationZGestureName);
Kontrolní bod dalšího vývoje
Pokud sledujete cestu k unreal developmentu, kterou jsme si rozložili, jste uprostřed zkoumání základních stavebních bloků MRTK. Odtud můžete pokračovat k dalšímu stavebnímu bloku:
Nebo přejděte na možnosti platformy a rozhraní API hybridní reality:
Kdykoli se můžete vrátit k kontrolním bodům unreal development.