Grundlegendes zu SessionOrigin
SessionOrigin ist eine relativ neue Implementierung, die in der AR Foundation eingeführt wurde, aber die Idee taucht seit Jahrzehnten in den Rendering-Engines von Kameraplattformen auf. Möglicherweise sind Sie damit als MRTK Playspace-Knoten vertraut. Die Funktion ist sehr leistungsstark, aber leider schlecht erklärt und wurde daher kaum verstanden.
Was ist SessionOrigin?
SessionOrigin ist nur ein Transformationsobjekt, dem die Kamera angefügt ist. Im Klartext erlaubt es die Platzierung der Kamera in der virtuellen Szene. Genauer: Es definiert einen speziellen Koordinatenraum.
Wie bei der Transformation über- und untergeordneter Beziehungen in Unity (und allen modernen Rendering-Engines) üblich, wird das untergeordnete Element durch „Verschieben“ des übergeordneten Elements „verschoben“. Der Begriff „Verschieben“ bedeutet in diesem Kontext, dass eine Änderung der globalen Position des übergeordneten Elements die globalen Koordinaten des untergeordneten Elements ändert. Wenn sich die globalen Koordinaten eines Objekts ändern, scheint sich dieses Objekt relativ zu Objekten verschoben zu haben, deren globale Koordinaten sich nicht geändert haben.
Die Kamera ist in diesem Sinne etwas Besonderes, da sie nicht gerendert wird. Sie bestimmt die Perspektive des Renderers. Dies wird in einem konkreten Beispiel verdeutlicht.
Einfachstes Beispiel für SessionOrigin
Stellen Sie sich eine sehr einfache Szene vor, in der sich die Kamera beim Start am Ursprung befindet (wie es in AR-Anwendungen üblich ist), und eine einzelne rote Kugel auf der Z-Achse 10 Meter vor der Kamera platziert ist (Position=(0,0,10)).
Stellen Sie sich nun vor, dass der Benutzer stattdessen 1 Meter von der Kugel entfernt starten soll.
Zwei Optionen kommen infrage:
- Verschieben der Kamera an eine neue Position (0,0,9).
- Verschieben der Kugel an eine neue Position (0,0,1).
Es ist ziemlich offensichtlich, dass die beiden Optionen letztendlich ohne anderen Kontext gleichwertig sind. In beiden Fällen befindet sich die Kugel beim Start 1 Meter vor der Kamera. Der einzige Unterschied sind die absoluten globalen Koordinaten der beiden Objekte. Ihre relativen Koordinaten, d. h. der Vektor zwischen den beiden, sind in beiden Fällen identisch.
Wie gehen wir vor, wenn wir Option 1 verwenden möchten? Wenn wir die Koordinaten der Kamera festlegen, werden sie vom Nachverfolgungssystem überschrieben. Stattdessen fügen wir die Kamera einem übergeordneten Objekt an und verschieben dann das übergeordnete Objekt. Der Tracker legt die lokale Position der Kamera fest, wodurch sie relativ zum übergeordneten Element verschoben wird. Das übergeordnete Element ist jetzt SessionOrigin.
Warum sollte die Kamera anstelle der Kugel bewegt werden?
In diesem einfachen Fall sind die beiden Optionen eindeutig austauschbar. Denken Sie jedoch daran, dass „die Kugel“ tatsächlich „alles in der Szene außer der Kamera“ darstellt. Wenn die Komplexität der Szene zunimmt, wird es komplizierter, alles zu verschieben. Das Verschieben der Kamera über SessionOrigin ist immer genau derselbe Vorgang.
Darüber hinaus gibt es Objekttypen, die schwer oder unmöglich neu positioniert werden können, z. B. Partikelsysteme oder Navigationsgitter. Aber auch wenn nichts davon beteiligt ist, hat das Ändern der Koordinaten eines einzelnen Objekts in der Szene, SessionOrigin, gegenüber dem Ändern der globalen Koordinaten alles Übrigen eindeutige Vorteile.
SessionOrigin sollte nicht alles verschieben
Betrachten Sie noch einmal unser einfachstes Beispiel. Dies ist jedoch eine AR-Anwendung, daher wird dem Benutzer neben der gerenderten roten Kugel auch die physische Umgebung angezeigt. Der Einfachheit halber ist unsere physische Umgebung wie gezeigt auf den einzelnen grünen Sessel beschränkt.
Wenn wir nun die Kamera über SessionOrigin bewegen, haben wir sie relativ zur roten Kugel verschoben, aber natürlich haben wir den Benutzer nicht mitgenommen und relativ zum grünen Sessel verschoben. Die Kugel erscheint nun näher, aber der Sessel befindet sich genau an derselben Position.
Was passiert, wenn sich ein Anker auf dem Sessel befindet? Sollte sich der Anker mit der roten Kugel bewegen oder relativ zum Sessel fixiert bleiben? Beim Anker geht es allein darum, dass er relativ zur physischen Welt fixiert bleibt, sodass er eindeutig beim Sessel bleiben sollte.
Ein weiteres Beispiel ist die Raum-Mesh. Dieses Gitter wird generiert, um eine virtuelle Version der physischen Umgebung für Kontext, Raycasting usw. zu bieten. Wir möchten auf jeden Fall, dass das räumliche Gitter auf die physische Welt fixiert bleibt.
Weitere Beispiele reichen von Handgittern bis hin zu Vektoren des Anvisierens mit den Augen. Allen ist gemeinsam, dass die Koordinaten dieser Objekte dieselbe Anpassung erhalten sollten, wenn die Koordinaten der Kamera angepasst (transformiert) werden.
Daher werden alle Objekte, die sich in Koordination mit der Kamera bewegen, SessionOrigin auch konzeptionell angefügt. Wenn SessionOrigin relativ zu globalen Objekten wie der roten Kugel verschoben wird, werden alle diese Objekte mitgenommen.
Es muss betont werden, dass dies von der Bewegung der Kamera aufgrund der Kopfnachverfolgung unabhängig ist. Der Tracker bewegt die Kamera relativ zu SessionOrigin.
Eine etwas mathematischere Erklärung
Das globale Koordinatensystem von Unity ist in einer AR-Anwendung standardmäßig willkürlich positioniert. Abgesehen von der Ausrichtung des Schwerkraftvektors (Y-Achse) auf „oben“ werden Position und Ausrichtung vollständig davon bestimmt, wo der Tracker die Kamera beim Start platziert.
Dies wird zwar für viele Anwendungen in Ordnung sein, doch eine Vielzahl von Möglichkeiten eröffnet sich dadurch, diese Beliebigkeit des globalen Koordinatenraums entfernen zu können.
Wenn Sie sich das vorherige Beispiel ansehen, stellen Sie sich vor, dass es für die Anwendung von Bedeutung ist, dass die virtuelle rote Kugel wie gezeigt relativ zum physischen Sessel positioniert ist. Dies können wir erreichen, indem wir SessionOrigin anpassen.
Wenn wir möchten, dass sich die Kugel bei (0,0,10) 1 Meter entlang der X-Achse vom Sessel entfernt befindet, soll der Sessel sich bei (-1,0,10) befinden. Wenn wir bestimmen, dass sich die Kamera 2 Meter direkt entlang der negativen Z-Achse hinter dem Sessel befindet, wenn sich die Kamera am Ursprung befindet, befindet sich der Sessel derzeit bei (0,0,2). (Denken Sie daran, dass physische Objekte keine absoluten Koordinaten haben, sondern nur Koordinaten, die durch die Nähe zur Kamera und den virtuellen Objekten impliziert werden.)
Wenn wir jedoch die SessionOrigin-Transformation auf (-1,0,8) festlegen, ist die Kameraposition jetzt (-1,0,8). Der direkt voraus 2 Meter entfernte Sessel befindet sich bei (-1,0,10). Und die rote Kugel bei (0,0,10) wird wie gewünscht 1 Meter rechts vom Sessel angezeigt.
So haben wir die SessionOrigin-Transformation effektiv verwendet, um den globalen Raum von Unity neu zu positionieren, sodass die rote Kugel und alle anderen globalen Objekte genau an der relativ zur physischen Welt richtigen Position angezeigt werden.
Dieser einfache, aber leistungsstarke Mechanismus zum Ausrichten des globalen Koordinatenraums von Unity auf die physische Welt kann genutzt werden, um komplexe Layouts, Persistenz von Koordinatenräumen, geräteübergreifende Koordinatenräume und mehr zu unterstützen.