Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Solver sind Komponenten, die die Berechnung der Position eines Objekts & Ausrichtung gemäß einem vordefinierten Algorithmus erleichtern. Ein Beispiel ist das Platzieren eines Objekts auf der Oberfläche, auf die der Anvisieren-Raycast des Benutzers derzeit trifft.
Darüber hinaus definiert das Solver-System deterministisch eine Reihenfolge von Vorgängen für diese Transformationsberechnungen, da es keine zuverlässige Möglichkeit gibt, Unity die Updatereihenfolge für Komponenten anzugeben.
Solver bieten eine Reihe von Verhaltensweisen zum Anfügen von Objekten an andere Objekte oder Systeme. Ein weiteres Beispiel wäre ein Tag-along-Objekt, das sich vor dem Benutzer bewegt (basierend auf der Kamera). Ein Solver kann auch an einen Controller und ein -Objekt angefügt werden, um das Objekt entlang des Controllers als Tag festzulegen. Alle Solver können sicher gestapelt werden, z. B. ein Tag-Along-Verhalten + Oberflächenmagnetismus + Impuls.
Verwenden eines Solvers
Das Solver-System besteht aus drei Kategorien von Skripts:
-
Solver: Die abstrakte Basisklasse, von der alle Solver abgeleitet werden. Es bietet Zustandsnachverfolgung, Glättungsparameter und Implementierung, automatische Solver-Systemintegration und Updatereihenfolge. -
SolverHandler: Legt das Referenzobjekt fest, das nachverfolgt werden soll (z. B. die Hauptkameratransformation, Handstrahl usw.), übernimmt das Sammeln von Solverkomponenten und führt die Aktualisierung in der richtigen Reihenfolge aus.
Die dritte Kategorie ist der Solver selbst. Die folgenden Solver stellen die Bausteine für das grundlegende Verhalten bereit:
-
Orbital: Sperrt an einer angegebenen Position und einem Offset des Objekts, auf das verwiesen wird. -
ConstantViewSize: Skaliert, um eine konstante Größe relativ zur Ansicht des Objekts beizubehalten, auf das verwiesen wird. -
RadialView: Behält das Objekt in einem Ansichtskegel bei, der vom Objekt, auf das verwiesen wird, umgewandelt wird. -
Follow: Behält das -Objekt innerhalb eines Satzes von benutzerdefinierten Begrenzungen des Objekts, auf das verwiesen wird, bei. -
InBetween: Behält ein Objekt zwischen zwei nachverfolgten Objekten bei. -
SurfaceMagnetism: Wirft Strahlen auf Oberflächen in der Welt und richtet das Objekt an dieser Oberfläche aus. -
DirectionalIndicator: Bestimmt die Position und Ausrichtung eines Objekts als Richtungsindikator. Vom Bezugspunkt des SolverHandler Tracked Target wird dieser Indikator auf das angegebene DirectionalTarget ausgerichtet. -
Momentum: Wendet Beschleunigung/Geschwindigkeit/Reibung an, um Dynamik und Federung für ein Objekt zu simulieren, das von anderen Solvern/Komponenten bewegt wird. -
HandConstraint: Schränkt das Objekt ein, um Händen in einem Bereich zu folgen, der das GameObject nicht mit den Händen überschneidet. Nützlich für von Hand eingeschränkte interaktive Inhalte wie Menüs usw. Dieser Solver soll mit IMixedRealityHand arbeiten, funktioniert aber auch mit IMixedRealityController. -
HandConstraintPalmUp: Wird von HandConstraint abgeleitet, enthält jedoch Logik, um zu testen, ob die Handfläche vor der Aktivierung dem Benutzer zugewandt ist. Dieser Solver funktioniert nur mit IMixedRealityHand-Controllern . Bei anderen Controllertypen verhält sich dieser Solver genauso wie seine Basisklasse.
Um das Solver-System zu verwenden, fügen Sie einfach eine der oben aufgeführten Komponenten zu einem GameObject hinzu. Da alle Solver einen SolverHandlererfordern, wird eine von Unity automatisch erstellt.
Hinweis
Beispiele für die Verwendung des Solvers-Systems finden Sie in der Datei SolverExamples.scene .
Ändern der Nachverfolgungsreferenz
Die Tracked Target Type - Eigenschaft der SolverHandler Komponente definiert den Bezugspunkt, den alle Solver zum Berechnen ihrer Algorithmen verwenden. Beispielsweise führt ein Werttyp von Head mit einer einfachen SurfaceMagnetism Komponente zu einem Raycast vom Kopf und in Richtung des Anvisierens des Benutzers, um zu lösen, welche Oberfläche getroffen wird. Mögliche Werte für die TrackedTargetType Eigenschaft sind:
- Kopf : Bezugspunkt ist die Transformation der Hauptkamera.
-
ControllerRay: Bezugspunkt ist die
LinePointerTransformation auf einem Controller (d. h. Zeigerursprung auf einem Bewegungscontroller oder Handcontroller), der in Richtung des Linienstrahls zeigt.- Verwenden Sie die
TrackedHandedness-Eigenschaft, um die Händigkeitseinstellung auszuwählen (d. h. Links, Rechts, Beide).
- Verwenden Sie die
-
HandJoint: Bezugspunkt ist die Transformation eines bestimmten Handgelenks.
- Verwenden Sie die
TrackedHandedness-Eigenschaft, um die Händigkeitseinstellung auszuwählen (d. h. Links, Rechts, Beide). - Verwenden Sie die
TrackedHandJoint-Eigenschaft, um die zu verwendende gemeinsame Transformation zu bestimmen.
- Verwenden Sie die
-
CustomOverride: Bezugspunkt aus dem zugewiesenen
TransformOverride
Hinweis
Sowohl für ControllerRay - als auch für HandJoint-Typen versucht der Solver-Handler, zuerst die linke Controller-/Handtransformation und dann die rechte bereitzustellen, wenn erstere nicht verfügbar ist, oder es sei denn, die TrackedHandedness Eigenschaft gibt etwas anderes an.
Beispiel für verschiedene Eigenschaften, die jedem TrackedTargetType zugeordnet sind
Wichtig
Die meisten Solver verwenden den Vorwärtsvektor des verfolgten Transformationsziels, das SolverHandlervon bereitgestellt wird. Bei Verwendung eines verfolgten Handgelenk-Zieltyps kann der Vorwärtsvektor des Handflächengelenks durch die Finger und nicht durch die Handfläche zeigen. Dies hängt von der Plattform ab, die die Handgelenkdaten liefert. Für eingabesimulation und Windows Mixed Reality ist es der aufwärts Vektor, der durch die Handfläche nach oben zeigt (d. h. der grüne Vektor ist nach oben, der blaue Vektor ist vorwärts).
Um dies zu umgehen, aktualisieren Sie die Eigenschaft Zusätzliche Drehung für den SolverHandler auf <90, 0, 0>. Dadurch wird sichergestellt, dass der Vorwärtsvektor, der den Solvern bereitgestellt wird, durch die Handfläche und von der Hand nach außen zeigt.
Alternativ können Sie den Zieltyp Controller Ray tracked verwenden, um ein ähnliches Verhalten beim Zeigen mit den Händen zu erhalten.
Verketten von Solvern
Es ist möglich, demselben GameObject mehrere Solver Komponenten hinzuzufügen, wodurch ihre Algorithmen verkettet werden. Die SolverHandler Komponenten übernehmen die Aktualisierung aller Solver auf demselben GameObject. Standardmäßig rufen die SolverHandler Aufrufe GetComponents<Solver>() von Start auf, wodurch die Solver in der Reihenfolge zurückgegeben werden, in der sie im Inspektor angezeigt werden.
Darüber hinaus weist das Festlegen der Aktualisierten verknüpften Transformationseigenschaft auf true an, dass Solver die berechnete Position, Ausrichtung & Skalierung auf eine zwischengeschaltete Variable gespeichert werden soll, auf die alle Solver zugreifen können (d. h GoalPosition. ). Bei "false" wird die Solver Transformation des GameObject direkt aktualisiert. Indem die Transformationseigenschaften an einem zwischengeschalteten Speicherort gespeichert werden, können andere Solver ihre Berechnungen ab der Zwischenvariablen ausführen. Dies liegt daran, dass Unity nicht zulässt, dass Updates für gameObject.transform innerhalb desselben Frames gestapelt werden.
Hinweis
Entwickler können die Ausführungsreihenfolge von Solvers ändern, indem sie die SolverHandler.Solvers -Eigenschaft direkt festlegen.
Erstellen eines neuen Solvers
Alle Solver müssen von der abstrakten Basisklasse erben. Solver Die primären Anforderungen einer Solver-Erweiterung umfassen das Überschreiben der SolverUpdate -Methode. Bei dieser Methode sollten Entwickler die geerbten GoalPositionEigenschaften und GoalScaleGoalRotation auf die gewünschten Werte aktualisieren. Darüber hinaus ist es in der Regel wertvoll, als Bezugsrahmen zu nutzen SolverHandler.TransformTarget , der vom Verbraucher gewünscht wird.
Der unten angegebene Code enthält ein Beispiel für eine neue Solver-Komponente namens InFront , die das angefügte Objekt 2 m vor dem SolverHandler.TransformTargetplatziert.
SolverHandler.TrackedTargetType Wenn vom Consumer als Headfestgelegt wird, wird die SolverHandler.TransformTarget Kameratransformation verwendet, und daher platziert dieser Solver das angeschlossene GameObject 2m vor dem Anvisieren jedes Frames des Benutzers.
/// <summary>
/// InFront solver positions an object 2m in front of the tracked transform target
/// </summary>
public class InFront : Solver
{
...
public override void SolverUpdate()
{
if (SolverHandler != null && SolverHandler.TransformTarget != null)
{
var target = SolverHandler.TransformTarget;
GoalPosition = target.position + target.forward * 2.0f;
}
}
}
Solver-Implementierungsleitfäden
Allgemeine Solvereigenschaften
Jede Solver-Komponente verfügt über einen Kernsatz identischer Eigenschaften, die das Solver-Kernverhalten steuern.
Wenn glätten aktiviert ist, aktualisiert Solver die Transformation des GameObject im Laufe der Zeit schrittweise auf die berechneten Werte. Die Geschwindigkeit dieser Änderung wird durch die LerpTime-Eigenschaft jeder Transformationskomponente bestimmt. Beispielsweise führt ein höherer MoveLerpTime-Wert zu langsameren Inkrementen bei der Bewegung zwischen Frames.
Wenn MaintainScale aktiviert ist, verwendet solver die lokale Standardskalierung von GameObject.
Allgemeine Eigenschaften, die von allen Solver-Komponenten geerbt werden
Orbital
Die Orbital -Klasse ist eine Tag-along-Komponente, die sich wie Planeten in einem Sonnensystem verhält. Dieser Solver stellt sicher, dass das angefügte GameObject die nachverfolgte Transformation umrundet. Wenn also der Nachverfolgte Zieltyp des SolverHandler auf Headfestgelegt ist, wird das GameObject um den Kopf des Benutzers herum kreisen, wobei ein fester Offset angewendet wird.
Entwickler können diesen festen Offset ändern, um Menüs oder andere Szenenkomponenten auf Augenhöhe oder auf Taillenebene usw. um einen Benutzer herum zu halten. Dies erfolgt durch Ändern der Eigenschaften Lokaler Offset und Weltoffset . Die Orientation Type - Eigenschaft bestimmt die Drehung, die auf das Objekt angewendet wird, wenn es seine ursprüngliche Drehung beibehalten oder immer der Kamera oder dem Gesicht zugewandt werden soll, unabhängig davon, welche Transformation die Position usw. antreibt.
Orbitales Beispiel
RadialView
Ist RadialView eine weitere Tag-along-Komponente, die einen bestimmten Teil eines GameObject innerhalb des Frustums der Ansicht des Benutzers behält.
Die Eigenschaften Min & Max View Degrees bestimmen, wie groß ein Teil des GameObject immer angezeigt werden muss.
Die Eigenschaften Min & Max Distance bestimmen, wie weit das GameObject vom Benutzer entfernt bleiben soll. Wenn Sie beispielsweise mit einer Mindestabstand von 1 m auf das GameObject zugehen, wird das GameObject entfernt, um sicherzustellen, dass es dem Benutzer nie näher als 1 m ist.
Im Allgemeinen wird der RadialView in Verbindung mit dem Aufverfolgten Zieltyp auf festgelegt Head , sodass die Komponente dem Anvisieren des Benutzers folgt. Diese Komponente kann jedoch so funktionieren, dass sie in der "Ansicht" eines beliebigen nachverfolgten Zieltyps beibehalten wird.
RadialView-Beispiel
Folgen
Die Follow -Klasse positioniert ein Element vor dem des nachverfolgten Ziels relativ zur lokalen Vorwärtsachse. Das Element kann lose eingeschränkt werden (auch als Tag-Along bezeichnet), sodass es erst folgt, wenn das nachverfolgte Ziel über benutzerdefinierte Grenzen hinaus bewegt wird.
Es funktioniert ähnlich wie der RadialView-Solver mit zusätzlichen Steuerelementen zum Verwalten der maximalen horizontalen & Grad der vertikalen Ansicht und Mechanismen zum Ändern der Ausrichtung des Objekts.
Eigenschaften folgen
Beispielszene folgen (Assets/MRTK/Examples/Demos/Solvers/Scenes/FollowSolverExample.unity)
Dazwischen
Die InBetween -Klasse behält das angefügte GameObject zwischen zwei Transformationen bei. Diese beiden Transformationsendpunkte werden durch den gameObject-eigenen SolverHandlerNachverfolgten Zieltyp und die Second Tracked Target Type-Eigenschaft der InBetween Komponente definiert. Im Allgemeinen werden beide Typen auf CustomOverride und die resultierenden SolverHandler.TransformOverride Werte und InBetween.SecondTransformOverride auf die beiden nachverfolgten Endpunkte festgelegt.
Zur Laufzeit erstellt die InBetween Komponente eine weitere SolverHandler Komponente, die auf den Eigenschaften Second Tracked Target Type und Second Transform Override basiert.
Definiert PartwayOffset , wo entlang der Linie zwischen zwei Transformationen das Objekt mit 0,5 als Halbweg, 1,0 bei der ersten Transformation und 0,0 bei der zweiten Transformation platziert werden soll.
Beispiel für die Verwendung des InBetween-Solvers zum Beibehalten eines Objekts zwischen zwei Transformationen
SurfaceMagnetism
Der SurfaceMagnetism funktioniert, indem ein Raycast für eine festgelegte LayerMask von Oberflächen ausgeführt und das GameObject an diesem Kontaktpunkt platziert wird.
Der Surface Normal Offset platziert das GameObject in einem festgelegten Abstand in Metern von der Oberfläche in Richtung des Normalen am Trefferpunkt auf der Oberfläche.
Umgekehrt platziert der Surface Ray Offset das GameObject in einem festgelegten Abstand in Metern von der Oberfläche entfernt, aber in der entgegengesetzten Richtung des durchgeführten Raycasts. Wenn der Raycast also das Anvisieren des Benutzers ist, bewegt sich das GameObject entlang der Linie vom Trefferpunkt auf der Oberfläche bis zur Kamera näher.
Der Ausrichtungsmodus bestimmt die Art der Drehung, die in Bezug auf die Normalität auf der Oberfläche angewendet werden soll.
- Keine : Keine Drehung angewendet
- TrackedTarget : Das Objekt stellt sich der verfolgten Transformation, die den Raycast antreibt.
- SurfaceNormal : Das Objekt wird am Trefferpunkt auf der Oberfläche normal ausgerichtet
- Blended : Das Objekt wird basierend auf der Normalität am Trefferpunkt auf der Oberfläche UND basierend auf der Ausrichtung der verfolgten Transformation ausgerichtet.
Um zu erzwingen, dass das zugeordnete GameObject in einem anderen Modus als Keine vertikal bleibt, aktivieren Sie Ausrichtung vertikal beibehalten.
Hinweis
Verwenden Sie die Orientation Blend-Eigenschaft , um das Gleichgewicht zwischen Drehfaktoren zu steuern, wenn der Ausrichtungsmodus auf Blended festgelegt ist. Bei einem Wert von 0,0 wird die Ausrichtung vollständig vom TrackedTarget-Modus gesteuert, und bei einem Wert von 1,0 wird die Ausrichtung vollständig von SurfaceNormal gesteuert.
Bestimmen, welche Oberflächen getroffen werden können
Beim Hinzufügen einer SurfaceMagnetism Komponente zu einem GameObject ist es wichtig, die Ebene des GameObject und seiner untergeordneten Elemente zu berücksichtigen, falls vorhanden Collider vorhanden sind. Die Komponente arbeitet durch verschiedene Arten von Raycasts, um zu bestimmen, gegen welche Oberfläche sie sich "magnetisieren". Wenn der Solver GameObject einen Collider auf einer der ebenen aufweist, die in der MagneticSurfaces -Eigenschaft von SurfaceMagnetismaufgeführt sind, trifft sich der Raycast wahrscheinlich selbst, was dazu führt, dass das GameObject an seinen eigenen Colliderpunkt angefügt wird. Dieses ungewöhnliche Verhalten kann vermieden werden, indem sie das Haupt-GameObject und alle untergeordneten Elemente auf die Schicht "Raycast ignorieren " festlegen oder das MagneticSurfaces LayerMask-Array entsprechend ändern.
Umgekehrt kollidiert ein SurfaceMagnetism GameObject nicht mit Oberflächen auf einer Ebene, die nicht in der MagneticSurfaces -Eigenschaft aufgeführt ist. Es wird im Allgemeinen empfohlen, alle gewünschten Oberflächen auf einer dedizierten Ebene (d. h . Surfaces) zu platzieren und die MagneticSurfaces -Eigenschaft nur auf diese Ebene festzulegen. Die Verwendung von Standard oder alles kann dazu führen, dass Benutzeroberflächenkomponenten oder Cursor zum Solver beitragen.
Schließlich werden Oberflächen, die weiter als die MaxRaycastDistance -Eigenschaftseinstellung sind, von den SurfaceMagnetism Raycasts ignoriert.
DirectionalIndicator
Die DirectionalIndicator -Klasse ist eine Tag-along-Komponente, die sich an der Richtung eines gewünschten Punkts im Raum orientiert.
Wird am häufigsten verwendet, wenn der Nachverfolgte Zieltyp des SolverHandler auf Headfestgelegt ist. Auf diese Weise weist eine UX-Komponente mit dem DirectionalIndicator Solver einen Benutzer an, den gewünschten Punkt im Raum zu betrachten.
Der gewünschte Punkt im Raum wird über die Eigenschaft Directional Target bestimmt.
Wenn das direktionale Ziel vom Benutzer angezeigt werden kann oder ein beliebiger Bezugsrahmen im SolverHandlerfestgelegt ist, deaktiviert dieser Solver alle Renderer Komponenten darunter. Wenn nicht angezeigt werden kann, wird alles auf dem Indikator aktiviert.
Die Größe des Indikators wird kleiner, je näher der Benutzer an der Erfassung des richtungsgerichteten Ziels in seiner FOV ist.
Minimale Indikatorskala – Die Mindestskala für das Indikatorobjekt
Maximale Indikatorskala : Die maximale Skalierung für das Indikatorobjekt
Sichtbarkeitsskalierungsfaktor : Multiplikator zum Erhöhen oder Verringern der FOV, die bestimmt, ob der direktionale Zielpunkt sichtbar ist oder nicht
Ansichtsoffset : Aus Sicht des Bezugsrahmens (d. h. möglicherweise kamera) definiert diese Eigenschaft, wie weit das Objekt in der Indikatorrichtung von der Mitte des Viewports entfernt sein soll.
Eigenschaften des direktionalen Indikators
Beispielszene für einen direktionalen Indikator (Assets/MRTK/Examples/Demos/Solvers/Scenes/DirectionalIndicatorSolverExample.unity)
Handmenü mit HandConstraint und HandConstraintPalmUp
Das HandConstraint Verhalten stellt einen Solver bereit, der das nachverfolgte Objekt auf einen Bereich einschränkt, der für handbeschränkte Inhalte (z. B. Handbenutzeroberfläche, Menüs usw.) sicher ist. Sichere Regionen werden als Bereiche betrachtet, die sich nicht mit der Hand überschneiden. Eine abgeleitete Klasse von HandConstraint aufgerufen HandConstraintPalmUp ist ebenfalls enthalten, um ein allgemeines Verhalten der Aktivierung des Solvers nachverfolgten Objekts zu veranschaulichen, wenn die Handfläche dem Benutzer zugewandt ist.
Beispiele für die Verwendung des Handeinschränkungs-Solvers zum Erstellen von Handmenüs finden Sie auf der Seite Handmenüs.