Zum Hauptinhalt springen
Version: 3.1.3

Grundlegendes Tutorial zu Kraft und Position

Diese Anleitung 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 gefesselt zu sein, während ein kugelförmiges GameObject die Position des Cursors anzeigt.

Einführung

In der Schnellstartanleitung wurde das Inverse3 Objekt, seine Funktionalität und die Methode zur Erzeugung konstanter Kräfte vorgestellt. Unser Ziel ist es, einen Gummibandeffekt auf den Cursor zu simulieren. Ein Gummiband verhält sich ähnlich wie eine Feder, d. h. seine Kraft wird sowohl durch die Steifigkeit als auch durch den Abstand zwischen seinen beiden Endpunkten beeinflusst. Unser Ziel ist es also, eine Funktion zu entwickeln, die bei gegebener Position und Steifigkeit eine Kraft erzeugt, die den Cursor dazu veranlasst, sich vom Ursprung weg zu bewegen.

Szene einrichten

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

ForceAndPosition-Komponente

Wählen Sie die Haptischer Ursprung GameObject und fügen Sie ein neues Skript namens ForceAndPosition.cs und füllt die ForceAndPosition Klasse 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);
}

In diesem Segment wird die Steifigkeit auf 100 Newton pro Meter (N/m) eingestellt, um eine relativ weiche Feder zu simulieren. Es führt außerdem ein inverse3.WorkspaceCenterLocalPositioneine Eigenschaft, die den Mittelpunkt des Arbeitsbereichs zurückgibt. Diese Methode berechnet die Kraft, indem sie die Position des Cursors von der Mitte des Arbeitsbereichs subtrahiert und dann das Ergebnis mit der Steifigkeit multipliziert. Schließlich wird die Kraft auf den Cursor angewendet, indem inverse3.SetCursorLocalForce.

Integrieren Sie die OnDeviceStateChanged Rückrufe in der OnEnable und OnDisable Methoden, wie sie in der Schnellstart-Anleitung:

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

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

Spielverlauf

Halten Sie den Inverse3 Cursor gedrückt, aktivieren Sie den Play-Modus 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 wegbewegt wird, desto stärker wird diese Kraft ausgeprägt.

Cursorbewegung

Quelldateien

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