Tutoriel d'initiation à la force et à la position
Ce guide présente une démonstration simple de l'application de forces et de la visualisation du déplacement d'un curseur Inverse3. À la fin, Inverse3 simulera la sensation d'être retenu à la position de départ par un élastique virtuel, tandis qu'un GameObject sphérique affichera la position du curseur.
Introduction
Le guide « Premiers pas » a présenté l'objet Inverse3, ses fonctionnalités et la méthode permettant de générer des forces constantes. Notre objectif ici est de simuler l'effet d'un élastique sur le curseur. Un élastique se comporte de manière similaire à un ressort : sa force dépend à la fois de sa rigidité et de la distance entre ses deux extrémités. Nous cherchons donc à concevoir une fonction qui, à partir d'une position et d'une rigidité, produise une force empêchant le curseur de s'éloigner de l'origine.
Configuration de la scène
Commencez par créer un « Haptic Rig » (pour une main) via le menu « GameObjects » > « Haply ».
Composant ForceAndPosition
Sélectionnez le GameObject Origine haptique puis ajoutez un nouveau script nommé ForceAndPosition.cs, puis remplissez la classe ForceAndPosition avec le code suivant :
[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);
}
Ce segment définit la rigidité à 100 newtons par mètre (N/m), ce qui simule un ressort relativement souple.
Il introduit également inverse3.WorkspaceCenterLocalPosition, une propriété qui renvoie le centre de l'espace de travail.
Cette méthode calcule la force en soustrayant la position du curseur du centre de l'espace de travail, puis multiplie le résultat par la rigidité.
Enfin, la force est appliquée au curseur à l'aide de inverse3.SetCursorLocalForce.
Intégrez les rappels OnDeviceStateChanged dans les méthodes OnEnable et OnDisable, comme décrit dans le Guide « Premiers pas » :
protected void OnEnable()
{
inverse3.DeviceStateChanged += OnDeviceStateChanged;
}
protected void OnDisable()
{
inverse3.DeviceStateChanged -= OnDeviceStateChanged;
}
Expérience de jeu
Placez le curseur Inverse3, activez le mode « Play » et essayez de manœuvrer l'appareil. Vous constaterez que le déplacement du curseur génère une force. Plus le curseur s'éloigne de sa position de départ, plus cette force s'intensifie.

Fichiers source
La scène finale et tous les fichiers associés utilisés dans cet exemple peuvent être importés à partir de l'exemple « Tutorials » du gestionnaire de paquets de Unity.
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);
}
}
}