Zum Hauptinhalt springen
Version: neueste

Tutorial zum Transformieren des Gerätearbeitsbereichs

Haptische Simulationen versuchen, die Geometrie physischer Objekte zu replizieren, die groß oder klein sein können. Unity verwendet in seinen internen Berechnungen Fließkommazahlen, was bedeutet, dass es effizienter und genauer ist, eine große Szene effizienter und genauer ist, eine große Szene im Meterbereich zu verwenden und die Bewegung von Inverse3zu skalieren, anstatt die Szene auf den Arbeitsbereich von Inverse3zu skalieren. Dieses Tutorial baut auf dem Tutorial Generating Basic Force-Feedback-Tutorial auf und zeigt, wie man die Bewegung skaliert und den Arbeitsbereich von Inverse3 in einer Szene zu positionieren.

Einführung

Um die Bewegung des Cursors zu skalieren, erstellen wir ein Haptic Workspace GameObject und platzieren die Cursor Kugel als sein Kind. Die Übersetzung des Haptic Workspace bietet auch Kontrolle über die Position von Inverse3 relativ zur Szene, d. h. die Cursorbewegung kann an eine andere Stelle verschoben werden Position verschoben werden, ohne die Szene zu bewegen.

Bevor Sie beginnen, füllen Sie die Grundlegende Kraft-Rückkopplung generieren Tutorial und öffnen Sie das Projekt. Als nächstes erstellen Sie ein leeres GameObject und nennen es Haptischer Arbeitsbereichund setzen Sie den Maßstab auf (10, 10, 10). In diesem Beispiel bewirkt ein Maßstab von 10, dass ein 1 m großes Objekt in der Szene als wäre es nur 10 cm groß, aber Sie können den Wert auf jede positive Zahl setzen.

Mit dem haptischen Arbeitsbereich können Sie den Arbeitsbereich des Geräts auch relativ zur Szene positionieren, indem Sie einfach seine Position ändern. In diesem Beispiel können Sie den Arbeitsbereich nach oben und unten verschieben.

Ziehen Sie im Hierarchiefenster das Objekt Cursor auf den Haptischen Arbeitsbereich, um es zum Haptic Workspacezum Kind desHaptic Workspacezu machen.

Auch, HapticThread und GroundForce Skripte können aus dem Haptisches Gewinde GameObject an die Haptischer Arbeitsbereich und Haptisches Gewinde die nun leer und nutzlos ist, kann gelöscht werden.

Arbeitsbereichshierarchie

Jetzt öffnen GroundForce.cs und fügen Sie die folgenden Mitglieder hinzu:

private float m_workspaceScale;
private float m_workspaceHeight;

m_workspaceScale enthält die Skalierungsfaktoren der Haptischer Arbeitsbereich die im vorangegangenen Schritt festgelegt wurde während m_workspaceHeight steht für den Positionsversatz des Arbeitsbereichs in der Szene auf der Y-Achse. Weiter, initialisieren Sie die beiden Variablen in der Datei Awake Methode durch Hinzufügen von

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

Jetzt aktualisieren ForceCalculation so, dass es sowohl den Positionsversatz als auch die Änderung des Maßstabsänderung bei der Berechnung der contactPoint durch Ersetzen

var contactPoint = position.y - m_cursorRadius;

mit,

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

Bei einer skalierten Bewegung werden die Kräfte mit der Szene skaliert. Um dies zu vermeiden, müssen die Kraft Berechnungen die Positionsskalierung eliminieren, indem sie durch den Skalierungsfaktor dividiert werden m_workspaceScale derart, dass

force.y = penetration * stiffness;

wird,

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

Beachten Sie, dass velocity wird nie nach oben oder unten skaliert.

Wenn Sie in den Wiedergabemodus wechseln, werden Sie feststellen, dass die Bewegung des Cursors ausgeprägter ist, die Cursor-Anzeigen im Inspektorfenster bleiben jedoch unverändert. Sie können den Arbeitsbereich auch mit den Positionsparameter des haptischen Arbeitsbereichs verschieben.

Beachten Sie, dass die haptischen Berechnungen eine Kraft über die Ebene erzeugen, als ob sie unendlich wäre, so dass Wenn Sie den Arbeitsbereich seitlich verschieben, wirkt sich dies nur auf die Visualisierung aus.

Arbeitsbereichsskala

Arbeitsbereich-Offset-Übersetzung

Quelldateien

Die endgültige Szene und alle zugehörigen Dateien, die in diesem Beispiel verwendet werden, können aus dem Basic Force Feedback und Workspace Control im Paketmanager von Unity importiert werden.

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;
}
}