Aller au contenu principal

Tutoriel de base sur 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 un effet d'élastique sur le curseur. Un élastique se comporte de façon similaire à un ressort : sa force dépend à la fois de la rigidité et de la distance entre ses deux extrémités. Nous visons donc à concevoir une fonction qui, à partir d'une position et d'une rigidité, produit une force empêchant le curseur de s'éloigner de l'origine.

Configuration de la scène​

Commencez par créer un Haptic Rig (one hand) via le menu GameObjects > Haply.

Composant ForceAndPosition​

Sélectionnez le GameObject Haptic Origin et 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 fixe 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​

Tenez le curseur Inverse3, activez le Play Mode 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 devient prononcée.

déplacement du curseur

Fichiers source​

La scène finale et tous les fichiers associés utilisés dans cet exemple peuvent être importés depuis 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);
}
}
}