Esta biblioteca foi projetada para facilitar o processo de adição de iFacialMocap de Yasushi Emoto a um projeto Unity com processo de configuração simplificado por meio do Unity Inspector.
Um Thread para escuta de pacotes UDP que, quando processados, são adicionados a uma fila. Outro pega da fila e os distribui por UnityEvents no thread principal. Isso elimina a necessidade de fazer escutas UDP na atualização do quadro.
Implementa o protocolo de comunicação IFacialMocap em um pacote mais utilizável sem o aplicativo complementar IFacialMocap necessário.
Desenvolvido no Unity 2018.4.33f1 Testado no Unity 2020.3.0.
Importe o pacote Unity nas versões para o seu projeto.
Adicione IFMService
a um GameObject vazio na cena e vincule uma função manipuladora na cena que possui um argumento IFMPacket
.
Um script de exemplo com o manipulador faria o seguinte
public class Example : MonoBehaviour
{
public void OnMessage(IFMPacket packet)
{
//.. Do stuff ..
}
}
Para ver um exemplo de UnityIFMLib em ação, em Example/Scene
abra a cena RiggedExample
ou StaticMeshExample
. Consulte as interações entre os objetos de cena IFMService
, CharacterFaceController
e os Avatares de exemplo usados na cena.
Em vez de usar o aplicativo iFacialMocap Companion, o iFacialMocap deve se conectar diretamente ao aplicativo Unity.
Você pode fazer isso abrindo o aplicativo iFacialMocap e pressionando a engrenagem à direita da tela. A partir daqui você pode definir o IP de destino para o host onde o aplicativo está sendo executado na rede local.
Por padrão, quando IFMService
está habilitado, ele pesquisará a porta IFM (padrão) 49983
a cada 5 segundos até que o pacote seja recebido pela primeira vez. Caso seja recebido, um pacote de confirmação de conexão será enviado ao iFacialMocap, e nele deverá aparecer um aviso de confirmação.
Se ocorrer um tempo limite, o aplicativo tentará novamente a cada 5 segundos e a caixa de diálogo de confirmação aparecerá novamente.
Quando o IFMService está desativado, a escuta da porta é desativada.
O pacote IFM é um objeto analisado pronto construído a partir das mensagens UDP
Blendshapes
- Contém uma matriz de objetos de BlendshapeData
.Head
, LeftEye
, RightEye
, todos objetos de IFMTransform
.Name
que é uma string, usando os valores do ARKit Blendshape. Nota: as abreviações de protocolo _L
ou _R
são substituídas por Left
Right
específico do ARKit, respectivamente, para consistência de nomenclatura em todas as formas de mesclagemValue
que é um int de 0 a 100. SetBlendshapeForRenderers(SkinnedMeshRenderer[])
- Faz um loop por todos os renderizadores fornecidos e aplica o blendshape quando aplicávelPosition
- Posição do vetor3 em relação à câmera. Somente a cabeça tem esse conjuntoEulerRotation
- Vector3 Euler Grau de rotação do objeto em relação à câmera.Classe utilitária com ajudantes estáticos para prototipagem ou implementação mais rápida
ApplyBlendshapes(IFMPacket, SkinnedMeshRenderer[])
- Aplica IFMPacket.Blendshapes
a todos os SkinnedMeshRenderers
que possuem os mesmos BlendshapesGetBlendshapeIndex(SkinnedMeshRenderer, string)
- executa GetBlendShapeIndex em string, mas também executa alguns atalhos para pular toda a pesquisa se a malha compartilhada for nula ou se blendshapecount for menor que 1Obtido do projeto de exemplo do aplicativo iFacialMocap Companion