Didacticiel de base sur la force et la position
Ce guide propose une démonstration simple de l'application de forces et de la visualisation du mouvement d'un curseur Inverse3 . À la fin, le site Inverse3 simulera la sensation d'être attaché à sa position de départ par un élastique virtuel, tandis qu'un GameObject sphérique affichera la position du curseur.
Introduction
Le Guide de démarrage rapide a présenté l'objet Inverse3 ses fonctionnalités et la méthode pour générer des forces constantes. Notre objectif ici est de simuler l'effet d'un élastique sur le curseur. Un élastique se comporte comme un ressort, c'est-à-dire que sa force est influencée à la fois par la rigidité et par la distance entre ses deux extrémités. Nous cherchons donc à concevoir une fonction qui, compte tenu d'une position et d'une rigidité, produise une force qui empêche le curseur de s'éloigner de l'origine.
Configuration de la scène
Commencez par créer un Haptic Rig (une main) via le menu GameObjects > Haply.
Composant ForceAndPosition
Sélectionnez l'option Origine haptique GameObject et ajoutez un nouveau script nommé ForceAndPosition.cs
et de remplir le 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), simulant ainsi 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 la méthode inverse3.SetCursorLocalForce
.
Incorporer le OnDeviceStateChanged
dans le OnEnable
et OnDisable
comme indiqué dans le Guide de démarrage rapide:
protected void OnEnable()
{
inverse3.DeviceStateChanged += OnDeviceStateChanged;
}
protected void OnDisable()
{
inverse3.DeviceStateChanged -= OnDeviceStateChanged;
}
Gameplay
Maintenez 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 est éloigné de sa position de départ, plus cette force est prononcée.
Fichiers sources
La scène finale et tous les fichiers associés utilisés dans cet exemple peuvent être importés depuis l'échantillon Tutorials dans le gestionnaire de paquets d'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);
}
}
}