Zum Hauptinhalt springen

Grundlegende Anleitung zu Kraft und Position

Dieser Leitfaden enthält eine einfache Demonstration zur Anwendung von Kräften und zur Visualisierung der Bewegung eines Cursors Inverse3. Am Ende simuliert Inverse3 das Gefühl, durch ein virtuelles Gummiband an der Startposition festgehalten zu werden, während ein kugelförmiges GameObject die Position des Cursors anzeigt.

Einführung​

Im Leitfaden „Erste Schritte “ wurden das Objekt Inverse3, seine Funktionen und die Methode zur Erzeugung konstanter Kräfte vorgestellt. Unser Ziel ist es hier, einen Gummibandeffekt auf den Cursor zu simulieren. Ein Gummiband verhält sich ähnlich wie eine Feder: Seine Kraft hängt sowohl von der Steifigkeit als auch vom Abstand zwischen seinen beiden Enden ab. Wir wollen daher eine Funktion entwickeln, die ausgehend von einer Position und einer Steifigkeit eine Kraft erzeugt, die verhindert, dass sich der Cursor vom Ursprung entfernt.

Einrichtung der Szene​

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

Komponente „ForceAndPosition“​

Wählen Sie das GameObject aus Haptischer Ursprung und fügen Sie ein neues Skript mit dem Namen ForceAndPosition.cs, und füllen Sie dann die Klasse aus ForceAndPosition mit dem 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);
}

Dieses Segment legt die Steifigkeit auf 100 Newton pro Meter (N/m) fest, wodurch eine relativ weiche Feder simuliert wird. Außerdem führt es inverse3.WorkspaceCenterLocalPosition, 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.

Fügen Sie die Erinnerungen ein OnDeviceStateChanged in den Methoden OnEnable et OnDisable, wie im Anleitung „Erste Schritte“ :

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

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

Spielerlebnis​

Halten Sie den Schieberegler Inverse3 gedrückt, aktivieren Sie den Wiedergabemodus und versuchen Sie, das Gerät zu steuern. Sie werden feststellen, dass die Bewegung des Schiebereglers eine Kraft erzeugt. Je weiter sich der Schieberegler von seiner Ausgangsposition entfernt, desto stärker wird diese Kraft.

Cursorbewegung

Quelldateien​

Die Schlussszene und alle zugehörigen Dateien, die in diesem Beispiel verwendet werden, können aus dem Beispiel „Tutorials“ im Unity-Paketmanager 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);
}
}
}