Die Laufresultate der Session abrufen
Wahrend der Session-Ausfuhrung verandert die Session den Transform einiger Objekte in der Szene und das Kamerabild. Manchmal reichen diese Anderungen fur den Anwendungsfall nicht aus, und Sie mussen die Laufresultate jeder Session-Frame auslesen und diese Daten weiterverarbeiten. In diesem Artikel erfahren Sie, wie diese Ergebnisdaten abgerufen und verwendet werden.
Vor dem Start
- Verstehen Sie uber ARSession einfuhren die grundlegenden Konzepte, Bestandteile und den Arbeitsablauf einer Session.
- Erfahren Sie, wie Sie eine Session erstellen.
- Erfahren Sie, wie Sie auf AR-Funktionskomponenten zugreifen.
InputFrame aktualisieren abrufen
Mit dem Ereignis InputFrameUpdate konnen Sie Aktualisierungen von InputFrame abrufen. Dieses Ereignis wird nur ausgelost, wenn sich InputFrame in den pro Frame ausgegebenen Daten der Session verandert.
Anmerkung
InputFrameUpdate ist nur in Sessions mit der von EasyAR gezeichneten Bildausgabe gultig. Im Allgemeinen ist es bei Verwendung von AR Foundation oder Headsets ungultig. In diesen Fallen mussen Sie die von diesen Drittanbieter-Bibliotheken bereitgestellten Methoden zum Abrufen von Aktualisierungen verwenden.
Mit InputFrame konnen Sie das Bild der physischen Kamera, Kameraparameter, Zeitstempel, die Transformation der physischen Kamera relativ zum Weltkoordinatensystem und den Tracking-Status abrufen. Da die Kameratransformation jedoch bereits von der Session auf die virtuelle Kamera und andere Objekte angewendet wurde, ist es normalerweise nicht notwendig, die Kameratransformation uber InputFrame zu holen.
Das Kamerabild des aktuellen Frames abrufen
Mit InputFrame.image() kann das physische Kamerabild als Image abgerufen werden.
Das folgende Beispiel zeigt, wie das physische Kamerabild beim Update von InputFrame abgerufen wird:
Session.InputFrameUpdate += (inputFrame) => {
using (var image = inputFrame.image())
{
}
};
Vorsicht
Wenn Sie Image und andere daraus abgeleitete class-Daten verwenden, mussen Sie sicherstellen, dass Dispose() korrekt aufgerufen wird (im obigen Beispiel geschieht das durch die using-Anweisung). Andernfalls kann es zu Speicherlecks oder sogar dazu kommen, dass das Bild nicht mehr aktualisiert wird.
Wenn Sie InputFrame oder Image bis zum nachsten Frame behalten mochten, mussen Sie je nach Datenmenge den Wert von ARAssembly.ExtraBufferCapacity erhohen. Andernfalls kann es wegen unzureichender Pufferkapazitat zu Fehlern beim Abrufen der Daten kommen.
Wenn Sie InputFrame behalten mochten, mussen Sie außerdem mit Clone() eine Referenzkopie erstellen und diese mit Dispose() freigeben, wenn Sie sie nicht mehr benotigen.
Da die Bildfrequenz der physischen Kamera normalerweise niedriger ist als die Render-Frame-Rate, wird nicht bei jedem Render-Frame ein InputFrameUpdate-Ereignis ausgelost. Andererseits wird auch das Bild der physischen Kameradarstellung nicht bei jedem Render-Frame aktualisiert. Alle Render-Frames vor dem nachsten InputFrameUpdate-Ereignis entsprechen dem Bild des aktuellen InputFrame.
Anmerkung
Das Bild in InputFrame stimmt immer mit dem aktuellen virtuellen Kamerahintergrund uberein. Der Hintergrund kann bei der Darstellung jedoch skaliert und beschnitten werden, daher ist es normal, wenn Grobe oder Seitenverhaltnis des abgerufenen Bildes nicht mit dem auf dem Bildschirm angezeigten Bild ubereinstimmen.
Außerdem ist zu beachten, dass die von InputFrame.image() zuruckgegebenen Bilddaten CPU-lesbar sind, nicht aber GPU-Texturen. Wenn Sie die Bilddaten auf der GPU verwenden mochten, mussen Sie sie in eine GPU-Textur hochladen oder uber CameraImageRenderer.RequestTargetTexture(Action<Camera, RenderTexture>) direkt eine GPU-Textur abrufen.
[Optional] Das Rendern des physischen Kamerabilds abfangen
Mit ARAssembly.CameraImageRenderer konnen Sie das Zeichnen des physischen Kamerabilds steuern.
Der folgende Code stoppt das Zeichnen des physischen Kamerabilds:
if (Session.Assembly != null && Session.Assembly.CameraImageRenderer.OnSome)
{
Session.Assembly.CameraImageRenderer.Value.enabled = false;
}
Beachten Sie, dass zunachst gepruft werden muss, ob ARAssembly.CameraImageRenderer vorhanden ist.
Anmerkung
Nur in einer Session, deren Bildausgabe von EasyAR gezeichnet wird, kann das Bild auf diese Weise gestoppt werden. In der Regel ist das bei AR Foundation oder Headsets ungultig, und Sie mussen die entsprechenden Funktionen uber die jeweiligen Drittanbieter-Bibliotheken umsetzen.
Nachdem das Zeichnen des physischen Kamerabilds gestoppt wurde, kann die Anwendung uber InputFrame die Bilddaten der physischen Kamera abrufen und diese fur ein eigenes Rendering verwenden.
Transform-Aktualisierungen abrufen
Mit dem Ereignis PostSessionUpdate konnen Sie die Transform-Daten der Objekte in der Szene nach jeder Frame-Aktualisierung der Session abrufen.
Anmerkung
Bei einigen Funktionen, zum Beispiel Mega, lauft die AR-Berechnung auch dann pro Render-Frame weiter, wenn sich das Bild nicht verandert und keine sichtbare Serveraktualisierung angefordert wird. Wenn Sie also alle Transform-Anderungen abrufen mochten, mussen Sie die Transform-Daten pro Frame abrufen und durfen sie nicht nur in einigen Frames lesen.
Den Transform der virtuellen Kamera abrufen
Mit ARAssembly.Camera konnen Sie den Transform der Kamera in der Szene abrufen.
Session.PostSessionUpdate += () =>
{
var position = Session.Assembly.Camera.transform.position;
var rotation = Session.Assembly.Camera.transform.rotation;
};
Den Transform eines Targets abrufen
Sie konnen den Transform eines konkreten Target-Objekts in der Szene uber das verwendete Target selbst abrufen. Bei Image Tracking ist dieses Target zum Beispiel das Objekt, auf dem die Komponente ImageTargetController sitzt.
Session.PostSessionUpdate += () =>
{
var position = target.transform.position;
var rotation = target.transform.rotation;
};
[Optional] Pose abrufen
Pose ist eine Datenstruktur zur Beschreibung von Position und Ausrichtung eines Objekts und besteht normalerweise aus position und rotation. In AR-Anwendungen beschreibt Pose gewohnlich die Position und Ausrichtung der physischen Kamera oder eines Tracking-Ziels relativ zu einem Referenzsystem.
Unity stellt keine rohen Pose-Daten bereit, weil Pose normalerweise zur Steuerung der Objektbewegung in der Szene dient, und genau das erledigt die Session automatisch. Fur Berechnungen und Rendering von Inhalten reicht ein Transform normalerweise aus.
Wichtig
Bevor Sie die folgenden Methoden lesen, prufen Sie bitte noch einmal, ob die Transform-Daten von Kamera, Tracking-Ziel und anderen Objekten in der Szene nicht bereits ausreichen. In den meisten Fallen sind zusatzliche Pose-Daten nicht notwendig.
Wenn Pose aus irgendeinem Grund wirklich benotigt wird, kann sie im Ereignis PostSessionUpdate uber Transform-Berechnungen ermittelt werden. In der Regel ist die relative Transformation zwischen Target und Kamera, die in PostSessionUpdate ermittelt wird, bereits die Pose.
Der folgende Code zeigt, wie Kamera- und Target-Transform abgerufen und die relative Pose zwischen ihnen berechnet werden:
Session.PostSessionUpdate += () =>
{
Pose cameraToWorld = new(Session.Assembly.Camera.transform.position, Session.Assembly.Camera.transform.rotation);
Pose targetToWorld = new(target.transform.position, target.transform.rotation);
Pose worldToTarget = new()
{
position = Quaternion.Inverse(targetToWorld.rotation) * (-targetToWorld.position),
rotation = Quaternion.Inverse(targetToWorld.rotation)
};
Pose cameraToTarget = cameraToWorld.GetTransformedBy(worldToTarget);
};
Vorsicht
Wenn Sie gleichzeitig AR Foundation, Headsets oder andere Drittanbieter-Bibliotheken verwenden, konnen auch diese den Transform der Kamera in der Szene andern. Sie mussen sicherstellen, dass die Aktualisierungslogik dieser Bibliotheken abgeschlossen ist, bevor Sie die Pose berechnen, sonst kann das Ergebnis falsch sein. In solchen Szenarien ist die relative Pose zwischen Target und Origin in PostSessionUpdate weiterhin korrekt.
[Optional] Transform-Aktualisierungen abfangen
Wenn AR-Funktionen laufen, werden die Transforms von Kamera, Tracking-Zielen und anderen Objekten in Unity normalerweise automatisch von der Session aktualisiert. Diese Aktualisierungen sichern die Korrektheit und Konsistenz des AR-Renderings, daher gibt es keine direkte Moglichkeit, sie abzufangen.
Wenn Sie jedoch eine eigene Transform-Aktualisierungslogik fur Objekte benotigen, konnen Sie dies uber das Lauschen auf das Ereignis PostSessionUpdate erreichen. Dafur ist ein etwas umstandlicherer Ansatz notig:
- Gewohnlich sollten Renderinhalte als Kindobjekte oder angehangte Komponenten unter den von der Session gesteuerten Objekten platziert werden. Wenn Sie aber die Transform-Aktualisierung eines Objekts selbst steuern mochten, mussen Sie dieses Objekt aus der von der Session gesteuerten Hierarchie entfernen. Mit anderen Worten: Das Objekt darf kein Kind eines von der Session gesteuerten Objekts sein.
- Im Ereignis PostSessionUpdate merken Sie sich den Transform der Objekte, die Sie selbst aktualisieren mochten.
- Schließlich aktualisieren Sie im Ereignis PostSessionUpdate die Transforms dieser Objekte mit Ihrer eigenen Logik auf Grundlage der von der Session bereitgestellten Daten.
Anmerkung
Das Ereignis PostSessionUpdate ist erforderlich, weil die Session die Objekte in der Szene erst nach diesem Zeitpunkt nicht mehr verandert.
Beachten Sie, dass diese Methode nicht zur Anpassung der Kamera verwendet werden kann. Dafur ist eine kompliziertere Logik notwendig.
Außerdem kann diese Methode nur zur eigenen Aktualisierung von Objekt-Transforms verwendet werden, nicht zur Anderung von Transforms von Objekten, die von der Session gesteuert werden. Wenn ein von der Session gesteuertes Objekt extern verandert wird, uberschreibt die Session diese Anderungen im nachsten Frame wieder, was die Korrektheit mancher Berechnungen beeinflussen kann.
Vorsicht
Bei Verwendung dieser Methode mussen Sie die Korrektheit der Objekt-Transforms selbst sicherstellen, sonst kann es zu AR-Renderingfehlern kommen.
Wenn Sie gleichzeitig AR Foundation, Headsets oder andere Drittanbieter-Bibliotheken verwenden, konnen auch diese die Transforms in der Szene andern. Sie mussen sicherstellen, dass die Aktualisierungslogik dieser Bibliotheken und Ihre eigene Logik nicht in Konflikt geraten, sonst kann es zu unvorhersehbaren Ergebnissen kommen.
Verwandte Themen
- Zentrum-Modus schrankt ein, welche Objekt-Transforms die Session steuert
- Einfuhrung in die grundlegenden AR-Komponenten