Aller directement au corps du texte

Tutoriel sur les forces et les positions de base

Ce guide propose un exemple simple permettant d'appliquer une force au curseur Inverse3 et de visualiser son mouvement. À la fin, Inverse3 simule la sensation d'un appareil relié à sa position de départ par un élastique virtuel, tandis qu'un GameObject sphérique indique la position du curseur.

Présentation​

Dans le guide de démarrage, Inverse3 nous avons présenté les objets, leurs fonctionnalités et la manière de générer une force constante. L'objectif ici est de simuler un effet d'élastique sur le curseur. Un élastique se comportant 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. Notre objectif est donc de concevoir une fonction qui, à partir de la position et de la rigidité, génère une force s'opposant au mouvement du curseur s'éloignant du point d'origine.

Paramètres de la scène​

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

Composant ForceAndPosition​

Origine haptique Sélectionnez un GameObject, puis ForceAndPosition.csAjoutez un nouveau script nommé [...], puis utilisez le code ci-dessous pour ForceAndPosition Écrire une 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);
}

Cet extrait de code simule un ressort relativement souple en définissant sa rigidité à 100 newtons par mètre (N/m). Il contient également une propriété qui renvoie le centre de l'espace de travail, à savoir inverse3.WorkspaceCenterLocalPositionest introduite. Cette méthode calcule la force en soustrayant la position du curseur du centre de l'espace de travail, puis en multipliant le résultat par la rigidité. Enfin, inverse3.SetCursorLocalForceUtilisez cette fonction pour appliquer une force au curseur.

Guide de démarrageComme expliqué en détail dans [...], OnEnable et OnDisable Dans la méthode OnDeviceStateChanged Veuillez inclure la fonction de rappel :

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

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

Gameplay​

Inverse3 Activez le mode « Play » tout en maintenant le curseur sélectionné, puis déplacez l'appareil. Vous constaterez qu'une force s'exerce lorsque vous déplacez le curseur. Plus le curseur s'éloigne de sa position initiale, plus cette force se fait sentir.

Déplacement du curseur

Fichier source​

La scène finale utilisée dans cet exemple, ainsi que tous les fichiers associés, peuvent être importés via l'exemple « Tutorials » 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);
}
}
}