Grundlegendes Tutorial zu Kraft und Position
Dieser Leitfaden bietet eine einfache Demonstration der Anwendung von Kräften und der Visualisierung der Bewegung eines Inverse3-Cursors. Am Ende wird Inverse3 das Gefühl simulieren, mit einem virtuellen Gummiband an seine Ausgangsposition gebunden zu sein, während ein kugelförmiges GameObject die Position des Cursors anzeigt.
Einführung
Die Erste-Schritte-Anleitung stellte das Objekt Inverse3 sowie seine Funktionsweise und die Methode zur Erzeugung konstanter Kräfte vor. Unser Ziel ist es hier, einen Gummiband-Effekt auf den Cursor zu simulieren. Ein Gummiband verhält sich ähnlich wie eine Feder, d. h. seine Kraft wird sowohl von der Steifigkeit als auch vom Abstand zwischen seinen beiden Endpunkten beeinflusst. Daher wollen wir eine Funktion entwickeln, die aus einer gegebenen Position und Steifigkeit eine Kraft berechnet, durch die sich der Cursor einer Bewegung weg vom Ursprung widersetzt.
Szenenaufbau
Beginnen Sie, indem Sie über das Menü GameObjects > Haply ein Haptic Rig (one hand) erstellen.
ForceAndPosition-Komponente
Wählen Sie das GameObject Haptic Origin aus, fügen Sie ein neues Skript namens ForceAndPosition.cs hinzu und ergänzen Sie die Klasse ForceAndPosition um den folgenden Code:
[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 Abschnitt legt die Steifigkeit auf 100 Newton pro Meter (N/m) fest und simuliert so eine vergleichsweise weiche Feder.
Außerdem wird inverse3.WorkspaceCenterLocalPosition eingeführt, eine Eigenschaft, die den Mittelpunkt des Arbeitsbereichs zurückgibt.
Diese Methode berechnet die Kraft, indem sie die Position des Cursors vom Mittelpunkt des Arbeitsbereichs subtrahiert und das Ergebnis anschließend mit der Steifigkeit multipliziert.
Schließlich wird die Kraft mithilfe von inverse3.SetCursorLocalForce auf den Cursor angewendet.
Integrieren Sie die Callbacks OnDeviceStateChanged in die Methoden OnEnable und OnDisable, wie in der Erste-Schritte-Anleitung beschrieben:
protected void OnEnable()
{
inverse3.DeviceStateChanged += OnDeviceStateChanged;
}
protected void OnDisable()
{
inverse3.DeviceStateChanged -= OnDeviceStateChanged;
}
Gameplay
Halten Sie den Inverse3-Cursor gedrückt, aktivieren Sie den Play Mode und versuchen Sie, das Gerät zu bewegen. Sie werden feststellen, dass das Verschieben des Cursors eine Kraft erzeugt. Je weiter der Cursor von seiner Ausgangsposition entfernt wird, desto stärker wird diese Kraft spürbar.

Quelldateien
Die endgültige Szene und alle zugehörigen Dateien, die in diesem Beispiel verwendet werden, können aus dem Beispiel Tutorials im Package Manager von Unity importiert 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);
}
}
}