Tutoriel de base sur le retour de force
Les objets physiques ont deux propriétés qui définissent leurs sensations : la rigidité et l'amortissement. Ce tutoriel Ce tutoriel présente la simulation haptique intégrant à la fois la rigidité et l'amortissement résultant du contact avec un plan horizontal. plan horizontal. Une fois terminée, la simulation vous donnera l'occasion de sentir un "sol" et d'ajuster sa rigidité et son amortissement. d'ajuster ses caractéristiques de rigidité et d'amortissement.
Introduction
Le principal défi de ce tutoriel est de développer une fonction qui calcule les forces résultant du contact avec un plan de sol qui présente à la fois une rigidité et un amortissement. du contact avec un plan de sol qui présente à la fois de la rigidité et de l'amortissement.
La rigidité d'un objet agit comme un ressort : plus il se comprime, plus la force est élevée. En revanche, l'amortissement est la résistance d'un objet au mouvement, l'amortissement est la résistance d'un objet au mouvement. Par exemple, l'eau n'est pas rigide, mais elle est amortie. Elle n'offre donc aucune résistance lorsqu'on la touche lentement, mais beaucoup de résistance lorsqu'elle se déplace rapidement. rapidement.
Configuration de la scène
Commencez par créer un HapticThread et un visualiseur de curseur sphérique, comme indiqué dans le Quick Start Guide de démarrage rapide. Ensuite, créez un plan, nommez-le Ground et définissez sa position y à -0,4. Créez un nouveau script C# appelé GroundForce.cs, ajoutez-le au même GameObject que le HapticThread et ajoutez les propriétés suivantes à la classe GroundForce suivantes à la classe GroundForce
[Range(0, 800)]
public float stiffness = 600f;
[Range(0, 3)]
public float damping = 1;
public Transform ground;
private float m_groundHeight;
private float m_cursorRadius;
Lorsqu'on s'éloigne du plan, Inverse3 ne doit pas générer de forces. Les forces n'apparaissent que lorsque le curseur touche la surface du plan, c'est-à-dire que le curseur pénètre dans le plan. Le calcul de la profondeur de pénétration dépend non seulement de la position du plan mais aussi du rayon de visualisation du curseur. Dans ce cas, la soustraction du rayon de visualisation du curseur Dans ce cas, il suffit de soustraire le rayon du curseur de la position Inverse3 pour rendre correctement l'emplacement relatif du curseur.
Lorsque le curseur touche le plan, la force résultante dépend à la fois de la position et de la vitesse du curseur, qui sont toutes deux fournies par Inverse3 (voir Développer avec Inverse3), ce qui signifie que la méthode La méthode ForceCalculation est
private Vector3 ForceCalculation ( in Vector3 position, in Vector3 velocity )
{
var force = Vector3.zero;
// Bottom of the sphere
var contactPoint = position.y - m_cursorRadius;
var penetration = m_groundHeight - contactPoint;
if ( penetration > 0 )
{
force.y = penetration * stiffness - velocity.y * damping;
}
return force;
}
Ensuite, mettez à jour le fichier Awake
pour : assigner m_groundHeight
et m_cursorRadius
, trouver la Fil haptique,
et le démarrer.
private void Awake ()
{
m_groundHeight = ground.transform.position.y;
var hapticThread = GetComponent<HapticThread>();
m_cursorRadius = hapticThread.avatar.lossyScale.y / 2;
hapticThread.onInitialized.AddListener(() => hapticThread.Run( ForceCalculation ));
}
Enfin, ouvrez la fenêtre de l'inspecteur pour le script GroundForce et affectez le plan de masse au champ correspondant. champ correspondant. Lancez le mode jeu et touchez le plan du sol. Expérimentez avec différentes valeurs de rigidité et d'amortissement et constatez la différence de sensation qu'ils créent.
Fichiers sources
La scène finale et tous les fichiers associés utilisés dans cet exemple peuvent être importés à partir de l'échantillon Basic Force Feedback and Workspace Control dans le gestionnaire de paquets de Unity.
using Haply.HardwareAPI.Unity;
using UnityEngine;
public class GroundForce : MonoBehaviour
{
[Range(0, 800)]
public float stiffness = 600f;
[Range(0, 3)]
public float damping = 1;
public Transform ground;
private float m_groundHeight;
private float m_cursorRadius;
private void Start ()
{
var hapticThread = GetComponent<HapticThread>();
m_groundHeight = ground.transform.position.y;
m_cursorRadius = hapticThread.avatar.lossyScale.y / 2;
hapticThread.onInitialized.AddListener(() => hapticThread.Run( ForceCalculation ));
}
private Vector3 ForceCalculation ( in Vector3 position, in Vector3 velocity )
{
var force = Vector3.zero;
var contactPoint = position.y - m_cursorRadius;
var penetration = m_groundHeight - contactPoint;
if ( penetration > 0 )
{
force.y = penetration * stiffness;
force.y -= velocity.y * damping;
}
return force;
}
}