O sistema de controlo manual utiliza as palmas e os dedos de uma pessoa como entrada. Estão disponíveis dados sobre a posição e a rotação de cada dedo, toda a palma da mão e gestos de mão. A partir do Unreal 4.26, o controlo manual baseia-se no plug-in Unreal HeadMountedDisplay e utiliza uma API comum em todas as plataformas e dispositivos XR. A funcionalidade é a mesma para sistemas Windows Mixed Reality e OpenXR.
Pose de mão
A pose manual permite-lhe controlar e utilizar as mãos e os dedos dos seus utilizadores como entrada, que podem ser acedidas tanto em Esquemas como em C++. A API Irreal envia os dados como um sistema de coordenadas, com tiques sincronizados com o Motor Irreal.
Pode obter todos estes dados das mãos de um utilizador com a função Obter Dados do Controlador de Movimento . Essa função devolve uma estrutura XRMotionControllerData . Segue-se um script de esquema de exemplo que analisa a estrutura XRMotionControllerData para obter localizações de articulação manual e desenha um sistema de coordenadas de depuração na localização de cada articulação.
É importante verificar se a estrutura é válida e se é uma mão. Caso contrário, poderá obter um comportamento indefinido no acesso a posições, rotações e matrizes de raios.
O EWMRHandKeypoint enum descreve a hierarquia óssea da Mão. Pode encontrar cada ponto-chave manual listado nos seus Esquemas:
Pode utilizar GetHandJointTransform para devolver dados espaciais da mão. Os dados atualizam cada frame, mas se estiver dentro de uma moldura, os valores devolvidos serão colocados em cache. Não é recomendado ter lógica pesada nesta função por motivos de desempenho.
Eis uma discriminação dos parâmetros de função getHandJointTransform:
Mão – podem ser os utilizadores à esquerda ou à direita.
Ponto de chave – o osso da mão.
Transformar – coordenadas e orientação da base óssea. Pode pedir a base do osso seguinte para obter os dados de transformação para o fim de um osso. Um osso especial da ponta dá o fim do distal.
**Raio — raio da base do osso.
**Valor devolvido — verdadeiro se o osso for controlado nesta moldura, falso se o osso não for controlado.
Se os plug-ins Windows Mixed Reality e Live Link estiverem ativados:
Selecione Windows > Live Link para abrir a janela do editor do Live Link.
Selecione Origem e ative Windows Mixed Reality Origem de Controlo Manual
Depois de ativar a origem e abrir um recurso de animação, expanda a secção Animação no separador Cena de Pré-visualização e veja também opções adicionais.
A hierarquia de animação manual é a mesma que em EWMRHandKeypoint. A animação pode ser retargeted com WindowsMixedRealityHandTrackingLiveLinkRemapAsset:
A obtenção de malhas manumétricas como geometria controlada no OpenXR requer que chame Definir Utilizar Malha Manual com Geometria de Controlo Ativada.
Para ativar esse modo, deve chamar Definir Utilizar o Hand Mesh com Geometria de Controlo Ativada:
Nota
Não é possível ativar ambos os modos ao mesmo tempo. Se ativar um, o outro será desativado automaticamente.
Aceder a Dados do Hand Mesh
Antes de poder aceder aos dados de malha manual, terá de:
Selecione o recurso ARSessionConfig , expanda as Definições de AR –> Definições de Mapeamento Mundial e selecione Gerar Dados de Malha a partir da Geometria Controlada.
Seguem-se os parâmetros de malha predefinidos:
Utilizar Dados de Malha para Oclusão
Gerar Colisão para Dados do Mesh
Gerar o Nav Mesh para Dados do Mesh
Render Mesh Data in Wireframe – parâmetro de depuração que mostra a malha gerada
Estes valores de parâmetros são utilizados como predefinições de malha de mapeamento espacial e malha manual. Pode alterá-los em qualquer altura em Esquemas ou código para qualquer malha.
Referência da API C++
Utilize EEARObjectClassification para localizar valores de malha manual em todos os objetos controláveis.
enum class EARObjectClassification : uint8
{
// Other types
HandMesh,
};
Os delegados seguintes são chamados quando o sistema deteta qualquer objeto controlável, incluindo uma malha manual.
class FARSupportInterface
{
public:
// Other params
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableAdded)
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableUpdated)
DECLARE_AR_SI_DELEGATE_FUNCS(OnTrackableRemoved)
};
Certifique-se de que os processadores delegados seguem a assinatura da função abaixo:
Adicionar um Componente ARTrackableNotify a um ator do Blueprint
Aceda ao painel Detalhes e expanda a secção Eventos .
Substitua Em Adicionar/Atualizar/Remover Geometria Registada com os seguintes nós no Gráfico de Eventos:
Visualização do Hand Mesh no OpenXR
A forma recomendada de visualizar a malha manual é utilizar o plug-in XRVisualization da Epic juntamente com o plug-in Microsoft OpenXR.
Em seguida, no editor de esquemas, deve utilizar a função Definir Utilizar o Hand Mesh a partir do plug-in Microsoft OpenXR com XRVisualization Ativado como parâmetro:
Para gerir o processo de composição, deve utilizar o Comando de Movimento de Composição do XRVisualização:
O resultado:
Se precisar de algo mais complicado, como desenhar uma malha manual com um sombreado personalizado, tem de obter as malhas como geometria controlada.
Raios de mão
Obter a pose da mão funciona para interações próximas, como agarrar objetos ou premir botões. No entanto, por vezes precisa de trabalhar com hologramas que estão longe dos seus utilizadores. Isto pode ser feito com raios de mão, que podem ser utilizados como dispositivos apontadores em C++ e Blueprints. Pode desenhar um raio da sua mão para um ponto mais distante e, com alguma ajuda do rastreio de raios irreais, selecione um holograma que, de outra forma, estaria fora de alcance.
Importante
Uma vez que todos os resultados da função mudam todos os fotogramas, são todos chamados. Para obter mais informações sobre funções puras e impuras ou callable, veja o guid do utilizador do Esquema nas funções.
Para obter os dados dos raios manos, deve utilizar a função Obter Dados do Controlador de Movimento da secção anterior. A estrutura devolvida contém dois parâmetros que pode utilizar para criar um raio-mão – Posição do Objetivo e Rotação de Objetivos. Estes parâmetros formam um raio dirigido pelo cotovelo. Deve levá-los e encontrar um holograma a ser apontado.
Segue-se um exemplo de como determinar se um raio-mão atinge um Widget e define um resultado de êxito personalizado:
Para utilizar o Hand Rays no Blueprints, procure qualquer uma das ações em Windows Mixed Reality HMD:
Para aceder aos mesmos em C++, inclua WindowsMixedRealityFunctionLibrary.h na parte superior do ficheiro de código de chamada.
Enumeração
Também tem acesso a casos de entrada em EHMDInputControllerButtons, que podem ser utilizados no Blueprints:
Para aceder em C++, utilize a EHMDInputControllerButtons classe enum:
enum class EHMDInputControllerButtons : uint8
{
Select,
Grasp,
//......
};
Segue-se uma discriminação dos dois casos de enumeração aplicáveis:
Selecione - Evento de seleção acionado pelo utilizador.
Acionado em HoloLens 2 por toque de ar, olhar e consolidação ou ao dizer "Selecionar" com a entrada de voz ativada.
Grasp - Evento do Grasp acionado pelo utilizador.
Acionado no HoloLens 2 ao fechar os dedos do utilizador num holograma.
Pode aceder ao estado de controlo da malha manual em C++ através da enumeração EHMDTrackingStatus apresentada abaixo:
enum class EHMDTrackingStatus : uint8
{
NotTracked,
//......
Tracked
};
Segue-se uma discriminação dos dois casos de enumeração aplicáveis:
NotTracked – a mão não está visível
Controlado – a mão está totalmente controlada
Estrutura
A estrutura PointerPoseInfo pode fornecer-lhe informações sobre os seguintes dados manos:
Origem – origem da mão
Direção – direção da mão
Cima – vetor para cima da mão
Orientação – quaterniono de orientação
Estado de Controlo – estado de controlo atual
Pode aceder à estrutura PointerPoseInfo através de Blueprints, conforme mostrado abaixo:
O HoloLens 2 monitoriza gestos espaciais, o que significa que pode capturar esses gestos como entrada. O controlo de gestos baseia-se num modelo de subscrição. Deve utilizar a função "Configurar Gestos" para indicar ao dispositivo quais os gestos que pretende controlar. Pode encontrar mais detalhes sobre gestos no documento HoloLens 2 Utilização Básica.
Em seguida, deve adicionar código para subscrever os seguintes eventos:
OpenXR
No OpenXR, os eventos de gestos são monitorizados através do pipeline de entrada. Através da interação manual, o dispositivo pode reconhecer automaticamente gestos de Toque e Suspensão, mas não os outros. São denominados mapeamentos OpenXRMsftHandInteraction Select e Grip. Não precisa de ativar a subscrição, deve declarar os eventos em Definições do Projeto/Motor/Entrada, da seguinte forma:
Pode encontrar a função Blueprint em Windows Mixed Reality Spatial Input e na função C++ ao adicionar WindowsMixedRealitySpatialInputFunctionLibrary.h o ficheiro de código de chamada.
Pode ativar e desativar a captura de gestos com a CaptureGestures função . Quando um gesto ativado aciona eventos de entrada, a função devolve true se a captura de gestos for bem-sucedida e false se ocorrer um erro.
Se estiver a seguir a jornada de desenvolvimento Irreal que definimos, está no meio de explorar os principais blocos modulares do MRTK. A partir daqui, pode continuar para o bloco modular seguinte: