Acompanhamento da mão

Perfil de acompanhamento à mão

O perfil de rastreamento de mão é encontrado no perfil do sistema de entrada. Ele contém configurações para personalizar a representação manual.

Hand Tracking Profile

Pré-fabricados conjunta

As pré-fabricados conjuntas são visualizadas usando pré-fabricados simples. As junções de palmeira e de índice são de importância especial e têm seu próprio pré-fabricado, enquanto todas as outras junções compartilham o mesmo pré-fabricado.

Por padrão, as pré-fabricados conjuntas de mão são primitivos geométricos simples. Eles podem ser substituídos, se desejado. Se nenhum pré-fabricado for especificado, os Gameobjects vazios serão criados em vez disso.

Aviso

Evite usar scripts complexos ou processamentos caros em pré-fabricados conjuntas, pois os objetos conjuntas são transformados em todos os quadros e podem ter um custo de desempenho significativo!

Representação conjunta padrão Rótulos conjuntas
Articulated hand joints Input Hand joints

Pré-fabricado de malha à mão

A malha à mão será usada se os dados de malha totalmente definidos forem fornecidos pelo dispositivo de rastreamento manual. A malha renderizada no pré-fabricado é substituída pelos dados do dispositivo, portanto, uma malha fictícia, como um cubo, é suficiente. O material do pré-fabricado é usado para a malha de mão.

Input Hand Mesh

A exibição de malha à mão pode ter um impacto perceptível no desempenho, por esse motivo, ela pode ser totalmente desativada desmarcando a opção habilitar visualização de malha à mão .

Configurações de visualização da mão

A malha de mão e as visualizações conjuntas podem ser desativadas ou ativadas por meio da configuração dos modos de visualização de malha à mão e modos de visualização conjunta , respectivamente. Essas configurações são específicas do modo de aplicativo, o que significa que é possível ativar alguns recursos enquanto estiver no editor (para ver as junções com a simulação no editor, por exemplo) enquanto têm os mesmos recursos desativados quando implantados no dispositivo (em builds de Player).

Observe que, em geral, é recomendável ter a visualização conjunta configurada no editor (para que a simulação do editor mostre onde estão as junções de mão) e ter a visualização conjunta e a visualização de malha à mão desativada no Player (porque elas incorrem em um impacto no desempenho).

Scripting

A posição e a rotação podem ser solicitadas no sistema de entrada para cada conjunto individual de cada mão como um MixedRealityPose .

Como alternativa, o sistema permite o acesso ao Gameobjects que segue as junções. Isso pode ser útil se outro gameobject deve acompanhar um conjunto continuamente.

As junções disponíveis são listadas na TrackedHandJoint enumeração.

Observação

O objeto conjunta é destruído quando o rastreamento à mão é perdido! Certifique-se de que todos os scripts que usam o objeto conjunta manipulem o null caso normalmente para evitar erros!

Acessando um determinado controlador

Um controlador de mão específico geralmente está disponível, por exemplo, ao manipular eventos de entrada. Nesse caso, os dados conjuntas podem ser solicitados diretamente do dispositivo, usando a IMixedRealityHand interface.

Sondagem conjunta de pose do controlador

A TryGetJoint função retornará false se a junção solicitada não estiver disponível por algum motivo. Nesse caso, a pose resultante será MixedRealityPose.ZeroIdentity .

public void OnSourceDetected(SourceStateEventData eventData)
{
  var hand = eventData.Controller as IMixedRealityHand;
  if (hand != null)
  {
    if (hand.TryGetJoint(TrackedHandJoint.IndexTip, out MixedRealityPose jointPose)
    {
      // ...
    }
  }
}

Transformação conjunta do Visualizador de mão

Objetos conjuntas podem ser solicitados no Visualizador do controlador.

public void OnSourceDetected(SourceStateEventData eventData)
{
  var handVisualizer = eventData.Controller.Visualizer as IMixedRealityHandVisualizer;
  if (handVisualizer != null)
  {
    if (handVisualizer.TryGetJointTransform(TrackedHandJoint.IndexTip, out Transform jointTransform)
    {
      // ...
    }
  }
}

Acesso a dados em conjunto simplificado

Se nenhum controlador específico for fornecido, as classes utilitárias serão fornecidas para acesso conveniente aos dados conjuntas. Essas funções solicitam dados conjuntas do primeiro dispositivo disponível atualmente controlado.

Sondagem em conjunto de HandJointUtils

HandJointUtils é uma classe estática que consulta o primeiro dispositivo ativo de mão.

if (HandJointUtils.TryGetJointPose(TrackedHandJoint.IndexTip, Handedness.Right, out MixedRealityPose pose))
{
    // ...
}

Transformação conjunta do serviço de conjunto de mão

IMixedRealityHandJointService mantém um conjunto persistente de Gameobjects para acompanhamento de junções.

var handJointService = CoreServices.GetInputSystemDataProvider<IMixedRealityHandJointService>();
if (handJointService != null)
{
    Transform jointTransform = handJointService.RequestJointTransform(TrackedHandJoint.IndexTip, Handedness.Right);
    // ...
}

Eventos de acompanhamento de mão

O sistema de entrada também fornece eventos, se a sondagem de dados de controladores diretamente não for desejável.

Eventos conjuntas

IMixedRealityHandJointHandler lida com atualizações de posições conjuntas.

public class MyHandJointEventHandler : IMixedRealityHandJointHandler
{
    public Handedness myHandedness;

    void IMixedRealityHandJointHandler.OnHandJointsUpdated(InputEventData<IDictionary<TrackedHandJoint, MixedRealityPose>> eventData)
    {
        if (eventData.Handedness == myHandedness)
        {
            if (eventData.InputData.TryGetValue(TrackedHandJoint.IndexTip, out MixedRealityPose pose))
            {
                // ...
            }
        }
    }
}

Eventos de malha

IMixedRealityHandMeshHandler lida com alterações da malha lado articulada.

Observe que as malhas à mão não estão habilitadas por padrão.

public class MyHandMeshEventHandler : IMixedRealityHandMeshHandler
{
    public Handedness myHandedness;
    public Mesh myMesh;

    public void OnHandMeshUpdated(InputEventData<HandMeshInfo> eventData)
    {
        if (eventData.Handedness == myHandedness)
        {
            myMesh.vertices = eventData.InputData.vertices;
            myMesh.normals = eventData.InputData.normals;
            myMesh.triangles = eventData.InputData.triangles;

            if (eventData.InputData.uvs != null && eventData.InputData.uvs.Length > 0)
            {
                myMesh.uv = eventData.InputData.uvs;
            }

            // ...
        }
    }
}

Problemas conhecidos

.NET Nativo

Atualmente, há um problema conhecido com compilações mestras usando o back-end do .NET. no .NET Native, os IInspectable ponteiros não podem ser empacotados do código nativo para o gerenciado usando Marshal.GetObjectForIUnknown . O MRTK usa isso para obter o a SpatialCoordinateSystem fim de receber dados de olho e de mão da plataforma.

fornecemos a origem da DLL como uma solução alternativa para esse problema, na realidade misturada nativa Toolkit repositório. Siga as instruções no arquivo LEIAme e copie os binários resultantes em uma pasta plugins em seus ativos de Unity. Depois disso, o script WindowsMixedRealityUtilities fornecido no MRTK resolverá a solução alternativa para você.

Se você quiser criar sua própria DLL ou incluir essa solução alternativa em uma existente, o núcleo da solução alternativa será:

extern "C" __declspec(dllexport) void __stdcall MarshalIInspectable(IUnknown* nativePtr, IUnknown** inspectable)
{
    *inspectable = nativePtr;
}

E seu uso em seu código da Unity em C#:

[DllImport("DotNetNativeWorkaround.dll", EntryPoint = "MarshalIInspectable")]
private static extern void GetSpatialCoordinateSystem(IntPtr nativePtr, out SpatialCoordinateSystem coordinateSystem);

private static SpatialCoordinateSystem GetSpatialCoordinateSystem(IntPtr nativePtr)
{
    try
    {
        GetSpatialCoordinateSystem(nativePtr, out SpatialCoordinateSystem coordinateSystem);
        return coordinateSystem;
    }
    catch
    {
        UnityEngine.Debug.LogError("Call to the DotNetNativeWorkaround plug-in failed. The plug-in is required for correct behavior when using .NET Native compilation");
        return Marshal.GetObjectForIUnknown(nativePtr) as SpatialCoordinateSystem;
    }
}