Acompanhamento da mão no UnrealHand tracking in Unreal

Visão geralOverview

O sistema de acompanhamento manual usa Palms e dedos de uma pessoa como entrada.The hand tracking system uses a person’s palms and fingers as input. Você pode obter a posição e a rotação de cada dedo, todo o Palm e gestos de mão para usar em seu código.You can get the position and rotation of every finger, the entire palm, and even hand gestures to use in your code.

Pose de mãoHand Pose

A pose de mão permite que você acompanhe as mãos e os dedos do usuário ativo e use-os como entrada, que pode ser acessado por meio de plantas e do C++.Hand pose lets you track the hands and fingers of the active user and use it as input, which you can access through Blueprints and C++. Você pode encontrar mais detalhes técnicos na API inreal do Windows. percepção. People. HandPose .You can find more technical details in Unreal's Windows.Perception.People.HandPose API. A API inreal envia os dados como um sistema de coordenadas, com tiques sincronizados com o mecanismo inreal.The Unreal API sends the data as a coordinate system, with ticks synchronized with the Unreal Engine.

Compreendendo a hierarquia do BoneUnderstanding the bone hierarchy

A EWMRHandKeypoint Enumeração descreve a hierarquia do Bone da mão.The EWMRHandKeypoint enum describes the Hand’s bone hierarchy. Você pode encontrar cada ponto de extremidade à mão listado em seus planos gráficos:You can find each hand keypoint listed in your Blueprints:

Mão keypoint BP

A enumeração C++ completa está listada abaixo:The full C++ enum is listed below:

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
};

Você pode encontrar os valores numéricos para cada caso de enum na tabela Windows. percepção. People. HandJointKind .You can find the numerical values for each enum case in the Windows.Perception.People.HandJointKind table. Todo o layout de pose de mão com casos de enumeração correspondentes é mostrado na imagem abaixo:The entire hand pose layout with matching enum cases is shown in the image below:

Esqueleto da mão

Acompanhamento de suporte à mãoSupporting Hand Tracking

Você pode usar o rastreamento manual em plantas adicionando suporte ao rastreamento à mão > realidade mista do Windows:You can use hand tracking in Blueprints by adding Supports Hand Tracking from Hand Tracking > Windows Mixed Reality:

Controle à mão BP

Essa função retornará true se o controle à mão tiver suporte no dispositivo e false se o rastreamento à mão não estiver disponível.This function returns true if hand tracking is supported on the device and false if hand tracking is not available.

Dá suporte ao controle à mão BP

C++:C++:

Inclua WindowsMixedRealityHandTrackingFunctionLibrary.h.Include WindowsMixedRealityHandTrackingFunctionLibrary.h.

static bool UWindowsMixedRealityHandTrackingFunctionLibrary::SupportsHandTracking()

Obtendo controle à mãoGetting Hand Tracking

Você pode usar GetHandJointTransform para retornar dados espaciais da mão.You can use GetHandJointTransform to return spatial data from the hand. Os dados são atualizados a cada quadro, mas se você estiver dentro de um quadro, os valores retornados serão armazenados em cache.The data updates every frame, but if you're inside a frame the returned values are cached. Não é recomendável ter muita lógica nessa função por motivos de desempenho.It's not recommended to have heavy logic in this function for performance reasons.

Obter transformação conjunta de entrega

C++:C++:

static bool UWindowsMixedRealityHandTrackingFunctionLibrary::GetHandJointTransform(EControllerHand Hand, EWMRHandKeypoint Keypoint, FTransform& OutTransform, float& OutRadius)

Divisão de parâmetro de função:Function parameter breakdown:

  • Mão – um é o lado esquerdo ou direito do usuárioHand – an be the left or right hand of the user
  • Ponto de extremidade – o Bone da mão.Keypoint – the bone of the hand.
  • Transformação – coordenadas e orientação da base do Bone.Transform – coordinates and orientation of bone’s base. Você pode solicitar a base do próximo Bone para obter os dados de transformação para o final de um Bone.You can request the base of the next bone to get the transform data for the end of a bone. Um Bone de dica especial dá ao fim do distal.A special Tip bone gives end of distal.
  • RADIUS — raio da base do Bone.Radius — radius of the base of the bone.
  • Valor de retorno — true se o Bone for rastreado neste quadro, false se o Bone não for acompanhado.Return Value — true if the bone is tracked this frame, false if the bone is not tracked.

As poses de mão são expostas à animação usando o plug-in de vínculo dinâmico.Hand poses are exposed to Animation using the Live Link plugin.

Se a realidade mista do Windows e os plug-ins do Live link estiverem habilitados:If the Windows Mixed Reality and Live Link plugins are enabled:

  1. Selecione janela > link ao vivo para abrir a janela do editor de link dinâmico.Select Window > Live Link to open the Live Link editor window.
  2. Clique em origem e habilite a fonte de acompanhamento do Windows Mixed RealityClick Source and enable Windows Mixed Reality Hand Tracking Source

Origem do link dinâmico

Depois de habilitar a origem e abrir um ativo de animação, expanda a seção animação na guia cena de visualização também para ver as opções adicionais (os detalhes estão na documentação de link dinâmico do inreal-como o plug-in está em beta, o processo pode ser alterado posteriormente).After you enable the source and open an animation asset, expand the Animation section in the Preview Scene tab too see additional options (the details are in Unreal’s Live Link documentation - as the plugin is in beta, the process may change later).

Animação de link ao vivo

A hierarquia de animação da mão é a mesma do EWMRHandKeypoint .The hand animation hierarchy is the same as in EWMRHandKeypoint. A animação pode ser redirecionada usando WindowsMixedRealityHandTrackingLiveLinkRemapAsset:Animation can be retargeted using WindowsMixedRealityHandTrackingLiveLinkRemapAsset:

Animação de link ao vivo 2

Ele também pode ser subclasse no editor:It can also be subclassed in the editor:

Remapeamento de link dinâmico

Acessando dados de malha de mãoAccessing Hand Mesh Data

Malha à mão

Antes de poder acessar os dados da malha, você precisará:Before you can access hand mesh data, you'll need to:

  • Selecione o ativo do ARSessionConfig , expanda as configurações do ar-> configurações de mapeamento do mundo e marque gerar dados de malha da geometria rastreada.Select your ARSessionConfig asset, expand the AR Settings -> World Mapping settings, and check Generate Mesh Data from Tracked Geometry.

Abaixo estão os parâmetros de malha padrão:Below are the default mesh parameters:

  1. Usar dados de malha para oclusãoUse Mesh Data for Occlusion
  2. Gerar colisão para dados de malhaGenerate Collision for Mesh Data
  3. Gerar malha NAV para dados de malhaGenerate Nav Mesh for Mesh Data
  4. Renderizar dados de malha em wireframe – parâmetro de depuração que mostra a malha geradaRender Mesh Data in Wireframe – debug parameter that shows generated mesh

Esses valores de parâmetro são usados como os padrões de malha de mapeamento espacial e malha de mão.These parameter values are used as the spatial mapping mesh and hand mesh defaults. Você pode alterá-los a qualquer momento em plantas ou código para qualquer malha.You can change them at any time in Blueprints or code for any mesh.

Referência da API do C++C++ API Reference

Use EEARObjectClassification para localizar valores de malha do lado em todos os objetos rastreáveis.Use EEARObjectClassification to find hand mesh values in all trackable objects.

enum class EARObjectClassification : uint8
{
    // Other types 
    HandMesh,
};

Os delegados a seguir são chamados quando o sistema detecta qualquer objeto rastreável, incluindo uma malha à mão.The following delegates are called when the system detects any trackable object, including a hand mesh.

class FARSupportInterface 
{
    public:
    // Other params 
    DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableAdded)
    DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableUpdated)
    DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableRemoved)
};

Verifique se os manipuladores delegados seguem a assinatura de função abaixo:Make sure your delegate handlers follow the function signature below:

void UARHandMeshComponent::OnTrackableAdded(UARTrackedGeometry* Added)

Você pode acessar os dados de malha por meio do UARTrackedGeometry::GetUnderlyingMesh :You can access mesh data through the UARTrackedGeometry::GetUnderlyingMesh:

UMRMeshComponent* UARTrackedGeometry::GetUnderlyingMesh()

Referência de API de BlueprintBlueprint API Reference

Para trabalhar com malhas à mão em plantas:In order to work with Hand Meshes in Blueprints:

  1. Adicionar um componente ARTrackableNotify a um ator do BlueprintAdd an ARTrackableNotify Component to a Blueprint actor

ARTrackable notificar

  1. Vá para o painel de detalhes e expanda a seção eventos .Go to the Details panel and expand the Events section.

Notificação ARTrackable 2

  1. Substituir em Adicionar/atualizar/remover geometria rastreada com os seguintes nós em seu grafo de eventos:Overwrite On Add/Update/Remove Tracked Geometry with the following nodes in your Event Graph:

Na notificação do ARTrackable

Raios de mãoHand Rays

Você pode usar um raio de mão como um dispositivo apontador em C++ e plantas, que expõem a API Windows. UI. Input. Spatial. SpatialPointerInteractionSourcePose .You can use a hand ray as a pointing device in both C++ and Blueprints, which exposes the Windows.UI.Input.Spatial.SpatialPointerInteractionSourcePose API.

É importante mencionar que, como os resultados de todas as funções alteram todos os quadros, todos eles se tornaram chamáveis.It’s important to mention that since the results of all the functions change every frame, they're all made callable. Para obter mais informações sobre funções puras e impuras ou que podem ser chamadas, consulte o GUID do usuário do Blueprint em funçõesFor more information about pure and impure or callable functions, see the Blueprint user guid on functions

Para usar raios de mão em plantas, pesquise qualquer uma das ações em HMD de realidade mista do Windows:To use Hand Rays in Blueprints, search for any of the actions under Windows Mixed Reality HMD:

Raios-mão BP

Para acessá-los em C++, inclua na WindowsMixedRealityFunctionLibrary.h parte superior do seu arquivo de código de chamada.To access them in C++, include WindowsMixedRealityFunctionLibrary.h to the top of your calling code file.

EnumeraçãoEnum

Você também tem acesso a casos de entrada em EHMDInputControllerButtons, que podem ser usados em plantas:You also have access to input cases under EHMDInputControllerButtons, which can be used in Blueprints:

Botões do controlador de entrada

Para acesso em C++, use a EHMDInputControllerButtons classe enum:For access in C++, use the EHMDInputControllerButtons enum class:

enum class EHMDInputControllerButtons : uint8
{
    Select,
    Grasp,
//......
};

Abaixo está uma análise dos dois casos de enumeração aplicáveis:Below is a breakdown of the two applicable enum cases:

  • Select -o evento de seleção disparado pelo usuário.Select - User triggered Select event.
    • O evento pode ser disparado no HoloLens 2 por Air-TAP, olhar e Commit ou dizendo "Select" com a entrada de voz habilitada.The event can be triggered in HoloLens 2 by air-tap, gaze and commit, or by saying “Select” with voice input enabled.
  • Segure -evento de Segure disparado pelo usuário.Grasp - User triggered Grasp event.
    • Esse evento pode ser disparado no HoloLens 2 fechando os dedos do usuário em um holograma.This event can be triggered in HoloLens 2 by closing the user’s fingers on a hologram.

Você pode acessar o status de acompanhamento da malha do seu lado em C++ por meio da EHMDTrackingStatus Enumeração mostrada abaixo:You can access the tracking status of your hand mesh in C++ through the EHMDTrackingStatus enum shown below:

enum class EHMDTrackingStatus : uint8
{
    NotTracked,
    //......
    Tracked
};

Abaixo está uma análise dos dois casos de enumeração aplicáveis:Below is a breakdown of the two applicable enum cases:

  • Não rastreado – a mão não está visívelNotTracked –- the hand isn’t visible
  • Acompanhado – a mão é totalmente controladaTracked –- the hand is fully tracked

EstruturaStruct

A estrutura PointerPoseInfo pode fornecer informações sobre os seguintes dados de mão:The PointerPoseInfo struct can give you information on the following hand data:

  • Origem – origem da mãoOrigin – origin of the hand
  • Direção – direção da mãoDirection – direction of the hand
  • Up – vetor de cima à mãoUp – up vector of the hand
  • Orientação – o quaternion de orientaçãoOrientation – orientation quaternion
  • Status de rastreamento – status de acompanhamento atualTracking Status – current tracking status

Você pode acessá-lo por meio de plantas, conforme mostrado abaixo:You can access this through Blueprints, as shown below:

Ponteiro de pose de informações BP

Ou com C++:Or with C++:

struct FPointerPoseInfo
{
    FVector Origin;
    FVector Direction;
    FVector Up;
    FQuat Orientation;
    EHMDTrackingStatus TrackingStatus;
};

FunçõesFunctions

Todas as funções listadas abaixo podem ser chamadas em cada quadro, o que permite o monitoramento contínuo.All of the functions listed below can be called on every frame, which allows continuous monitoring.

  1. Obter informações de pose de ponteiro retorna informações completas sobre a direção de raio da mão no quadro atual.Get Pointer Pose Info returns complete information about the hand ray direction in the current frame.

GráficoBlueprint:

Obter informações de pose de ponteiro

C++:C++:

static FPointerPoseInfo UWindowsMixedRealityFunctionLibrary::GetPointerPoseInfo(EControllerHand hand);
  1. É Segure retorna true se a mão estiver segurando no quadro atual.Is Grasped returns true if the hand is grasped in the current frame.

GráficoBlueprint:

BP é compreendida

C++:C++:

static bool UWindowsMixedRealityFunctionLibrary::IsGrasped(EControllerHand hand);
  1. Is Select pressionado retorna true se o usuário disparasse SELECT no quadro atual.Is Select Pressed returns true if the user triggered Select in the current frame.

GráficoBlueprint:

É selecione BP pressionado

C++:C++:

static bool UWindowsMixedRealityFunctionLibrary::IsSelectPressed(EControllerHand hand);
  1. O botão é clicado retorna true se o evento ou botão for disparado no quadro atual.Is Button Clicked returns true if the event or button is triggered in the current frame.

GráficoBlueprint:

É um botão clicado em BP

C++:C++:

static bool UWindowsMixedRealityFunctionLibrary::IsButtonClicked(EControllerHand hand, EHMDInputControllerButtons button);
  1. Obter status de controle do controlador retorna o status de acompanhamento no quadro atual.Get Controller Tracking Status returns the tracking status in the current frame.

GráficoBlueprint:

Obter o status de controle do controlador BP

C++:C++:

static EHMDTrackingStatus UWindowsMixedRealityFunctionLibrary::GetControllerTrackingStatus(EControllerHand hand);

GestosGestures

O Hololens 2 pode rastrear gestos espaciais, o que significa que você pode capturar esses gestos como entrada.The Hololens 2 can track spatial gestures, which means you can capture those gestures as input. Você pode encontrar mais detalhes sobre gestos são o documento de uso básico do HoloLens 2 .You can find more details about gestures are the HoloLens 2 Basic Usage document.

Você pode encontrar a função Blueprint na entrada espacial de realidade mista do Windows e a função C++ adicionando o WindowsMixedRealitySpatialInputFunctionLibrary.h arquivo de código de chamada.You can find the Blueprint function in under Windows Mixed Reality Spatial Input, and the C++ function by adding WindowsMixedRealitySpatialInputFunctionLibrary.h in your calling code file.

Gestos de captura

EnumeraçãoEnum

GráficoBlueprint:

Tipo de gesto

C++:C++:

enum class ESpatialInputAxisGestureType : uint8
{
    None = 0,
    Manipulation = 1,
    Navigation = 2,
    NavigationRails = 3
};

FunçãoFunction

Você pode habilitar e desabilitar a captura de gestos com a CaptureGestures função.You can enable and disable gesture capture with the CaptureGestures function. Quando um gesto habilitado aciona eventos de entrada, a função retorna true se a captura do gesto foi bem-sucedida e, false se houver um erro.When an enabled gesture fires input events, the function returns true if gesture capture succeeded, and false if there's an error.

GráficoBlueprint:

Gestos de captura BP

C++:C++:

static bool UWindowsMixedRealitySpatialInputFunctionLibrary::CaptureGestures(
    bool Tap = false, 
    bool Hold = false, 
    ESpatialInputAxisGestureType AxisGesture = ESpatialInputAxisGestureType::None, 
    bool NavigationAxisX = true, 
    bool NavigationAxisY = true, 
    bool NavigationAxisZ = true);

Veja a seguir os principais eventos, que você pode encontrar em plantas e C++:  principais eventosThe following are key events, which you can find in Blueprints and C++: Key Events

Principais eventos 2

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);

Próximo ponto de verificação de desenvolvimentoNext Development Checkpoint

Se você está seguindo o percurso do ponto de verificação de desenvolvimento do Unreal, você está no meio da exploração dos principais blocos de construção do MRTK.If you're following the Unreal development checkpoint journey we've laid out, you're in the midst of exploring the MRTK core building blocks. De lá, você pode prosseguir para o próximo bloco de construção:From here, you can proceed to the next building block:

Ou vá diretamente para as funcionalidades e APIs da plataforma de Realidade Misturada:Or jump to Mixed Reality platform capabilities and APIs:

Você sempre pode voltar para os pontos de verificação de desenvolvimento do Unreal a qualquer momento.You can always go back to the Unreal development checkpoints at any time.