Diese Bibliothek soll das Hinzufügen von iFacialMocap von Yasushi Emoto zu einem Unity-Projekt mit einem vereinfachten Konfigurationsprozess über den Unity Inspector vereinfachen.
Ein Thread wartet auf UDP-Pakete, die bei der Verarbeitung einer Warteschlange hinzugefügt werden. Ein anderer entnimmt sie der Warteschlange und verteilt sie über UnityEvents auf den Hauptthread. Dadurch entfällt die Notwendigkeit, UDP-Listen bei der Frame-Aktualisierung durchzuführen.
Implementiert das IFacialMocap-Kommunikationsprotokoll in ein benutzerfreundlicheres Paket ohne die erforderliche IFacialMocap-Begleit-App.
Entwickelt auf Unity 2018.4.33f1, getestet in Unity 2020.3.0.
Importieren Sie das Unitypackage in den Releases in Ihr Projekt.
Fügen Sie IFMService
zu einem leeren GameObject in der Szene hinzu und binden Sie eine szeneninterne Handlerfunktion, die über ein IFMPacket
-Argument verfügt.
Ein Beispielskript mit dem Handler würde Folgendes tun
public class Example : MonoBehaviour
{
public void OnMessage(IFMPacket packet)
{
//.. Do stuff ..
}
}
Um ein Beispiel von UnityIFMLib in Aktion zu sehen, öffnen Sie in Example/Scene
entweder die Szene RiggedExample
oder StaticMeshExample
. Sehen Sie sich die Interaktionen zwischen den Szenenobjekten IFMService
, CharacterFaceController
und den in der Szene verwendeten Beispielavataren an.
Anstatt die iFacialMocap Companion-App zu verwenden, sollte iFacialMocap direkt eine Verbindung zur Unity-Anwendung herstellen.
Sie können dies tun, indem Sie die iFacialMocap-App öffnen und auf das Zahnrad rechts auf dem Bildschirm drücken. Von hier aus können Sie die Ziel-IP auf den Host festlegen, auf dem die App im lokalen Netzwerk ausgeführt wird.
Wenn IFMService
aktiviert ist, fragt es standardmäßig alle 5 Sekunden den IFM-Port (Standard) 49983
ab, bis das erste Paket empfangen wird. Wenn ein solches empfangen wird, wird ein Verbindungsbestätigungspaket an iFacialMocap gesendet, und darauf sollte eine Bestätigungsmeldung erscheinen.
Wenn eine Zeitüberschreitung auftritt, versucht die App alle 5 Sekunden erneut und der Bestätigungsdialog wird erneut angezeigt.
Wenn IFMService ausgeschaltet ist, ist die Portüberwachung deaktiviert.
Das IFM-Paket ist ein fertig geparstes Objekt, das aus den UDP-Nachrichten erstellt wird
Blendshapes
– Enthält ein Objektarray von BlendshapeData
.Head
, LeftEye
, RightEye
sind alle Objekte von IFMTransform
.Name
, der eine Zeichenfolge ist und die ARKit Blendshape-Werte verwendet. Hinweis: Die Protokollkürzel _L
oder _R
werden jeweils durch ARKit-spezifische Left
Right
ersetzt, um die Namenskonsistenz in allen Blendshapes zu gewährleistenValue
der ein ganzzahliger Wert von 0 bis 100 ist. SetBlendshapeForRenderers(SkinnedMeshRenderer[])
– Durchläuft alle bereitgestellten Renderer und wendet gegebenenfalls die Blendshape anPosition
– Vector3-Position relativ zur Kamera. Nur der Kopf hat dieses SetEulerRotation
- Vector3 Euler Graddrehung des Objekts relativ zur Kamera.Utility-Klasse mit statischen Helfern für schnelleres Prototyping oder Implementierung
ApplyBlendshapes(IFMPacket, SkinnedMeshRenderer[])
– Wendet IFMPacket.Blendshapes
auf alle SkinnedMeshRenderers
an, die die gleichen Blendshapes habenGetBlendshapeIndex(SkinnedMeshRenderer, string)
– führt GetBlendShapeIndex für den String aus, führt aber auch einige kurze Schritte durch, um die gesamte Suche zu überspringen, wenn das gemeinsame Netz null ist oder wenn blendshapecount kleiner als 1 istQuelle: Beispielprojekt der iFacialMocap Companion-App