Freigeben über


Hologrammstabilisierung — MRTK2

Leistung

Damit die zugrunde liegende Mixed Reality-Plattform und das Gerät die besten Ergebnisse erzielen können, ist es wichtig, die Leistung von Frameraten zu erzielen. Die Zielframerate (z. B. 60 FPS oder 90 FPS) variiert je nach Plattform und Geräten. Mixed Reality-Anwendungen haben jedoch stabile Hologramme sowie effiziente Kopfverfolgung, Handverfolgung und vieles mehr.

Umgebungsnachverfolgung

Stabiles holografisches Rendering basiert stark auf der Head-Pose-Tracking durch die Plattform und das Gerät. Unity rendert die Szene jeden Frame aus der Kamera-Pose, die von der zugrunde liegenden Plattform geschätzt und bereitgestellt wird. Wenn diese Nachverfolgung nicht korrekt auf die tatsächliche Kopfbewegung folgt, werden Hologramme visuell ungenau angezeigt. Dies ist besonders offensichtlich und wichtig für AR-Geräte wie HoloLens, bei denen Benutzer virtuelle Hologramme mit der realen Welt verknüpfen können. Die Leistung ist für eine zuverlässige Head Tracking von Bedeutung, aber es können auch andere wichtige Features vorhanden sein. Die Typen von Umgebungselementen, die sich auf die Benutzererfahrung auswirken, hängen von den zielspezifischen Plattformspezifischen ab.

Windows Mixed Reality

Die Windows Mixed Reality-Plattform bietet ein Referenzmaterial zur Stabilisierung von Hologrammen auf der Plattform. Es gibt eine Reihe von wichtigen Tools, die Entwickler jedoch nutzen können, um die visuelle Benutzeroberfläche für Hologramme für Benutzer zu verbessern.

Tiefenpufferfreigabe

Unity-Entwickler haben die Möglichkeit, den Tiefenpuffer der Anwendung mit der Plattform zu teilen. Dies enthält Informationen, bei denen Hologramme für einen aktuellen Frame vorhanden sind, dass die Plattform verwendet werden kann, um Hologramme über einen hardwaregestützten Prozess zu stabilisieren, der als Late-Stage Reprojection bezeichnet wird.

Spätstadium-Neuprojektion

Am Ende des Renderns eines Frames verwendet die Windows Mixed Reality-Plattform die von der Anwendung erzeugten Farb- und Tiefenrenderingziele und transformiert die endgültige Bildschirmausgabe, um jede leichte Kopfbewegung seit der letzten Kopfvorgabe zu berücksichtigen. Die Spielschleife einer Anwendung benötigt Zeit zum Ausführen. Bei 60 FPS bedeutet dies beispielsweise, dass die Anwendung ~16,667 ms benötigt, um einen Frame zu rendern. Obwohl dies wie eine miniskule Zeit erscheinen mag, ändert sich die Position und Ausrichtung des Kopfes des Benutzers, was zu neuen Projektionsmatrizen für die Kamera beim Rendern führt. Die späte Neuprojektion transformiert die Pixel im endgültigen Bild, um diese neue Perspektive zu berücksichtigen.

Pro Pixel und Stabilisierungsebene LSR

Je nach Geräteendpunkt und Betriebssystemversion, die auf einem Windows Mixed Reality-Gerät ausgeführt wird, wird der Late-Stage Reprojection-Algorithmus entweder pro Pixel oder über eine Stabilisierungsebene ausgeführt.

Tiefenbasis pro Pixel

Die tiefenbasierte Neuprojektion pro Pixel umfasst die Verwendung des Tiefenpuffers, um die Bildausgabe pro Pixel zu ändern und damit Hologramme in verschiedenen Entfernungen zu stabilisieren. So kann z. B. eine Kugel 1m entfernt vor einer Säule liegen, die 10m entfernt ist. Die Pixel, die die Kugel darstellen, haben eine andere Transformation als die weit entfernten Pixel, die die Säule darstellen, wenn der Benutzer seinen Kopf leicht gekippt hat. Pro Pixel-Neuprojektion berücksichtigt diesen Abstandsunterschied bei jedem Pixel, um eine genauere Neuprojektion zu erhalten.

Stabilisierungsebene

Wenn es nicht möglich ist, einen genauen Tiefenpuffer für die Plattform zu erstellen, verwendet eine andere Form von LSR eine Stabilisierungsebene. Alle Hologramme in einer Szene erhalten eine Stabilisierung, aber Hologramme, die in der gewünschten Ebene liegen, erhalten die maximale Hardwarestabilisierung. Der Punkt und die Normalität für die Ebene können über die holographicSettings.SetFocusPointForFrame-API von Unity an die Plattform übermittelt werden.

Tiefenpufferformat

Bei der Entwicklung von HoloLens wird dringend empfohlen, das 16-Bit-Tiefenpufferformat im Vergleich zu 24-Bit zu verwenden. Dies kann enorme Leistungseinbußen erzielen, obwohl Tiefenwerte weniger Genauigkeit aufweisen. Um die niedrigere Genauigkeit auszugleichen und Z-Kämpfe zu vermeiden, wird empfohlen, die weit entfernte Clipebene von dem von Unity festgelegten Standardwert von 1000m zu reduzieren.

Hinweis

Wenn Sie das 16-Bit-Tiefenformat verwenden, funktioniert der erforderliche Schablonenpuffer nicht, da Unity in dieser Einstellung keinen Schablonenpuffer erstellt. Wenn Sie dagegen das 24-Bit-Tiefenformat auswählen, wird in der Regel ein 8-Bit-Schablonenpuffer erstellt, falls zutreffend auf der Endpunktgrafikplattform.

Tiefenpufferfreigabe in Unity

Um tiefenbasierte LSR nutzen zu können, gibt es zwei wichtige Schritte, die Entwickler ausführen müssen.

  1. Aktivieren Sie unter ">Project Settings>Player>XR Settings>Virtual Reality SDKs>" die Tiefenpufferfreigabe
    1. Bei der Zielbestimmung von HoloLens empfiehlt es sich, auch das 16-Bit-Tiefenformat auszuwählen.
  2. Rendern der Tiefe beim Rendern der Farbe auf dem Bildschirm

Opaque GameObjects in Unity schreibt in der Regel automatisch in die Tiefe. Transparente & Textobjekte schreiben jedoch in der Regel nicht standardmäßig in tiefe. Wenn Sie den MRTK-Standard-Shader oder Text Mesh Pro verwenden, kann dies problemlos behoben werden.

Hinweis

Um schnell zu bestimmen, welche Objekte in einer Szene nicht visuell in den Tiefenpuffer geschrieben werden, kann man das Hilfsprogramm "Rendertiefepuffer" unter den Editoreinstellungen im MRTK-Konfigurationsprofil verwenden.

Transparenter MRTK Standard-Shader

Wählen Sie für transparente Materialien, die den MRTK Standard-Shader verwenden, das Material aus, um es im Inspektorfenster anzuzeigen. Klicken Sie dann auf die Schaltfläche "Jetzt korrigieren", um das Material in die Tiefe zu konvertieren (z.B. Z-Write On).

Vorher

Tiefenpuffer vor der Behebung des MRTK-Standard-Shaders

After

Depth Buffer Fixed MRTK Standard Shader

Text Mesh Pro

Wählen Sie für Text Mesh Pro-Objekte das TMP GameObject aus, um es im Inspektor anzuzeigen. Wechseln Sie unter der Materialkomponente zum Shader für das zugewiesene Material, um den MRTK TextMeshPro-Shader zu verwenden.

Korrektur des Text Mesh Pro Tiefenpuffers

Benutzerdefinierter Shader

Wenn Sie einen benutzerdefinierten Shader schreiben, fügen Sie das ZWrite-Flag oben in der Pass-Blockdefinition hinzu, um den Shader so zu konfigurieren, dass er in den Tiefenpuffer schreibt.

Shader "Custom/MyShader"
{
    SubShader
    {
        Pass
        {
            ...
            ZWrite On
            ...
        }
    }
}
Undurchsichtige Rücksicherungen

Wenn die oben genannten Methoden für ein bestimmtes Szenario (d. h. die Verwendung der Unity-Benutzeroberfläche) nicht funktionieren, ist es möglich, ein anderes Objekt in den Tiefenpuffer zu schreiben. Ein gängiges Beispiel ist die Verwendung von Unity-UI-Text in einem unverankerten Bereich in einer Szene. Indem das Panel undurchsichtig oder zumindest in die Tiefe geschrieben wird, wird sowohl der Text als auch das Panel von der Plattform stabilisiert, da sich ihre Z-Werte so nah aneinander befinden.

WorldAnchors (HoloLens)

Neben der Sicherstellung, dass die richtigen Konfigurationen erfüllt sind, um die visuelle Stabilität sicherzustellen, ist es wichtig, sicherzustellen, dass Hologramme an ihren richtigen physischen Standorten stabil bleiben. Um die Plattform an wichtigen Orten in einem physischen Raum zu informieren, können Entwickler WorldAnchors auf GameObjects nutzen, die an einem Ort bleiben müssen. Ein WorldAnchor ist eine Komponente, die einem GameObject hinzugefügt wird, das absolute Kontrolle über die Transformation dieses Objekts übernimmt.

Geräte wie HoloLens scannen ständig und lernen mehr über die Umgebung. Da die HoloLens die Bewegung und Position im Raum verfolgt, werden die Schätzungen aktualisiert und das Unity-Koordinatensystem angepasst. Wenn beispielsweise ein GameObject 1m von der Kamera am Anfang platziert wird, da die HoloLens die Umgebung verfolgt, kann es den physischen Punkt erkennen, an dem sich das GameObject befindet, tatsächlich 1,1m entfernt ist. Dies würde dazu führen, dass das Hologramm driftet. Das Anwenden eines WorldAnchor auf ein GameObject ermöglicht es dem Anker, die Transformation des Objekts zu steuern, sodass das Objekt an der richtigen physischen Position verbleibt (d. h. auf 1,1m entfernt statt auf 1m zur Laufzeit aktualisieren). Um WorldAnchors über App-Sitzungen hinweg beizubehalten, können Entwickler den WorldAnchorStore verwenden, um WorldAnchors zu speichern und zu laden.

Hinweis

Nachdem eine WorldAnchor-Komponente einem GameObject hinzugefügt wurde, ist es nicht möglich, die Transformation dieses GameObjects (d. h. transform.position = x) zu ändern. Ein Entwickler muss den WorldAnchor entfernen, um die Transformation zu bearbeiten.

WorldAnchor m_anchor;

public void AddAnchor()
{
    this.m_anchor = this.gameObject.AddComponent<WorldAnchor>();
}

public void RemoveAnchor()
{
    DestroyImmediate(m_anchor);
}

Wenn Sie eine Alternative zum manuellen Arbeiten mit Anchorn wünschen, schauen Sie sich die Microsoft World Locking Tools an.

Siehe auch