Räumliche Abbildung

Die räumliche Zuordnung bietet eine detaillierte Darstellung der realen Oberflächen in der Umgebung um die HoloLens, sodass Entwickler eine überzeugende Mixed Reality-Erfahrung erstellen können. Durch die Zusammenführung der realen Welt mit der virtuellen Welt kann eine Anwendung Hologramme real erscheinen lassen. Anwendungen können sich auch natürlicher an den Erwartungen der Benutzer orientieren, indem sie vertraute verhaltensweisen und interaktionen aus der Praxis bereitstellen.


Gerät unterstützt

Feature HoloLens (1. Generation) HoloLens 2 Immersive Headsets
Räumliche Abbildung ✔️ ✔️

Warum ist räumliche Zuordnung wichtig?

Räumliche Zuordnung macht es möglich, Objekte auf realen Oberflächen zu platzieren. Dies hilft, Objekte in der Benutzerwelt zu verankern, und nutzt reale Tiefenhinweise. Wenn Sie Ihre Hologramme basierend auf anderen Hologrammen und realen Objekten verdecken, können Sie den Benutzer davon überzeugen, dass sich diese Hologramme tatsächlich in ihrem Raum befinden. Hologramme, die im Raum schweben oder sich mit dem Benutzer bewegen, fühlen sich nicht so real an. Platzieren Sie, wenn möglich, Elemente für komfort.

Visualisieren von Oberflächen beim Platzieren oder Verschieben von Hologrammen (verwenden Sie ein projiziertes Raster). Dies hilft Benutzern zu wissen, wo sie ihre Hologramme am besten platzieren können, und zeigt, ob die Stelle, an der sie versuchen, das Hologramm zu platzieren, nicht zugeordnet ist. Sie können "Billboard-Elemente" gegenüber dem Benutzer anzeigen, wenn sie am Ende zu sehr in einem Winkel stehen.

Konzeptionelle Übersicht

Gitterflächen, die einen Raum abdecken
Beispiel für ein räumliches Kartengitter, das einen Raum bedeckt

Die beiden primären Objekttypen, die für die räumliche Zuordnung verwendet werden, sind der "Spatial Surface Observer" und die "Räumliche Oberfläche".

Die Anwendung stellt dem Spatial Surface Observer ein oder mehrere begrenzungsbezogene Volumes zur Verfügung, um die Bereiche des Raums zu definieren, in denen die Anwendung räumliche Zuordnungsdaten empfangen möchte. Für jedes dieser Volumes stellt die räumliche Zuordnung der Anwendung eine Reihe von räumlichen Oberflächen bereit.

Diese Volumes können stationär sein (an einem festen Ort basierend auf der realen Welt), oder sie können an die HoloLens angefügt werden (sie werden verschoben, aber nicht rotiert, wobei die HoloLens durch die Umgebung bewegt wird). Jede räumliche Oberfläche beschreibt reale Oberflächen in einem kleinen Raumvolumen, dargestellt als Dreiecksgitter, das an ein weltgebundenes räumliches Koordinatensystem angefügt ist.

Wenn holoLens neue Daten über die Umgebung sammelt und Änderungen an der Umgebung auftreten, werden räumliche Oberflächen angezeigt, verschwinden und ändern sich.

Demo zu Den Konzepten des Raumbewusstseins

Wenn Sie Die Konzepte des Räumlichen Bewusstseinsentwurfs in Aktion sehen möchten, sehen Sie sich unten unsere Videodemo Entwerfen von Hologrammen – Räumliches Bewusstsein an. Wenn Sie fertig sind, fahren Sie mit einem ausführlicheren Einblick in bestimmte Themen fort.

Dieses Video stammt aus der HoloLens 2-App "Entwerfen von Hologrammen". Sie können das vollständige Erlebnis hier herunterladen und genießen.

Spatial Mapping vs. Scene Understanding WorldMesh

Für HoloLens 2 ist es möglich, eine statische Version der Räumlichen Zuordnungsdaten mit dem Scene Understanding SDK (Einstellung EnableWorldMesh) abzufragen. Hier sind die Unterschiede zwischen zwei Arten des Zugriffs auf die räumlichen Zuordnungsdaten aufgeführt:

  • Räumliche Zuordnungs-API:
    • Begrenzter Bereich: Die für Anwendungen verfügbaren räumlichen Zuordnungsdaten in einer zwischengespeicherten "Blase" um den Benutzer herum.
    • Stellt Updates mit geringer Latenz für geänderte Gitterbereiche über SurfacesChanged-Ereignisse bereit.
    • Variable Detailebene, die durch den Parameter Dreiecke pro Kubikmeter gesteuert wird.
  • Szenenverständnis-SDK:
    • Unbegrenzter Bereich: Stellt alle gescannten räumlichen Zuordnungsdaten innerhalb des Abfrageradius bereit.
    • Stellt eine statische Momentaufnahme der räumlichen Zuordnungsdaten bereit. Zum Abrufen der aktualisierten Räumlichen Zuordnungsdaten muss eine neue Abfrage für das gesamte Gitter ausgeführt werden.
    • Konsistente Detailebene, die von der RequestedMeshLevelOfDetail-Einstellung gesteuert wird.

Was beeinflusst die Qualität der räumlichen Zuordnung?

Mehrere Faktoren, die hier beschrieben werden, können sich auf die Häufigkeit und den Schweregrad dieser Fehler auswirken. Sie sollten Ihre Anwendung jedoch so entwerfen, dass der Benutzer seine Ziele auch bei Fehlern in den räumlichen Zuordnungsdaten erreichen kann.

Allgemeine Verwendungsszenarios

Abbildungen gängiger Verwendungsszenarien für räumliche Zuordnungen: Platzierung, Okklusion, Physik und Navigation

Platzierung

Dank der räumlichen Zuordnung können Benutzer*innen in Anwendungen auf natürliche und vertraute Formen der Interaktion zurückgreifen. Was könnte natürlicher sein, als ein Telefon auf den Tisch zu legen?

Da die Platzierung von Hologrammen (oder generell jede Auswahl räumlicher Positionen) auf Oberflächen beschränkt wird, entsteht eine natürliche Zuordnung von 3D (Punkt im Raum) zu 2D (Punkt auf der Oberfläche). Dadurch müssen die Benutzer*innen der Anwendung weniger Informationen bereitstellen, und die Interaktionen der Benutzer*innen werden schneller, einfacher und präziser. Dies ist richtig, weil "Entfernung" nichts ist, das wir an die physische Kommunikation mit anderen Personen oder Computern gewöhnt sind. Wenn wir mit dem Finger zeigen, geben wir eine Richtung, aber keine Entfernung an.

Ein wichtiger Nachteil hierbei ist, dass wenn eine Anwendung den Abstand von der Richtung ableiten (z. B. indem sie einen Raycast entlang der Blickrichtung des Benutzers durchführt, um die nächstgelegene räumliche Oberfläche zu finden), zu Ergebnissen führen muss, die der Benutzer zuverlässig vorhersagen kann. Andernfalls verliert der Benutzer sein Gefühl der Kontrolle und dies kann schnell frustrierend werden. Eine Methode, die dabei hilft, besteht darin, mehrere Raycasts anstelle von nur einem zu erstellen. Die aggregierten Ergebnisse sollten glatter und besser vorhersagbarer sein, weniger anfällig für Auswirkungen durch vorübergehende "Ausreißer"-Ergebnisse (wie dies durch Strahlen verursacht werden kann, die durch winzige Löcher oder durch treffen kleine Geometriebits, die dem Benutzer nicht bekannt sind). Aggregation oder Glättung kann auch im Laufe der Zeit durchgeführt werden; Beispielsweise können Sie die maximale Geschwindigkeit begrenzen, bei der ein Hologramm in der Entfernung vom Benutzer variieren kann. Die einfache Begrenzung des Minimal- und Maximalabstandswerts kann ebenfalls hilfreich sein, damit das zu bewegende Hologramm nicht plötzlich in die Ferne fliegt oder dem Benutzer wieder ins Gesicht stürzt.

Anwendungen können auch die Form und Richtung von Oberflächen verwenden, um die Platzierung des Hologramms zu steuern. Ein holografischer Stuhl sollte nicht durch Wände eindringen und sollte bündig mit dem Boden sitzen, auch wenn er leicht uneben ist. Diese Art von Funktionalität würde wahrscheinlich auf der Verwendung von Physikalischen Kollisionen anstelle von Raycasts basieren, aber ähnliche Bedenken werden zutreffen. Wenn das zu platzierende Hologramm viele kleine Polygone aufweist, die herausragen, z. B. die Beine auf einem Stuhl, kann es sinnvoll sein, die physikalische Darstellung dieser Polygone auf etwas breiteres und glatter zu erweitern, sodass sie besser über räumliche Oberflächen gleiten können, ohne sich zu verknaufen.

Im Extremfall kann die Benutzereingabe vollständig vereinfacht werden, und räumliche Flächen können für eine vollautomatische Hologrammplatzierung verwendet werden. Beispielsweise könnte die Anwendung einen holografischen Lichtschalter an einer beliebigen Stelle an der Wand platzieren, damit der Benutzer ihn drücken kann. Die gleiche Einschränkung der Vorhersagbarkeit gilt hier doppelt; Wenn der Benutzer die Kontrolle über die Platzierung des Hologramms erwartet, aber die Anwendung Hologramme nicht immer an der gewünschten Stelle platziert (wenn der Lichtschalter an einer Stelle erscheint, die der Benutzer nicht erreichen kann), ist dies eine frustrierende Erfahrung. Es kann tatsächlich schlimmer sein, eine automatische Platzierung durchzuführen, die eine Korrektur des Benutzers erfordert, als nur zu verlangen, dass der Benutzer die Platzierung immer selbst macht; da eine erfolgreiche automatische Platzierung erwartet wird, fühlt sich die manuelle Korrektur wie eine Belastung an!

Beachten Sie auch, dass die Fähigkeit einer Anwendung, räumliche Oberflächen für die Platzierung zu verwenden, stark von der Scanerfahrung der Anwendung abhängt. Wenn eine Oberfläche nicht gescannt wurde, kann sie nicht für die Platzierung verwendet werden. Es liegt an der Anwendung, dies für den Benutzer klar zu machen, damit er entweder beim Scannen neuer Oberflächen oder beim Auswählen eines neuen Speicherorts helfen kann.

Visuelles Feedback an den Benutzer ist bei der Platzierung von größter Bedeutung. Der Benutzer muss wissen, wo das Hologramm auf der nächsten Oberfläche mit Erdungseffekten basiert. Sie sollten verstehen, warum die Bewegung ihres Hologramms eingeschränkt wird (z. B. aufgrund von Kollisionen mit einer anderen nahe gelegenen Oberfläche). Wenn sie kein Hologramm an der aktuellen Position platzieren können, sollte das visuelle Feedback deutlich machen, warum nicht. Wenn der Benutzer beispielsweise versucht, eine holografische Couch in der Hälfte der Wand zu platzieren, sollten die Teile der Couch, die sich hinter der Wand befinden, in einer wütenden Farbe pulsieren. Oder umgekehrt: Wenn die Anwendung keine räumliche Oberfläche an einem Ort finden kann, an dem der Benutzer eine reale Oberfläche sehen kann, sollte dies von der Anwendung deutlich werden. Das offensichtliche Fehlen einer Erdungswirkung in diesem Bereich kann diesen Zweck erreichen.

Okklusion

Eine der primären Verwendungen räumlicher Zuordnungsflächen besteht darin, Hologramme einfach zu verdecken. Dieses einfache Verhalten hat einen großen Einfluss auf den wahrgenommenen Realismus von Hologrammen und trägt dazu bei, ein viszerales Gefühl zu schaffen, das tatsächlich denselben physischen Raum wie der Benutzer bewohnt.

Okklusion stellt dem Benutzer auch Informationen zur Verfügung; wenn ein Hologramm von einer realen Oberfläche verdeckt zu sein scheint, liefert dies zusätzliche visuelles Feedback zur räumlichen Position dieses Hologramms in der Welt. Umgekehrt kann okklusion auch Informationen vor dem Benutzer nützlich ausblenden ; Das Verschließen von Hologrammen hinter Wänden kann visuelle Unordnung auf intuitive Weise reduzieren. Um ein Hologramm auszublenden oder zu offenbaren, muss der Benutzer lediglich seinen Kopf bewegen.

Okklusion kann auch verwendet werden, um die Erwartungen an eine natürliche Benutzeroberfläche basierend auf vertrauten physischen Interaktionen zu erfüllen. wenn ein Hologramm von einer Oberfläche verdeckt wird, liegt dies daran, dass diese Oberfläche voll ist, sodass der Benutzer erwarten sollte, dass das Hologramm mit dieser Oberfläche kollidiert und nicht durch sie hindurchläuft.

Manchmal ist die Verdeckung von Hologrammen unerwünscht. Wenn ein Benutzer mit einem Hologramm interagieren muss, muss er es sehen – auch wenn es sich hinter einer realen Oberfläche befindet. In solchen Fällen ist es in der Regel sinnvoll, ein solches Hologramm anders zu rendern, wenn es verdeckt ist (z. B. durch Verringern der Helligkeit). Auf diese Weise kann der Benutzer das Hologramm visuell finden, aber er wird immer noch wissen, dass es sich hinter etwas befindet.

Physische Effekte

Die Verwendung der Physiksimulation ist eine weitere Möglichkeit, die räumliche Kartierung zu verwenden, um das Vorhandensein von Hologrammen im physischen Raum des Benutzers zu verstärken. Wenn meine holografische Gummikugel realistisch vom Schreibtisch rollt, über den Boden springt und unter der Couch verschwindet, kann es für mich schwer sein zu glauben, dass sie nicht da ist.

Die Physiksimulation bietet auch die Möglichkeit für eine Anwendung, natürliche und vertraute physikbasierte Interaktionen zu nutzen. Ein Stück holografische Möbel auf dem Boden zu bewegen, wird für den Benutzer wahrscheinlich einfacher sein, wenn die Möbel reagieren, als ob sie mit der entsprechenden Reibung über den Boden gleiten würden.

Um realistische physische Verhaltensweisen zu generieren, müssen Sie wahrscheinlich eine Gitterverarbeitung durchführen, z. B. Löcher füllen, schwebende Halluzinationen entfernen und raue Oberflächen glätten.

Sie müssen auch berücksichtigen, wie sich die Scanerfahrung Ihrer Anwendung auf die Physiksimulation auswirkt. Erstens werden fehlende Oberflächen mit nichts kollidieren; was passiert, wenn die Gummikugel den Korridor hinunter und vom Ende der bekannten Welt abrollt? Zweitens müssen Sie entscheiden, ob Sie im Laufe der Zeit weiterhin auf Änderungen in der Umgebung reagieren. In einigen Fällen sollten Sie so schnell wie möglich reagieren. sagen, wenn der Benutzer Türen und Möbel als bewegliche Barrikaden zur Verteidigung gegen einen Sturm der eintreffenden römischen Pfeile verwendet. In anderen Fällen sollten Sie jedoch neue Updates ignorieren. Das Fahren Ihres holografischen Sportwagens auf der Rennstrecke auf Ihrem Boden ist möglicherweise nicht mehr so lustig, wenn Ihr Hund sich entscheidet, mitten auf der Strecke zu sitzen.

Anwendungen können räumliche Zuordnungsdaten verwenden, um holografischen Zeichen (oder Agents) die Möglichkeit zu geben, in der realen Welt auf die gleiche Weise zu navigieren, wie es eine reale Person wäre. Dies kann dazu beitragen, die Anwesenheit holografischer Charaktere zu verstärken, indem sie auf die gleichen natürlichen, vertrauten Verhaltensweisen wie die des Benutzers und seiner Freunde beschränkt werden.

Navigationsfunktionen können auch für Benutzer nützlich sein. Sobald eine Navigationskarte in einem bestimmten Bereich erstellt wurde, kann sie freigegeben werden, um holografische Wegbeschreibungen für neue Benutzer bereitzustellen, die mit diesem Standort nicht vertraut sind. Diese Karte könnte so konzipiert werden, dass der Fußgängerverkehr reibungslos fließt oder Unfälle an gefährlichen Orten wie Baustellen vermieden werden.

Die wichtigsten technischen Herausforderungen bei der Implementierung von Navigationsfunktionen sind die zuverlässige Erkennung begehbarer Oberflächen (Menschen gehen nicht auf Tischen!) und die anmutige Anpassung an Veränderungen in der Umgebung (Menschen gehen nicht durch geschlossene Türen!). Das Gitter muss möglicherweise verarbeitet werden, bevor es für die Pfadplanung und Navigation durch ein virtuelles Zeichen verwendet werden kann. Das Glätten des Gitternetzes und das Entfernen von Halluzinationen kann dazu beitragen, dass Zeichen nicht hängen bleiben. Sie können auch das Gitter drastisch vereinfachen, um die Pfadplanung und Navigationsberechnungen Ihres Charakters zu beschleunigen. Diese Herausforderungen haben bei der Entwicklung der Videospieltechnologie große Aufmerksamkeit erhalten, und es gibt eine Fülle von Forschungsliteratur zu diesen Themen.

Die integrierte NavMesh-Funktionalität in Unity kann standardmäßig nicht für räumliche Zuordnungsflächen verwendet werden, da die Oberflächen erst bekannt sind, wenn die Anwendung gestartet wird. Sie können jedoch während der Laufzeit eine NavMesh erstellen, indem Sie NavMeshComponents installieren. Beachten Sie, dass das Räumliche Zuordnungssystem keine Informationen zu Oberflächen bereitstellt, die weit vom aktuellen Standort des Benutzers entfernt sind. Um eine Karte eines großen Bereichs zu erstellen, muss sich die Anwendung Oberflächen "merken". Sie können auch die Einstellung der Beobachtungsausdehnungen im räumlichen Bewusstseinsprofil erhöhen, wodurch der Bereich erhöht wird, auf dem Sie Ihr NavMesh erstellen können.

Visualisierung

Die meiste Zeit ist es angebracht, dass räumliche Oberflächen unsichtbar sind; um visuelle Unordnung zu minimieren und die reale Welt für sich selbst sprechen zu lassen. Manchmal ist es jedoch nützlich, räumliche Zuordnungsflächen direkt zu visualisieren, obwohl ihre realen Pendants sichtbar sind.

Wenn der Benutzer beispielsweise versucht, ein Hologramm auf einer Oberfläche zu platzieren (z. B. einen holografischen Schrank an der Wand zu platzieren), kann es nützlich sein, das Hologramm zu "erden", indem ein Schatten auf die Oberfläche geworfen wird. Dies gibt dem Benutzer ein viel klareres Gefühl der genauen physischen Nähe zwischen Hologramm und Oberfläche. Dies ist auch ein Beispiel für die allgemeinere Praxis der visuellen "Vorschau" einer Änderung, bevor der Benutzer einen Commit darauf angibt.

Durch die Visualisierung von Oberflächen kann die Anwendung ihr Verständnis der Umgebung mit dem Benutzer teilen. Beispielsweise könnte ein holografisches Brettspiel die horizontalen Oberflächen visualisieren, die es als "Tabellen" identifiziert hat, damit der Benutzer weiß, wohin er sich für die Interaktion begeben sollte.

Die Visualisierung von Oberflächen kann eine nützliche Möglichkeit sein, dem Benutzer in der Nähe Von Räumen anzuzeigen, die ausgeblendet sind. Dies könnte eine Möglichkeit bieten, dem Benutzer Zugriff auf seine Küche (und alle darin enthaltenen Hologramme) von seinem Wohnzimmer aus zu ermöglichen.

Die durch räumliche Zuordnung bereitgestellten Oberflächengitter sind möglicherweise nicht besonders "sauber". Es ist wichtig, sie entsprechend zu visualisieren. Herkömmliche Beleuchtungsberechnungen können Fehler in Oberflächennormalen visuell ablenkend hervorheben, während sauber Texturen, die auf die Oberfläche projiziert werden, helfen können, ihr ein aufgeräumteres Erscheinungsbild zu verleihen. Es ist auch möglich, Gitterverarbeitung durchzuführen, um die Gittereigenschaften zu verbessern, bevor die Oberflächen gerendert werden.

Hinweis

HoloLens 2 implementiert eine neue Scene Understanding Runtime, die Mixed Reality Entwicklern eine strukturierte, allgemeine Umgebungsdarstellung bietet, die die Implementierung von Platzierung, Verdeckung, Physik und Navigation vereinfacht.

Verwenden des Surface Observer

Ausgangspunkt für die räumliche Zuordnung ist der Oberflächenbeobachter. Der Programmablauf sieht wie folgt aus:

  • Erstellen eines Oberflächenbeobachterobjekts
    • Stellen Sie ein oder mehrere räumliche Volumes bereit, um die relevanten Regionen zu definieren, in denen die Anwendung Räumliche Zuordnungsdaten empfangen möchte. Ein räumliches Volumen ist einfach eine Form, die einen Bereich des Raums definiert, z. B. eine Kugel oder ein Kasten.
    • Verwenden Sie ein räumliches Volume mit einem weltgebundenen räumlichen Koordinatensystem, um eine feste Region der physischen Welt zu identifizieren.
    • Verwenden Sie ein räumliches Volume, und aktualisieren Sie jeden Frame mit einem räumlichen Koordinatensystem, das mit dem Textkörper gesperrt ist, um einen Raumbereich zu identifizieren, der sich mit dem Benutzer bewegt (aber nicht rotiert).
    • Diese räumlichen Volumes können später jederzeit geändert werden, wenn sich die status der Anwendung oder des Benutzers ändert.
  • Verwenden von Abfragen oder Benachrichtigungen zum Abrufen von Informationen zu räumlichen Oberflächen
    • Sie können den Oberflächenbeobachter jederzeit nach räumlicher Status "abfragen". Stattdessen können Sie sich für das Ereignis "Oberflächen geändert" des Oberflächenbeobachters registrieren, das die Anwendung benachrichtigt, wenn sich räumliche Oberflächen geändert haben.
    • Für ein dynamisches raumbezogenes Volume, z. B. das Ansichts frustum oder ein volumengesperrtes Volume, müssen Anwendungen die Änderungen jedes Frames abfragen, indem sie die gewünschte Region festlegen und dann den aktuellen Satz räumlicher Oberflächen abrufen.
    • Bei einem statischen Volume, z. B. einem weltgebundenen Würfel, der einen einzelnen Raum abdeckt, können Anwendungen registrieren, dass das Ereignis "Surfaces Changed" benachrichtigt wird, wenn sich räumliche Oberflächen innerhalb dieses Volumes möglicherweise geändert haben.
  • Änderungen an Prozessoberflächen
    • Iterieren Sie den bereitgestellten Satz räumlicher Oberflächen.
    • Klassifizieren Sie räumliche Oberflächen als hinzugefügt, geändert oder entfernt.
    • Senden Sie für jede hinzugefügte oder geänderte räumliche Oberfläche ggf. eine asynchrone Anforderung zum Empfangen eines aktualisierten Gitters, das den aktuellen Zustand der Oberfläche mit der gewünschten Detailebene darstellt.
  • Verarbeiten Sie die asynchrone Gitteranforderung (weitere Details finden Sie in den folgenden Abschnitten).

Mesh-Zwischenspeicherung

Räumliche Oberflächen werden durch dichte Dreiecksgitter dargestellt. Das Speichern, Rendern und Verarbeiten dieser Gitternetze kann erhebliche Rechen- und Speicherressourcen beanspruchen. Daher sollte jede Anwendung ein Gitterzwischenspeicherungsschema anwenden, das ihren Anforderungen entspricht, um die für die Gitterverarbeitung und -speicherung verwendeten Ressourcen zu minimieren. Dieses Schema sollte festlegen, welche Gitter beibehalten und welche verworfen werden sollen, und wann das Gitter für jede raumbezogene Oberfläche aktualisiert werden soll.

Viele der dort erläuterten Überlegungen werden direkt darüber informiert, wie Ihre Anwendung die Gitterzwischenspeicherung angehen sollte. Sie sollten überlegen, wie sich der Benutzer durch die Umgebung bewegt, welche Oberflächen benötigt werden, wann unterschiedliche Oberflächen beobachtet werden und wann Änderungen in der Umgebung erfasst werden sollen.

Beim Interpretieren des vom Oberflächenbeobachter bereitgestellten Ereignisses "Surfaces changed" sieht die grundlegende Logik der Gitterzwischenspeicherung wie folgt aus:

  • Wenn die Anwendung eine räumliche Oberflächen-ID sieht, die sie noch nicht gesehen hat, sollte sie diese als neue räumliche Oberfläche behandeln.
  • Wenn die Anwendung eine räumliche Oberfläche mit einer bekannten ID, aber mit einer neuen Aktualisierungszeit sieht, sollte sie diese als aktualisierte räumliche Oberfläche behandeln.
  • Wenn die Anwendung keine räumliche Oberfläche mehr mit einer bekannten ID sieht, sollte sie diese als entfernte räumliche Oberfläche behandeln.

Es liegt an jeder Anwendung, dann die folgenden Entscheidungen zu treffen:

  • Sollte für neue raumbezogene Oberflächen Gitter angefordert werden?
    • In der Regel sollten Gitter sofort für neue raumbezogene Oberflächen angefordert werden, die dem Benutzer nützliche neue Informationen liefern können.
    • Allerdings sollten neue raumnahe Oberflächen in der Nähe und vor dem Benutzer Vorrang erhalten, und ihr Gitternetz sollte zuerst angefordert werden.
    • Wenn das neue Gitternetz nicht benötigt wird, wenn die Anwendung beispielsweise ihr Umgebungsmodell dauerhaft oder vorübergehend "eingefroren" hat, sollte es nicht angefordert werden.
  • Sollte für aktualisierte räumliche Oberflächen ein Gitter angefordert werden?
    • Aktualisierte räumliche Oberflächen in der Nähe und vor dem Benutzer sollten Priorität erhalten, und ihr Netz sollte zuerst angefordert werden.
    • Es kann auch angebracht sein, neuen Oberflächen eine höhere Priorität zuzuweisen als aktualisierten Oberflächen, insbesondere während der Scanerfahrung.
    • Um die Verarbeitungskosten zu begrenzen, möchten Anwendungen möglicherweise die Rate drosseln, mit der sie Aktualisierungen an räumlichen Oberflächen verarbeiten.
    • Es kann ableiten, dass Änderungen an einer räumlichen Oberfläche geringfügig sind, z. B. wenn die Grenzen der Oberfläche klein sind, wobei die Aktualisierung möglicherweise nicht wichtig genug ist, um verarbeitet zu werden.
    • Updates zu räumlichen Oberflächen außerhalb des aktuellen Bereichs von Interesse des Benutzers werden möglicherweise vollständig ignoriert, aber in diesem Fall kann es effizienter sein, die vom Oberflächenbeobachter verwendeten räumlichen Begrenzungsvolumina zu ändern.
  • Sollten bei entfernten räumlichen Oberflächen Gitter verworfen werden?
    • In der Regel sollten Gitter für entfernte Raumflächen sofort verworfen werden, damit hologrammverschlüsse korrekt bleiben.
    • Wenn die Anwendung jedoch Grund zu der Annahme hat, dass eine räumliche Oberfläche (basierend auf dem Design der Benutzeroberfläche) bald wieder angezeigt wird, ist es möglicherweise effizienter, sie beizubehalten, als ihr Gitter zu verwerfen und sie später erneut zu erstellen.
    • Wenn die Anwendung ein umfangreiches Modell der Umgebung des Benutzers erstellt, möchte sie möglicherweise überhaupt keine Gitter verwerfen. Es muss jedoch weiterhin die Ressourcennutzung einschränken, möglicherweise durch Spooling von Gittern zu Datenträger, wenn räumliche Oberflächen verschwinden.
    • Einige relativ seltene Ereignisse während der räumlichen Oberflächengenerierung können dazu führen, dass räumliche Oberflächen an einem ähnlichen Ort, jedoch mit unterschiedlichen IDs, durch neue räumliche Oberflächen ersetzt werden. Daher sollten Anwendungen, die eine entfernte Oberfläche nicht verwerfen, darauf achten, dass sie nicht zu mehreren stark überlappenden Raumflächengittern führen, die denselben Standort abdecken.
  • Sollten Gitter für andere räumliche Oberflächen verworfen werden?
    • Selbst wenn eine räumliche Oberfläche vorhanden ist, sollte sie verworfen werden, wenn sie für die Benutzerfreundlichkeit nicht mehr nützlich ist. Wenn die Anwendung beispielsweise den Raum auf der anderen Seite einer Tür durch einen alternativen virtuellen Raum "ersetzt", sind die räumlichen Oberflächen in diesem Raum nicht mehr von Bedeutung.

Hier sehen Sie eine Beispielstrategie für die Mesh-Zwischenspeicherung mit räumlicher und temporaler Hysterese:

  • Betrachten Sie eine Anwendung, die ein frustumförmiges raumbezogenes Volumen von Interesse verwenden möchte, das dem Blick des Benutzers folgt, während er sich umschaut und herumgeht.
  • Eine räumliche Oberfläche kann vorübergehend aus diesem Volume verschwinden, einfach weil der Benutzer von der Oberfläche wegschaut oder weiter weg von ihr ist... nur um einen Moment später zurückzublicken oder sich wieder näher zu rücken. In diesem Fall stellt das Verwerfen und erneute Erstellen des Gitters für diese Oberfläche viele redundante Verarbeitungen dar.
  • Um die Anzahl der verarbeiteten Änderungen zu reduzieren, verwendet die Anwendung zwei Raumoberflächenbeobachter, die sich in der anderen befinden. Das größere Volume ist kugelförmig und folgt dem Benutzer "faul"; Es bewegt sich nur, wenn dies erforderlich ist, um sicherzustellen, dass sich sein Zentrum innerhalb von 2,0 Metern vom Benutzer befindet.
  • Neue und aktualisierte Räumliche Oberflächengitter werden immer vom kleineren inneren Oberflächenbeobachter verarbeitet, aber Gitter werden zwischengespeichert, bis sie aus dem größeren äußeren Oberflächenbeobachter verschwinden. Dadurch kann die Anwendung die Verarbeitung vieler redundanter Änderungen aufgrund lokaler Benutzerverschiebungen vermeiden.
  • Da eine räumliche Oberfläche aufgrund eines Nachverfolgungsverlustes auch vorübergehend verschwindet, verschiebt die Anwendung auch entfernte räumliche Oberflächen während des Nachverfolgungsverlustes.
  • Im Allgemeinen sollte eine Anwendung den Kompromiss zwischen einer reduzierten Updateverarbeitung und einer erhöhten Speicherauslastung auswerten, um ihre ideale Zwischenspeicherungsstrategie zu ermitteln.

Darstellung

Es gibt drei primäre Möglichkeiten, räumliche Zuordnungsgitter zum Rendern zu verwenden:

  • Für die Oberflächenvisualisierung
    • Es ist häufig hilfreich, räumliche Oberflächen direkt zu visualisieren. Beispielsweise kann das Werfen von "Schatten" von Objekten auf räumliche Oberflächen dem Benutzer hilfreiches visuelles Feedback geben, während er Hologramme auf Oberflächen platziert.
    • Eine Sache zu beachten ist, dass räumliche Gitter unterscheiden sich von der Art von Gitternetzen, die ein 3D-Künstler erstellen könnte. Die Dreiecktopologie ist nicht so sauber wie die von Menschen erstellte Topologie, und das Gitter wird unter verschiedenen Fehlern leiden.
    • Um eine ansprechende visuelle Ästhetik zu schaffen, sollten Sie einige Gitterbearbeitungen durchführen, z. B. zum Füllen von Löchern oder glatten Oberflächennormalen. Sie können auch einen Shader verwenden, um vom Künstler entworfene Texturen auf Ihr Gitter zu projizieren, anstatt die Gittertopologie und -normalität direkt zu visualisieren.
  • Zum Verdecken von Hologrammen hinter realen Oberflächen
    • Räumliche Oberflächen können in einem Tiefendurchlauf gerendert werden, was sich nur auf den Tiefenpuffer auswirkt und sich nicht auf Farbrenderingziele auswirkt.
    • Dadurch wird der Tiefenpuffer so vorbereitet, dass nachträglich gerenderte Hologramme hinter räumlichen Oberflächen verdeckt werden. Eine genaue Okklusion von Hologrammen verstärkt das Gefühl, dass Hologramme wirklich innerhalb des physischen Raums des Benutzers existieren.
    • Um das reine Tiefenrendering zu aktivieren, aktualisieren Sie den Mischzustand, um RenderTargetWriteMask für alle Farbrenderingziele auf Null festzulegen.
  • Zum Ändern des Aussehens von Hologrammen, die von realen Oberflächen verdeckt sind
    • Normalerweise wird die gerenderte Geometrie ausgeblendet, wenn sie verdeckt ist. Dies wird erreicht, indem Sie die Tiefenfunktion im Tiefenschablonenzustand auf "kleiner oder gleich" festlegen, wodurch Geometrie nur dort sichtbar ist, wo sie näher an der Kamera liegt als alle zuvor gerenderten Geometrien.
    • Es kann jedoch hilfreich sein, bestimmte Geometrien auch dann sichtbar zu halten, wenn sie verdeckt ist, und deren Darstellung zu ändern, wenn sie verdeckt ist, um dem Benutzer visuelles Feedback zu geben. Dies ermöglicht es der Anwendung beispielsweise, dem Benutzer die Position eines Objekts anzuzeigen und gleichzeitig klar zu machen, dass sich hinter einer realen Oberfläche befindet.
    • Um dies zu erreichen, rendern Sie die Geometrie ein zweites Mal mit einem anderen Shader, der die gewünschte "verdeckte" Darstellung erzeugt. Bevor Sie die Geometrie zum zweiten Mal rendern, nehmen Sie zwei Änderungen am Tiefenschablonenzustand vor. Legen Sie zunächst die Tiefenfunktion auf "größer als oder gleich" fest, sodass die Geometrie nur dort sichtbar ist, wo sie weiter von der Kamera entfernt ist als alle zuvor gerenderten Geometrien. Legen Sie anschließend DepthWriteMask auf Null fest, damit der Tiefenpuffer nicht geändert wird (der Tiefenpuffer sollte weiterhin die Tiefe der Geometrie darstellen, die der Kamera am nächsten ist ).

Die Leistung ist ein wichtiges Anliegen beim Rendern räumlicher Zuordnungsgitter. Im Folgenden finden Sie einige Renderingleistungstechniken, die speziell für das Rendern räumlicher Zuordnungsgitternetze gelten:

  • Anpassen der Dreieckdichte
    • Wenn Sie räumliche Oberflächengitter von Ihrem Oberflächenbeobachter anfordern, fordern Sie die niedrigste Dichte an Dreiecksgittern an, die für Ihre Anforderungen ausreichen.
    • Es kann sinnvoll sein, die Dreiecksdichte auf einer Oberfläche je nach Oberfläche zu variieren, abhängig von der Entfernung der Oberfläche vom Benutzer und ihrer Relevanz für die Benutzererfahrung.
    • Das Reduzieren der Dreiecksanzahl reduziert die Arbeitsspeicherauslastung und die Vertexverarbeitungskosten für die GPU, wirkt sich jedoch nicht auf die Pixelverarbeitungskosten aus.
  • Verwenden von Frustum-Culling
    • Frustum-Culling überspringt Zeichnungsobjekte, die nicht angezeigt werden können, da sie sich außerhalb des aktuellen Anzeige frustum befinden. Dadurch werden cpu- und GPU-Verarbeitungskosten reduziert.
    • Da das Culling auf Gitterbasis durchgeführt wird und die räumlichen Oberflächen groß sein können, kann das Aufteilen jedes Raumflächengitters in kleinere Blöcke zu einer effizienteren Culling führen (da weniger Dreiecke aus dem Offscreen gerendert werden). Es gibt jedoch einen Kompromiss; Je mehr Meshes Sie haben, desto mehr Draw-Aufrufe müssen Sie ausführen, was die CPU-Kosten erhöhen kann. Im Extremfall könnten die Frustum-Culling-Berechnungen selbst sogar messbare CPU-Kosten haben.
  • Anpassen der Renderingreihenfolge
    • Räumliche Oberflächen sind in der Regel groß, da sie die gesamte Umgebung des Benutzers darstellen, die sie umgibt. Die Pixelverarbeitungskosten für die GPU können hoch sein, insbesondere in Fällen, in denen mehr als eine Ebene sichtbarer Geometrie vorhanden ist (einschließlich räumlicher Oberflächen und anderer Hologramme). In diesem Fall verdeckt die dem Benutzer am nächsten liegende Ebene alle weiter entfernten Ebenen, sodass die GPU-Zeit, die für das Rendern dieser weiter entfernten Ebenen aufgewendet wird, verschwendet wird.
    • Um diese redundante Arbeit auf der GPU zu reduzieren, hilft es, undurchsichtige Oberflächen in Front-to-Back-Reihenfolge zu rendern (näher zuerst, weiter entfernte zuletzt). Mit "undurchsichtig" meinen wir Oberflächen, für die DepthWriteMask in Ihrem Tiefenschablonenzustand auf eins festgelegt ist. Wenn die nächstgelegenen Oberflächen gerendert werden, wird der Tiefenpuffer so vorbereitet, dass weiter entfernte Oberflächen vom Pixelprozessor auf der GPU effizient übersprungen werden.

Gitterverarbeitung

Eine Anwendung möchte möglicherweise verschiedene Vorgänge an räumlichen Oberflächengittern durchführen, um ihre Anforderungen zu erfüllen. Die index- und vertex-Daten, die für jedes räumliche Oberflächengitter bereitgestellt werden, verwenden das gleiche vertraute Layout wie die Vertex- und Indexpuffer , die zum Rendern von Dreiecksgittern in allen modernen Rendering-APIs verwendet werden. Eine wichtige Tatsache, die sie beachten sollten, ist jedoch, dass Dreiecke der räumlichen Zuordnung eine vordere Windungsreihenfolge im Uhrzeigersinn haben. Jedes Dreieck wird durch drei Vertexindizes im Indexpuffer des Gitters dargestellt, und diese Indizes identifizieren die Scheitelpunkte des Dreiecks im Uhrzeigersinn , wenn das Dreieck von der Vorderseite aus betrachtet wird. Die Vorderseite (oder außen) von räumlichen Oberflächengittern entspricht wie erwartet der vorderen (sichtbaren) Seite realer Oberflächen.

Anwendungen sollten eine Gittervereinfachung nur durchführen, wenn die vom Oberflächenbeobachter bereitgestellte grobste Dreieckdichte immer noch unzureichend ist . Diese Arbeit ist rechenintensiv und wird bereits von der Laufzeit ausgeführt, um die verschiedenen bereitgestellten Detailebenen zu generieren.

Da jeder Oberflächenbeobachter mehrere nicht verbundene räumliche Oberflächen bereitstellen kann, möchten einige Anwendungen diese räumlichen Oberflächengitter möglicherweise gegeneinander abschneiden und dann zusammenschließen. Im Allgemeinen ist der Beschneidungsschritt erforderlich, da sich nahe gelegene räumliche Oberflächengitter oft leicht überlappen.

Raycasting und Kollision

Damit eine Physik-API (z. B. Havok) eine Anwendung mit Raycasting- und Kollisionsfunktionen für räumliche Oberflächen bereitstellt, muss die Anwendung räumliche Oberflächengitter für die Physik-API bereitstellen. Für die Physik verwendete Gitter haben häufig die folgenden Eigenschaften:

  • Sie enthalten nur eine geringe Anzahl von Dreiecken. Physikalische Vorgänge sind rechenintensiver als Renderingvorgänge.
  • Sie sind "wasserdicht". Oberflächen, die fest sein sollen, sollten keine kleinen Löcher enthalten; selbst Löcher, die zu klein sind, um sichtbar zu sein, können Probleme verursachen.
  • Sie werden in konvexe Hüllen umgewandelt. Konvexe Hüllen haben nur wenige Polygone und sind frei von Löchern, und sie sind recheneffizienter zu verarbeiten als rohe Dreiecksgitter.

Beachten Sie bei Raycasts auf räumlichen Oberflächen, dass diese Oberflächen oft komplexe, unübersichtliche Formen voller unordentlicher kleiner Details sind - genau wie ihr Schreibtisch! Dies bedeutet, dass ein einzelner Raycast oft nicht ausreicht, um ihnen genügend Informationen über die Form der Oberfläche und die Form des leeren Raums in der Nähe zu liefern. Es ist in der Regel eine gute Idee, viele Raycasts in einem kleinen Bereich zu machen und die aggregierten Ergebnisse zu verwenden, um ein zuverlässigeres Verständnis der Oberfläche zu gewinnen. Wenn Sie beispielsweise den Durchschnitt von 10 Raycasts verwenden, um die Platzierung des Hologramms auf einer Oberfläche zu steuern, führt dies zu einem weitaus glatteren und weniger "jittery"-Ergebnis, wenn nur ein einzelner Raycast verwendet wird.

Beachten Sie jedoch, dass jeder Raycast hohe Berechnungskosten haben kann. Abhängig von Ihrem Verwendungsszenario sollten Sie die Berechnungskosten zusätzlicher Raycasts (durch jeden Frame) gegen die Rechenkosten der Gitterverarbeitung abwägen, um Löcher in räumlichen Oberflächen zu glätten und zu entfernen (wenn räumliche Gitter aktualisiert werden).

Umgebungsüberprüfung

Jede Anwendung, die räumliche Zuordnung verwendet, sollte erwägen, eine "Scanerfahrung" bereitzustellen. der Prozess, durch den die Anwendung den Benutzer zum Scannen von Oberflächen leitet, die für die ordnungsgemäße Funktion der Anwendung erforderlich sind.

Beispiel für die Überprüfung
Beispiel für die Überprüfung

Die Art dieser Scanerfahrung kann je nach Den Anforderungen der einzelnen Anwendungen stark variieren, aber zwei Standard Prinzipien sollten den Entwurf leiten.

Erstens steht die klare Kommunikation mit dem Nutzer im Vordergrund. Der Benutzer sollte immer wissen, ob die Anforderungen der Anwendung erfüllt werden. Wenn sie nicht erfüllt werden, sollte dem Benutzer sofort klar sein, warum dies so ist, und er sollte schnell dazu geführt werden, die entsprechenden Maßnahmen zu ergreifen.

Zweitens sollten Anwendungen versuchen, ein Gleichgewicht zwischen Effizienz und Zuverlässigkeit zu finden. Wenn dies zuverlässig möglich ist, sollten Anwendungen automatisch räumliche Zuordnungsdaten analysieren, um dem Benutzer Zeit zu sparen. Wenn dies nicht zuverlässig möglich ist, sollten Anwendungen es dem Benutzer stattdessen ermöglichen, der Anwendung schnell die benötigten zusätzlichen Informationen bereitzustellen.

Um die richtige Scanerfahrung zu entwerfen, überlegen Sie, welche der folgenden Möglichkeiten für Ihre Anwendung geeignet sind:

  • Keine Überprüfungserfahrung

    • Eine Anwendung kann ohne geführtes Scannen perfekt funktionieren. Es wird über Oberflächen erfahren, die im Laufe der natürlichen Benutzerbewegung beobachtet werden.
    • Beispielsweise erfordert eine Anwendung, mit der der Benutzer auf Oberflächen mit holografischer Sprühfarbe zeichnen kann, nur Kenntnis der Oberflächen, die derzeit für den Benutzer sichtbar sind.
    • Die Umgebung kann bereits überprüft werden, wenn es sich um eine Umgebung handelt, in der der Benutzer bereits viel Zeit mit der HoloLens verbracht hat.
    • Beachten Sie jedoch, dass die Kamera, die für die räumliche Zuordnung verwendet wird, nur 3,1 m vor dem Benutzer sehen kann, sodass die räumliche Zuordnung keine weiter entfernten Oberflächen kennt, es sei denn, der Benutzer hat sie in der Vergangenheit aus näherer Entfernung beobachtet.
    • Damit der Benutzer weiß, welche Oberflächen gescannt wurden, sollte die Anwendung visuelles Feedback zu diesem Effekt geben, z. B. kann das Werfen virtueller Schatten auf gescannte Oberflächen dem Benutzer helfen, Hologramme auf diesen Oberflächen zu platzieren.
    • In diesem Fall sollten die Begrenzungsvolumina des Raumoberflächenbeobachters für jeden Frame in ein räumliches Koordinatensystem aktualisiert werden, das den Textkörper gesperrt hat, damit sie dem Benutzer folgen.
  • Einen geeigneten Standort finden

    • Eine Anwendung kann für die Verwendung an einem Ort mit bestimmten Anforderungen konzipiert werden.
    • Beispielsweise kann die Anwendung einen leeren Bereich um den Benutzer benötigen, damit er sicher holografisches Kung-Fu üben kann.
    • Anwendungen sollten dem Benutzer im Vorfeld alle spezifischen Anforderungen mitteilen und diese durch klares visuelles Feedback verstärken.
    • In diesem Beispiel sollte die Anwendung den Umfang des erforderlichen leeren Bereichs visualisieren und das Vorhandensein unerwünschter Objekte innerhalb dieser Zone visuell hervorheben.
    • In diesem Fall sollten die Begrenzungsvolumina des Raumoberflächenbeobachters ein weltgebundenes räumliches Koordinatensystem an der ausgewählten Position verwenden.
  • Finden einer geeigneten Konfiguration von Oberflächen

    • Eine Anwendung kann eine bestimmte Konfiguration von Oberflächen erfordern, z. B. zwei große, flache, gegenläufige Wände, um eine holografische Spiegelhalle zu erstellen.
    • In solchen Fällen muss die Anwendung die von der räumlichen Zuordnung bereitgestellten Oberflächen analysieren, um geeignete Oberflächen zu erkennen und den Benutzer darauf zu lenken.
    • Der Benutzer sollte über eine Fallbackoption verfügen, wenn die Oberflächenanalyse der Anwendung nicht zuverlässig ist. Wenn die Anwendung beispielsweise einen Türeingang fälschlicherweise als flache Wand identifiziert, benötigt der Benutzer eine einfache Möglichkeit, diesen Fehler zu beheben.
  • Scannen eines Teils der Umgebung

    • Eine Anwendung möchte möglicherweise nur einen Teil der Umgebung erfassen, wie vom Benutzer angewiesen.
    • Beispielsweise scannt die Anwendung einen Teil eines Raums, sodass der Benutzer eine holografische Kleinanzeige für Möbel posten kann, die er verkaufen möchte.
    • In diesem Fall sollte die Anwendung räumliche Zuordnungsdaten innerhalb der Vom Benutzer während der Überprüfung beobachteten Regionen erfassen.
  • Scannen des gesamten Raums

    • Eine Anwendung erfordert möglicherweise eine Überprüfung aller Oberflächen im aktuellen Raum, einschließlich der oberflächen hinter dem Benutzer.
    • Beispielsweise kann ein Spiel den Benutzer in die Rolle gulliver versetzen, unter Belagerung von Hunderten von winzigen Lilliputians, die sich aus allen Richtungen nähern.
    • In solchen Fällen muss die Anwendung ermitteln, wie viele der Oberflächen im aktuellen Raum bereits gescannt wurden, und den Blick des Benutzers darauf lenken, erhebliche Lücken zu schließen.
    • Der Schlüssel zu diesem Prozess ist die Bereitstellung von visuellem Feedback, das dem Benutzer klar macht, welche Oberflächen noch nicht gescannt wurden. Die Anwendung könnte z. B. entfernungsbasierten Nebel verwenden, um Bereiche visuell hervorzuheben, die nicht von räumlichen Zuordnungsflächen abgedeckt sind.
  • Erstellen einer ersten Momentaufnahme der Umgebung

    • Eine Anwendung möchte möglicherweise alle Änderungen in der Umgebung ignorieren, nachdem sie eine anfängliche "Momentaufnahme" vorgenommen hat.
    • Dies kann geeignet sein, um Unterbrechungen von vom Benutzer erstellten Daten zu vermeiden, die eng mit dem ursprünglichen Zustand der Umgebung verknüpft sind.
    • In diesem Fall sollte die Anwendung nach Abschluss der Überprüfung eine Kopie der Räumlichen Zuordnungsdaten im Anfangszustand erstellen.
    • Anwendungen sollten weiterhin Updates für räumliche Zuordnungsdaten erhalten, wenn Hologramme von der Umgebung noch ordnungsgemäß verdeckt werden sollen.
    • Fortlaufende Aktualisierungen von Räumlichen Zuordnungsdaten ermöglichen auch die Visualisierung aller vorgenommenen Änderungen, wodurch dem Benutzer die Unterschiede zwischen vorherigen und aktuellen Zuständen der Umgebung klargestellt werden.
  • Erstellen von vom Benutzer initiierten Momentaufnahmen der Umgebung

    • Eine Anwendung möchte möglicherweise nur auf Umgebungsänderungen reagieren, wenn sie vom Benutzer angewiesen wird.
    • Beispielsweise könnte der Benutzer mehrere 3D-"Statuen" eines Freundes erstellen, indem er seine Posen in verschiedenen Momenten erfasst.
  • Zulassen, dass der Benutzer die Umgebung ändern kann

    • Eine Anwendung kann so konzipiert werden, dass sie in Echtzeit auf änderungen reagiert, die in der Umgebung des Benutzers vorgenommen werden.
    • Beispielsweise könnte der Benutzer, der einen Vorhang zeichnet, eine "Szenenänderung" für ein holografisches Spiel auslösen, das auf der anderen Seite stattfindet.
  • Führen Sie den Benutzer an, Fehler in den Räumlichen Zuordnungsdaten zu vermeiden.

    • Eine Anwendung möchte dem Benutzer möglicherweise Anleitungen bereitstellen, während er seine Umgebung überprüft.
    • Dies kann dem Benutzer helfen, bestimmte Arten von Fehlern in den räumlichen Zuordnungsdaten zu vermeiden, z. B. indem er sich von sonnengeleuchteten Fenstern oder Spiegeln fernhält.

Ein zusätzliches Detail, das sie beachten müssen, ist, dass der "Bereich" der räumlichen Zuordnungsdaten nicht unbegrenzt ist. Die räumliche Zuordnung erstellt zwar eine permanente Datenbank mit großen Räumen, stellt diese Daten jedoch nur Anwendungen in einer "Blase" von begrenzter Größe um den Benutzer zur Verfügung. Wenn Sie am Anfang eines langen Korridors beginnen und weit genug vom Start weg gehen, dann verschwinden schließlich die Räumlichen Flächen zurück am Anfang. Sie können dies verringern, indem Sie diese Oberflächen in Ihrer Anwendung zwischenspeichern, nachdem sie aus den verfügbaren räumlichen Zuordnungsdaten verschwunden sind.

Gitterverarbeitung

Es kann hilfreich sein, häufige Arten von Fehlern in Oberflächen zu erkennen und die räumlichen Zuordnungsdaten nach Bedarf zu filtern, zu entfernen oder zu ändern.

Denken Sie daran, dass räumliche Kartendaten so treu wie möglich an realen Oberflächen sein sollen, sodass jede Verarbeitung, die Sie anwenden, riskiert, Ihre Oberflächen von der "Wahrheit" zu verschiebt.

Im Folgenden finden Sie einige Beispiele für verschiedene Arten der Gitterverarbeitung, die Sie nützlich finden können:

  • Lochfüllung

    • Wenn ein kleines Objekt aus einem dunklen Material nicht scannen kann, hinterlässt es ein Loch in der umgebenden Oberfläche.
    • Löcher wirken sich auf die Okklusion aus: Hologramme können "durch" ein Loch in einer vermeintlich undurchsichtigen realen Oberfläche gesehen werden.
    • Löcher wirken sich auf Raycasts aus: Wenn Sie Raycasts verwenden, um Benutzern bei der Interaktion mit Oberflächen zu helfen, kann es nicht wünschenswert sein, dass diese Strahlen Löcher durchlaufen. Eine Entschärfung besteht darin, ein Bündel mehrerer Raycasts zu verwenden, die einen Bereich mit angemessener Größe abdecken. Auf diese Weise können Sie "Ausreißer"-Ergebnisse filtern, sodass selbst wenn ein Raycast ein kleines Loch durchläuft, das Aggregatergebnis weiterhin gültig ist. Dieser Ansatz ist jedoch mit Rechenkosten verbunden.
    • Löcher wirken sich auf physikalische Kollisionen aus: Ein durch physiksimulationsgesteuertes Objekt kann durch ein Loch im Boden fallen und verloren gehen.
    • Es ist möglich, solche Löcher im Oberflächengitter algorithmisch zu füllen. Sie müssen ihren Algorithmus jedoch so optimieren, dass "echte Löcher" wie Fenster und Türen nicht gefüllt werden. Es kann schwierig sein, "echte Löcher" von "imaginären Löchern" zuverlässig zu unterscheiden, sodass Sie mit verschiedenen Heuristiken wie "Größe" und "Begrenzungsform" experimentieren müssen.
  • Halluzinationsentfernung

    • Reflektionen, helles Licht und sich bewegende Objekte können kleine verweilende "Halluzinationen" in der Luft schweben lassen.
    • Halluzinationen beeinflussen die Okklusion: Halluzinationen können als dunkle Formen sichtbar werden, die sich vor anderen Hologrammen bewegen und verdecken.
    • Halluzinationen wirken sich auf Raycasts aus: Wenn Sie Raycasts verwenden, um Benutzern bei der Interaktion mit Oberflächen zu helfen, könnten diese Strahlen eine Halluzination treffen und nicht auf die Oberfläche dahinter. Wie bei Löchern besteht eine Entschärfung darin, viele Raycasts anstelle eines einzelnen Raycasts zu verwenden, aber auch dies wird mit Rechenkosten verbunden sein.
    • Halluzinationen wirken sich auf physikalische Kollisionen aus: Ein durch physiksimulationsgesteuertes Objekt kann an einer Halluzination hängen bleiben und sich nicht durch einen scheinbar klaren Bereich des Raums bewegen.
    • Es ist möglich, solche Halluzinationen aus dem Oberflächengitter zu filtern. Wie bei Löchern müssen Sie ihren Algorithmus jedoch so optimieren, dass echte kleine Objekte wie Lampenständer und Türgriffe nicht entfernt werden.
  • Glättung

    • Bei der räumlichen Zuordnung können Oberflächen zurückgegeben werden, die im Vergleich zu ihren realen Entsprechungen rau oder "laut" erscheinen.
    • Die Glätte wirkt sich auf physikalische Kollisionen aus: Wenn der Boden rau ist, rollt ein physisch simulierter Golfball möglicherweise nicht glatt über ihn in einer geraden Linie.
    • Die Glätte wirkt sich auf das Rendern aus: Wenn eine Oberfläche direkt visualisiert wird, können raue Oberflächennormale ihr Aussehen beeinflussen und den Sauber-Look stören. Es ist möglich, dies durch die Verwendung geeigneter Beleuchtung und Texturen im Shader zu verringern, der zum Rendern der Oberfläche verwendet wird.
    • Es ist möglich, Rauheiten in einem Oberflächengitter zu glätten. Dies kann jedoch die Oberfläche weiter von der entsprechenden realen Oberfläche wegschieben. Die Aufrechterhaltung einer engen Übereinstimmung ist wichtig, um eine genaue Hologrammverdeckung zu erzeugen und es Benutzern zu ermöglichen, präzise und vorhersagbare Interaktionen mit holografischen Oberflächen zu erzielen.
    • Wenn nur eine kosmetische Änderung erforderlich ist, kann es ausreichen, Vertexnormale zu glätten, ohne die Vertexpositionen zu ändern.
  • Ebenensuche

    • Es gibt viele Formen der Analyse, die eine Anwendung möglicherweise auf den Oberflächen durchführen möchte, die von der räumlichen Zuordnung bereitgestellt werden.
    • Ein einfaches Beispiel ist "Ebenensuche"; Identifizieren von begrenzten, meist planaren Flächenbereichen.
    • Planare Regionen können als holografische Arbeitsflächen verwendet werden, Also Regionen, in denen holografische Inhalte automatisch von der Anwendung platziert werden können.
    • Planare Regionen können die Benutzeroberfläche einschränken, um Benutzer bei der Interaktion mit den Oberflächen zu unterstützen, die ihren Anforderungen am besten entsprechen.
    • Planare Regionen können wie in der realen Welt für holografische Entsprechungen zu funktionalen Objekten wie LCD-Bildschirmen, Tischen oder Whiteboards verwendet werden.
    • Planare Regionen können Spielbereiche definieren, die die Grundlage für Videospielebenen bilden.
    • Planare Regionen können virtuellen Agenten helfen, in der realen Welt zu navigieren, indem sie die Bereiche des Bodens identifizieren, auf denen echte Menschen wahrscheinlich zu Fuß gehen.

Prototyperstellung und Debuggen

Nützliche Tools

  • Der HoloLens-Emulator kann verwendet werden, um Anwendungen mit räumlicher Zuordnung ohne Zugriff auf eine physische HoloLens zu entwickeln. Es ermöglicht Ihnen, eine Livesitzung auf einer HoloLens in einer realistischen Umgebung mit allen Daten zu simulieren, die Ihre Anwendung normalerweise nutzen würde, einschließlich HoloLens-Bewegung, räumliche Koordinatensysteme und räumliche Zuordnungsgitter. Dies kann verwendet werden, um zuverlässige, wiederholbare Eingaben bereitzustellen, die beim Debuggen von Problemen und beim Auswerten von Änderungen an Ihrem Code nützlich sein können.
  • Um ein Szenario zu reproduzieren, erfassen Sie räumliche Zuordnungsdaten über das Netzwerk aus einer Live-HoloLens, speichern Sie sie dann auf dem Datenträger, und verwenden Sie sie in späteren Debugsitzungen wieder.
  • Die 3D-Ansicht des Windows-Geräteportals bietet eine Möglichkeit, alle derzeit über das räumliche Zuordnungssystem verfügbaren räumlichen Oberflächen anzuzeigen. Dies bietet eine Vergleichsbasis für die räumlichen Oberflächen in Ihrer Anwendung. Sie können beispielsweise leicht erkennen, ob räumliche Flächen fehlen oder an der falschen Stelle angezeigt werden.

Allgemeine Anleitung zur Prototyperstellung

  • Da Fehler in den Räumlichen Zuordnungsdaten die Benutzererfahrung stark beeinträchtigen können, wird empfohlen, Ihre Anwendung in einer Vielzahl von Umgebungen zu testen.
  • Lassen Sie sich nicht von der Gewohnheit verfangen, immer am selben Ort zu testen, z. B. an Ihrem Schreibtisch. Stellen Sie sicher, dass Sie verschiedene Oberflächen mit unterschiedlichen Positionen, Formen, Größen und Materialien testen.
  • Ebenso können synthetische oder aufgezeichnete Daten für das Debuggen nützlich sein, aber nicht zu abhängig von denselben wenigen Testfällen. Dies kann die Suche nach wichtigen Problemen verzögern, die durch vielfältigere Tests früher erkannt worden wären.
  • Es ist eine gute Idee, Tests mit echten (und im Idealfall nicht gecoachten) Benutzern durchzuführen, da diese die HoloLens oder Ihre Anwendung möglicherweise nicht auf die gleiche Weise wie Sie verwenden. In der Tat kann es Sie überraschen, wie unterschiedlich das Verhalten, das Wissen und die Annahmen von Menschen sein können!

Problembehandlung

  • Damit die Oberflächengitter richtig ausgerichtet werden, muss jedes GameObject aktiv sein, bevor es an den SurfaceObserver gesendet wird, um sein Gitter zu erstellen. Andernfalls werden die Gitter in Ihrem Raum angezeigt, aber in seltsamen Winkeln gedreht.
  • Das GameObject, das das Skript ausführt, das mit dem SurfaceObserver kommuniziert, muss auf den Ursprung festgelegt werden. Andernfalls haben alle GameObjects, die Sie erstellen und an den SurfaceObserver senden, um ihre Gitter zu erstellen, einen Offset, der dem Offset des übergeordneten Spielobjekts entspricht. Dies kann dazu führen, dass Ihre Gitter mehrere Meter entfernt angezeigt werden, was es schwierig macht, zu debuggen, was vor sich geht.

Weitere Informationen