Skip to main content
Version : la plus récente

Tutoriel sur la transformation de l'espace de travail des appareils

Les simulations haptiques tentent de reproduire la géométrie d'objets physiques qui peuvent être grands ou petits. Unity utilise des points flottants dans ses calculs internes. plus efficace et plus précis d'utiliser une grande scène, à l'échelle du mètre, et de mettre à l'échelle le mouvement d'Inverse3 plutôt que de mettre la scène à l'échelle du mouvement d'Inverse3. de mettre la scène à l'échelle de l'espace de travail d'Inverse3. Ce tutoriel s'appuie sur le tutoriel Generating Basic retour de force de base pour montrer comment mettre à l'échelle le mouvement et positionner l'espace de travail de l'Inverse3 dans l'espace de travail de l'Inverse3. l'espace de travail de l'Inverse3 dans une scène.

Introduction

Pour mettre à l'échelle le mouvement du curseur, nous allons créer un GameObject Haptic Workspace et placer la sphère Cursor comme enfant. La translation de l'espace de travail haptique permet également de contrôler la position de l'Inverse3 par rapport à la scène. position de l'Inverse3 par rapport à la scène, ce qui signifie que le mouvement du curseur peut être déplacé à un autre endroit sans déplacer la scène. déplacer le mouvement du curseur sans déplacer la scène.

Avant de commencer, remplissez le Générer un retour de force de base et ouvrez le projet. Ensuite, créez un GameObject vide, nommez-le Espace de travail haptiqueet fixer son échelle à (10, 10, 10). Pour cet exemple, une échelle de 10 donnera l'impression qu'un objet de 1 m dans la scène ne mesure que 10 cm, mais vous pouvez la fixer à n'importe quel nombre positif. comme s'il ne mesurait que 10 cm, mais vous pouvez la fixer à n'importe quel nombre positif.

L'espace de travail haptique vous permet également de positionner l'espace de travail de l'appareil par rapport à la scène en modifiant simplement sa position. en changeant simplement sa position. Dans cet exemple, vous pouvez déplacer l'espace de travail vers le haut et vers le bas.

Dans la fenêtre de hiérarchie, faites glisser l'objet Curseur sur l'Espace de travail haptique pour en faire l'enfant de l'Espace de travail haptique. l'espace de travail haptique.

En outre, HapticThread et GroundForce Les scripts peuvent être déplacés de la page Fil haptique GameObject à l'objet Espace de travail haptique et Fil haptique qui est désormais vide et inutile, peut être supprimée.

hiérarchie de l'espace de travail

Maintenant, ouvrez GroundForce.cs et ajoutez les membres suivants :

private float m_workspaceScale;
private float m_workspaceHeight;

m_workspaceScale contient les facteurs d'échelle de la Espace de travail haptique fixée à l'étape précédente alors que m_workspaceHeight représente le décalage de la position de l'espace de travail dans la scène sur l'axe Y. Ensuite, initialiser les deux variables dans le fichier Awake en ajoutant

m_workspaceScale = hapticThread.avatar.parent.lossyScale.y;
m_workspaceHeight = hapticThread.avatar.parent.position.y;

Maintenant, mettez à jour ForceCalculation de telle sorte qu'il tienne compte à la fois du décalage de la position et du changement d'échelle lors du calcul de la position. d'échelle lors du calcul de la contactPoint en remplaçant

var contactPoint = position.y - m_cursorRadius;

avec,

var contactPoint = (position.y * m_workspaceScale) + m_workspaceHeight - m_cursorRadius;

Un mouvement à l'échelle entraînera une mise à l'échelle des forces en même temps que celle de la scène. Pour éviter cela, les calculs de force doivent éliminer la mise à l'échelle de la position en divisant par le facteur d'échelle m_workspaceScale tel que

force.y = penetration * stiffness;

devient,

force.y = (penetration / m_workspaceScale) * stiffness;

Notez que velocity n'est jamais mis à l'échelle.

Lorsque vous passez en mode lecture, vous remarquerez que le mouvement du curseur est plus prononcé, mais que les lectures du curseur dans la fenêtre de l'inspecteur restent les mêmes. curseur dans la fenêtre de l'inspecteur restent les mêmes. Vous pouvez également déplacer l'espace de travail à l'aide des de l'espace de travail haptique.

Notez que les calculs haptiques génèrent une force sur le plan comme s'il était infini. le déplacement latéral de l'espace de travail n'affectera que la visualisation.

échelle de l'espace de travail

décalage de l'espace de travail traduction

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 et Workspace Control dans le gestionnaire de paquets de Unity.

GroundForce.cs

using Haply.HardwareAPI.Unity;
using UnityEngine;

public class GroundForce : MonoBehaviour
{
[Range(0, 800)]
public float stiffness = 600f;

public Transform ground;

private float m_groundHeight;
private float m_cursorRadius;

// Cursor Offset
private float m_workspaceScale;
private float m_workspaceHeight;

private void Awake ()
{
var hapticThread = GetComponent<HapticThread>();

m_groundHeight = ground.transform.position.y;
m_cursorRadius = hapticThread.avatar.lossyScale.y / 2;

m_workspaceScale = hapticThread.avatar.parent.lossyScale.y;
m_workspaceHeight = hapticThread.avatar.parent.position.y;

hapticThread.onInitialized.AddListener(() => hapticThread.Run( ForceCalculation ));
}

private Vector3 ForceCalculation ( in Vector3 position, in Vector3 velocity )
{
var force = Vector3.zero;

// Contact point scaled by parent offset
var contactPoint = (position.y * m_workspaceScale) + m_workspaceHeight - m_cursorRadius;

var penetration = m_groundHeight - contactPoint;
if ( penetration > 0 )
{
force.y = (penetration / m_workspaceScale);;
force.y -= velocity.y * damping;
}
return force;
}
}