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 Anleitung „Erste Schritte“ stellte das Objekt Inverse3 sowie dessen 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
Erstellen Sie zunächst über das Menü „GameObjects > Haply “ ein Haptic Rig (eine Hand).
ForceAndPosition-Komponente
Wählen Sie das GameObject aus Haptischer Ursprung aus, fügen Sie ein neues Skript mit dem Namen ForceAndPosition.cs fügen Sie die Klasse hinzu und ergänzen Sie sie 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);
}
In diesem Abschnitt wird die Steifigkeit auf 100 Newton pro Meter (N/m) festgelegt, wodurch eine vergleichsweise weiche Feder simuliert wird.
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 abzieht 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 Anleitung für die ersten Schritte beschrieben:
protected void OnEnable()
{
inverse3.DeviceStateChanged += OnDeviceStateChanged;
}
protected void OnDisable()
{
inverse3.DeviceStateChanged -= OnDeviceStateChanged;
}
Spielverlauf
Halten Sie den Cursor „ Inverse3 “ gedrückt, aktivieren Sie den Wiedergabemodus 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 ist diese Kraft spürbar.

Quelldateien
Die endgültige Szene und alle dazugehörigen Dateien, die in diesem Beispiel verwendet werden, können aus den 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);
}
}
}