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