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 Vector3 _initialPosition = Vector3.zero;
private Vector3 ForceCalculation(in Vector3 position)
{
if (_initialPosition == Vector3.zero)
{
// Save the initial device effector position
_initialPosition = position;
}
// Return force opposing movement from the initial position
return (_initialPosition - position) * stiffness;
}
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 _initialPosition
ein Vektor, der die Startposition des Cursors erfasst.
Die ForceCalculation
Methode erfasst bei ihrer ersten Ausführung die Ausgangsposition und berechnet anschließend die Kraft, die der Bewegung des Cursors entgegensteht.
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.
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.Unity;
using UnityEngine;
namespace Haply.Samples.Tutorials._1_ForceAndPosition
{
/// <summary>
/// Demonstrates the application of force to maintain the cursor at its initial position.
/// </summary>
public class ForceAndPosition : MonoBehaviour
{
// Must be assigned in inspector
public Inverse3 inverse3;
[Range(0, 400)]
// Stiffness of the force feedback.
public float stiffness = 100;
// Stores the initial position of the cursor.
private Vector3 _initialPosition = Vector3.zero;
/// <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;
}
/// <summary>
/// Calculates the force required to maintain the cursor at its initial position.
/// </summary>
/// <param name="position">The current position of the cursor.</param>
/// <returns>The calculated force vector.</returns>
private Vector3 ForceCalculation(in Vector3 position)
{
if (_initialPosition == Vector3.zero)
{
// save the first device effector position
_initialPosition = position;
}
// return opposite force to stay at initial position
return (_initialPosition - position) * stiffness;
}
/// <summary>
/// Event handler that calculates and send the force to the device when the cursor's position changes.
/// </summary>
/// <param name="device">The Inverse3 device instance.</param>
private void OnDeviceStateChanged(Inverse3 device)
{
// Calculate the force.
var force = ForceCalculation(device.CursorLocalPosition);
// Apply the force to the cursor.
inverse3.CursorSetLocalForce(force);
}
}
} // namespace Haply.Samples.Tutorials._1_ForceAndPosition