Zum Haupttext springen

Einführung in Kraft und Position

Dieser Leitfaden enthält ein einfaches Beispiel, bei dem dem Cursor unter Inverse3 eine Kraft zugewiesen und dessen Bewegung visualisiert wird. Am Ende wird unter Inverse3 der Eindruck simuliert, als wäre das Gerät mit einem virtuellen Gummiband an seiner Ausgangsposition befestigt, wobei ein kugelförmiges GameObject die Position des Cursors anzeigt.

Einführung​

In der Einführungsanleitung wurdenInverse3 Objekte, ihre Funktionen und die Erzeugung konstanter Kräfte vorgestellt. Das Ziel hier ist es, einen Gummibandeffekt für den Cursor zu simulieren. Da sich ein Gummiband ähnlich wie eine Feder verhält, wird seine Kraft sowohl von der Steifigkeit als auch vom Abstand zwischen den beiden Endpunkten beeinflusst. Daher ist es unser Ziel, eine Funktion zu entwickeln, die anhand der Position und der Steifigkeit eine Kraft erzeugt, die der Bewegung des Cursors vom Ursprung weg entgegenwirkt.

Szene-Einstellungen​

Erstellen Sie zunächst über das Menü „GameObjects > Haply “ ein **Haptic Rig (one hand)**.

ForceAndPosition-Komponente​

Haptischer Ursprung Wählen Sie ein GameObject aus und ForceAndPosition.csFügen Sie ein neues Skript mit dem Namen hinzu und verwenden Sie anschließend den folgenden Code: ForceAndPosition Erstellen Sie eine Klasse:

[SerializeField]
private Inverse3 inverse3 = null;

[SerializeField, Range(0, 400)]
private float stiffness = 100;

private void OnDeviceStateChanged(object sender, Inverse3EventArgs args)
{
var inverse3 = args.DeviceController;

// Calculate the force.
var force = (inverse3.WorkspaceCenterLocalPosition - inverse3.CursorLocalPosition) * stiffness;

// Apply the force to the cursor.
inverse3.SetCursorLocalForce(force);
}

Dieser Codeausschnitt simuliert eine relativ weiche Feder, indem die Steifigkeit auf 100 Newton pro Meter (N/m) festgelegt wird. Außerdem gibt die Eigenschaft, die den Mittelpunkt des Arbeitsbereichs zurückgibt, inverse3.WorkspaceCenterLocalPositionwird eingeführt. Diese Methode berechnet die Kraft, indem sie die Position des Cursors vom Arbeitsbereichszentrum subtrahiert und das Ergebnis mit der Steifigkeit multipliziert. Schließlich inverse3.SetCursorLocalForceWenden Sie mithilfe von … eine Kraft auf den Cursor an.

Leitfaden für den EinstiegWie dort ausführlich beschrieben, OnEnable sowie OnDisable In der Methode OnDeviceStateChanged Bitte fügen Sie den Callback ein:

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

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

Gameplay​

Inverse3 Aktivieren Sie den Wiedergabemodus, während Sie den Cursor gedrückt halten, und bewegen Sie das Gerät. Sie werden feststellen, dass beim Bewegen des Cursors eine Kraft entsteht. Je weiter sich der Cursor von seiner Ausgangsposition entfernt, desto deutlicher ist diese Kraft zu spüren.

Cursor bewegen

Quelldatei​

Die in diesem Beispiel verwendete endgültige Szene sowie alle zugehörigen Dateien können über den Paket-Manager von Unity unter „Tutorials“ heruntergeladen werden.

ForceAndPosition.cs​

/*
* Copyright 2024 Haply Robotics Inc. All rights reserved.
*/

using Haply.Inverse.DeviceControllers;
using Haply.Inverse.DeviceData;
using UnityEngine;

namespace Haply.Samples.Tutorials._1_ForceAndPosition
{
/// <summary>
/// Demonstrates the application of force to maintain the cursor at its center position.
/// </summary>
public class ForceAndPosition : MonoBehaviour
{
public Inverse3Controller inverse3;

[Range(0, 400)]
// Stiffness of the force feedback.
public float stiffness = 100;

private void Awake()
{
inverse3 ??= FindObjectOfType<Inverse3Controller>();
}

/// <summary>
/// Subscribes to the DeviceStateChanged event when the component is enabled.
/// </summary>
protected void OnEnable()
{
inverse3.DeviceStateChanged += OnDeviceStateChanged;
}

/// <summary>
/// Unsubscribes from the DeviceStateChanged event and reset the force when the component is disabled.
/// </summary>
protected void OnDisable()
{
inverse3.DeviceStateChanged -= OnDeviceStateChanged;
inverse3.Release();
}

/// <summary>
/// Event handler that calculates and send the force to the device when the cursor's position changes.
/// </summary>
/// <param name="sender">The Inverse3 data object.</param>
/// <param name="args">The event arguments containing the device data.</param>
private void OnDeviceStateChanged(object sender, Inverse3EventArgs args)
{
var inverse3 = args.DeviceController;

// Calculate the force.
var force = (inverse3.WorkspaceCenterLocalPosition - inverse3.CursorLocalPosition) * stiffness;

// Apply the force to the cursor.
inverse3.SetCursorLocalForce(force);
}
}
}