Zum Hauptinhalt springen

Erste Schritte mit dem Inverse Unity Package

Dieser Leitfaden beschreibt die grundlegende Einrichtung und veranschaulicht anhand eines einfachen Beispiels die Grundfunktionen des „ Haply -Inverse-Unity-Pakets“: die Installation des Pakets, die Einrichtung eines Haptic-Rigs sowie das Erstellen einfacher Skripte für die Kraft- und Positionssteuerung.

Ausführliche Informationen und fortgeschrittene Techniken finden Sie in den Tutorials.

Versionsunterstützung​

  • Unity 2021.3.x LTS: wird unterstützt
  • Unity 2022.1.x LTS: wird unterstützt
  • Unity 6000.x LTS: wird unterstützt
  • Haply Inverse SDK: 3.1.0 oder neuer

Voraussetzungen​

  • Installieren Sie das Haply Inverse SDK in Version 3.1.0 oder neuer.
  • Stellen Sie sicher, dass der „Haply -Inverse-Service“ betriebsbereit ist.
  • Vergewissern Sie sich, dass Ihre „ Inverse3 “- und „VerseGrip“-Geräte verbunden und kalibriert sind, bevor Sie die Szene starten.
Hinweis

Das Paket wird kontinuierlich weiterentwickelt, um die Unterstützung für „ Inverse3 “ zu verbessern. Für Support, Feedback oder Anfragen kontaktieren Sie uns bitte.

Einrichtung​

Das Inverse Unity-Paket ist über die Scoped Registry von Unity verfügbar. Gehen Sie zur Integration des Pakets wie folgt vor:

  1. Öffnen Sie „Bearbeiten“ > „Projekteinstellungen“ > „Paketmanager“. Fügen Sie eine neue bereichsbezogene Registry mit den folgenden Angaben hinzu:

    • Name: Haply Robotics
    • URL: https://unitypackages.haply.co
    • Geltungsbereich(e): co.haply

    scoped-registry

  2. Rufen Sie an Fenster > Paketmanager Klicken Sie auf die Schaltfläche hinzufügen + und wählen Sie Paket nach Name hinzufügen. Geben Sie co.haply.inverse Geben Sie ein und klicken Sie auf hinzufügen.

    upm-ui-quick-add

Nach erfolgreicher Installation zeigt der Paketmanager das Inverse-Paket an.

Einrichtung des Haptic Rig​

Um ein Haptic Rig zu erstellen, navigieren Sie zu „GameObject“ > „ Haply “ > „Inverse“ > „Haptic Rig (one hand)“. Dabei wird eine vollständige Umgebung mit dem „ Inverse3 “-Controller und dem „VerseGrip“ zusammengestellt.

Ihre Szene enthält anschließend:

  • Haptic Device Mapper: Verwaltet die Gerätezuordnung über den „Haply “-Inverse-Service.
  • Haptic Origin: Skaliert und positioniert das Haptik-Setup innerhalb der Szene.
  • Haptic Controller: Verwaltet die Cursorkraft bzw. die Cursorposition auf Basis der Gerätedaten von Inverse3 und VerseGrip.
  • Cursor: Enthält die Komponenten „Inverse3 -Cursor“ und „VerseGrip-Cursor“ für die Darstellung in der Szene.

Haptik-Rig

Weitere Informationen zu den Komponenten des Pakets finden Sie auf der Seite „Globale Architektur“.

Im Spielmodus bewegt und dreht sich die Kugel synchron mit dem Cursor des Inverse3 und der Ausrichtung des VerseGrip.

inverse3-Inspektor

Griffinspektor

Kraftregelungsmodus​

Erstellen Sie ein C#-Skript ForceControl.cs und fügen Sie es dem GameObject hinzu Haptischer Ursprung an. Mit diesem Skript können Sie über Schieberegler im Inspector Kräfte auf das Gerät ausüben Inverse3 anzuwenden.

using Haply.Inverse;
using UnityEngine;

public class ForceControl : MonoBehaviour
{
[Range(-2, 2)]
public float forceX;
[Range(-2, 2)]
public float forceY;
[Range(-2, 2)]
public float forceZ;

private Inverse3 _inverse3;

private void Awake()
{
_inverse3 = GetComponentInChildren<Inverse3>();
}

protected void OnEnable()
{
_inverse3.DeviceStateChanged += OnDeviceStateChanged;
}

protected void OnDisable()
{
_inverse3.DeviceStateChanged -= OnDeviceStateChanged;
_inverse3.Release();
}

private void OnDeviceStateChanged(object sender, Inverse3EventArgs args)
{
var inverse3 = args.DeviceController;
inverse3.SetCursorLocalForce(new Vector3(forceX, forceY, forceZ));
}
}

Zwangskontrolle

Erläuterung des Skripts​

  • forceX, Y, Z: Über Schieberegler anpassbare Komponenten des Kraftvektors; sie stellen sicher, dass die Kräfte vor der Übergabe an die Methode CursorSetForce innerhalb sicherer Grenzen bleiben. Alternativ könnte ein Standardfeld Vector3 verwendet werden.

  • Awake(): Ruft die Komponente auf Inverse3 hängt vom aktuellen GameObject oder einem seiner untergeordneten Objekte ab.

  • OnEnable(): Registriert den Callback OnDeviceStateChanged für das haptische Update in einem separaten Thread, nachdem die Methode Awake aufgerufen wurde, und jedes Mal, wenn das Skript aktiviert wird.

  • OnDisable(): Hebt die Registrierung des Callbacks auf und setzt die Kraft zurück, wenn das Skript deaktiviert oder die Anwendung beendet wird.

  • OnDeviceStateChanged: Ruft den Vektor auf force aus dem Inspector-Fenster und leitet ihn mithilfe der Methode CursorSetForce an das Inverse3 weiter.

    WICHTIG: Der Callback wird vom Haptik-Thread mit hoher Frequenz ausgelöst, im Bereich von 1 kHz bis 8 kHz. Es ist entscheidend, dass der gesamte Code in diesem Callback stark optimiert ist.

Verwendung​

Stellen Sie vor dem Wechsel in den Play-Modus sicher, dass Sie den Cursor gedrückt halten. Das Gerät sollte in den „Force Control “-Modus wechseln, erkennbar an einer grünen Leuchte. Anschließend können Sie den Arbeitsbereich des Geräts durchlaufen, indem Sie die Kraftabgabe über die Schieberegler anpassen.

Warnung

Durch die Anpassung der Kräfte bewegt sich Inverse3 . Stellen Sie sicher, dass Ihr Arbeitsbereich frei ist, und halten Sie den Cursor stets fest. Sicherheitshinweise finden Sie im Artikel zur sicheren Verwendung.

cursor-set-force

Positionssteuerungsmodus​

Erstellen Sie ebenfalls ein C#-Skript PositionControl.cs um die Position des Geräts zu steuern, und hängen Sie es an das GameObject an Haptischer Ursprung an.

using Haply.Inverse;
using UnityEngine;

public class PositionControl : MonoBehaviour
{
[Range(-0.1f, 0.1f)]
public float positionX;
[Range(-0.1f, 0.1f)]
public float positionY;
[Range(-0.1f, 0.1f)]
public float positionZ;

private Inverse3 _inverse3;

private void Awake()
{
_inverse3 = GetComponentInChildren<Inverse3>();
}

protected void OnEnable()
{
_inverse3.DeviceStateChanged += OnDeviceStateChanged;
}

protected void OnDisable()
{
_inverse3.DeviceStateChanged -= OnDeviceStateChanged;
_inverse3.Release();
}

private void OnDeviceStateChanged(object sender, Inverse3EventArgs args)
{
var inverse3 = args.DeviceController;
inverse3.SetCursorLocalPosition(inverse3.WorkspaceCenterLocalPosition + new Vector3(positionX, positionY, positionZ));
}
}

Stellen Sie sicher, dass das ForceControl-Skript oder andere Skripte, die das Gerät steuern, deaktiviert sind.

Positionssteuerung

Ähnlich wie im vorherigen Beispiel:

  • Verwenden Sie positionX, Y, and Z, um die Position während des Wiedergabemodus über Schieberegler anzupassen.

    Der ausgewählte Bereich Range(-0.1, 0.1) entspricht in etwa der maximal erreichbaren Position.

  • Die Methode Awake ruft die Komponente auf Inverse3 ab.
  • Die Methode OnEnable registriert den Callback OnDeviceStateChanged aus dem haptischen Update in einem separaten Thread nach dem Aufruf der Methode Awake und jedes Mal, wenn das Skript aktiviert wird.
  • Die Methode OnDisable Hebt die Registrierung des Callbacks auf und setzt die Kraft zurück, wenn das Skript deaktiviert oder die Anwendung beendet wird.

Es gibt jedoch Unterschiede:

  • Der Callback OnDeviceStateChanged nimmt während jedes haptischen Frames den Positionsvektor aus dem Inspektor-Fenster, addiert ihn zu WorkspaceCenterLocalPosition und sendet ihn mithilfe der Methode CursorSetLocalPosition ein Inverse3.

Halten Sie den Cursor vor dem Wechsel in den Wiedergabemodus nahe an der Mittelposition. Das Gerät sollte in den Positionssteuerungsmodus wechseln (angezeigt durch ein blaues Licht). Anschließend können Sie den Arbeitsbereich des Geräts erkunden, indem Sie die Positionsausgabe mit den Schiebereglern anpassen.

Warnung

Beim Anpassen der Position bewegt sich Inverse3. Stellen Sie sicher, dass der Arbeitsbereich frei von Wertgegenständen ist, und halten Sie den Cursor stets fest. Weitere Details finden Sie im Artikel zur sicheren Verwendung.

Cursorposition festlegen