Tutoriel sur les notions fondamentales de force et de position
Ce guide présente une démonstration simple permettant de visualiser le déplacement du curseur en appliquant une force Inverse3 . À la fin de ce tutoriel, nous simulerons l'impression queInverse3 est relié à sa position de départ par un élastique virtuel, tandis qu'un GameObject de forme sphérique indiquera la position du curseur.
Introduction
Dans le guide d'introduction,Inverse3 nous avons présenté les objets et leurs fonctionnalités, ainsi que la manière de générer une force constante. L'objectif ici est de simuler l'effet d'un élastique sur le curseur. Un élastique se comporte comme un ressort : sa force dépend à la fois de la rigidité entre ses deux extrémités et de la distance qui les sépare. Nous allons donc chercher à concevoir une fonction qui, à partir d'une position et d'une rigidité données, génère une force s'opposant au mouvement du curseur s'éloignant du point d'origine.
Mise en place de la scène
Commencez par créer un « Haptic Rig (one hand) » à partir du menu GameObjects > Haply.
Composant ForceAndPosition
Origine haptique Sélectionnez un GameObject, puisForceAndPosition.cs Ajoutez un nouveau script portant ce nom, puis utilisez le code suivant : ForceAndPosition Décrire la classe :
[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);
}
Dans ce segment de code, la rigidité est définie à 100 newtons par mètre (N/m) afin de simuler un ressort relativement souple.
Par ailleurs, la propriété qui renvoie le centre de l'espace de travail est inverse3.WorkspaceCenterLocalPosition Nous allons l'implémenter.
Cette méthode calcule la force en soustrayant la position du curseur du centre de l'espace de travail, puis multiplie ce résultat par la rigidité.
Enfin,inverse3.SetCursorLocalForce Utilisez cette fonction pour appliquer cette force au curseur.
Guide d'initiation Comme expliqué en détail dans [...],OnEnable et OnDisable Dans la méthode OnDeviceStateChanged Intégrer une fonction de rappel :
protected void OnEnable()
{
inverse3.DeviceStateChanged += OnDeviceStateChanged;
}
protected void OnDisable()
{
inverse3.DeviceStateChanged -= OnDeviceStateChanged;
}
Gameplay
Inverse3 Saisissez le curseur, activez le mode « Play Mode » et essayez de manipuler l'appareil. Vous constaterez qu'une force se génère lorsque vous déplacez le curseur. Plus vous éloignez le curseur de sa position de départ, plus cette force devient perceptible.

Fichier source
Toutes les scènes finales et tous les fichiers associés utilisés dans cet exemple peuvent être importés à partir de l'exemple « Tutorials » disponible dans le 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);
}
}
}