Wie transformiert man das Koordinatensystem des Vision-Frameworks in ARKit?

8

Ich verwende ARKit (mit SceneKit), um das virtuelle Objekt (z. B. Ball) hinzuzufügen. Ich verfolge reale Objekte (z. B. Fuß), indem ich das Vision-Framework verwende und die aktualisierte Position in der Handlermethode für die Bearbeitung von Bildanforderungen erhalte.

%Vor%

Ich möchte das verfolgte reale Weltobjekt durch virtual ersetzen (zum Beispiel Foot mit Cube ersetzen), aber ich bin nicht sicher, wie man die BoundingBox rect (die wir bei der Vision-Request-Vervollständigung erhalten) in den Scene-Kit-Knoten als Koordinatensystem umsetzt anders.

unten ist der Beendigungshandler für die Verarbeitung von Codeanforderungen:

%Vor%

Bitte leiten Sie mich zur Übertragung des Koordinatensystems.

    
Abhijeet Banarase 06.07.2017, 09:12
quelle

2 Antworten

3

Die Hauptsache ist, dass das Begrenzungsrechteck im 2D-Bild ist, während die Szene für ARKit 3D ist. Dies bedeutet, dass bis zur Auswahl einer Tiefe nicht definiert ist, wo sich das umgebende Rechteck in 3D befindet.

Was Sie tun sollten, ist einen Hit-Test gegen die Szene durchzuführen, um von 2D-Koordinaten zu 3D zu gelangen:

%Vor%     
Christopher Oezbek 23.07.2017, 09:05
quelle
5

Angenommen, das Rechteck befindet sich auf einer horizontalen Ebene, können Sie einen Treffertest für die Szene an allen 4 Ecken durchführen und 3 dieser Ecken verwenden, um die Breite, Höhe, Mitte und Ausrichtung des Rechtecks ​​zu berechnen.

Ich habe eine Demo-App auf GitHub, die genau das tut: Ссылка

Die Koordinaten für die Ecken des Rechtecks ​​von VNRectangleObservation sind relativ zur Größe des Bildes und in verschiedenen Koordinaten abhängig von der Drehung des Telefons. Sie müssen sie mit der Ansichtsgröße multiplizieren und basierend auf der Drehung des Telefons invertieren:

%Vor%

Dann können Sie einen Treffertest an allen 4 Ecken durchführen. Es ist wichtig, beim Ausführen des Treffertests den Typ .existingPlaneUsingExtent zu verwenden, damit ARKit Treffer für horizontale Ebenen zurückgibt.

%Vor%

Dann wird es ein bisschen kompliziert ...

Da jeder Treffertest mit Ergebnissen von 0 bis n zurückgehen kann, müssen Sie alle Treffertests herausfiltern, die sich auf einer anderen Ebene befinden. Sie können dies tun, indem Sie die Anker für jedes ARHitTestResult vergleichen:

%Vor%

Außerdem benötigen Sie nur 3 von 4 Ecken, um die Abmessungen, die Position und die Ausrichtung des Rechtecks ​​zu identifizieren. Es ist also in Ordnung, wenn eine Ecke keine Treffer-Testergebnisse liefert. Sehen Sie sich hier an, wie ich das gemacht habe.

Sie können die Breite des Rechtecks ​​aus dem Abstand zwischen der linken und der rechten Ecke berechnen (entweder oben oder unten). Ebenso können Sie die Höhe des Rechtecks ​​aus der Entfernung zwischen dem oberen & amp; unteren Ecken (für links oder rechts).

%Vor%

Sie können seine Position berechnen, indem Sie den Mittelpunkt von den gegenüberliegenden Ecken des Rechtecks ​​(entweder topLeft & amp; bottomRight oder topRight & amp; bottomLeft) erhalten:

%Vor%

Sie können auch die Ausrichtung des Rechtecks ​​(Drehung entlang der y-Achse) von der linken und rechten Ecke (für oben oder unten) berechnen:

%Vor%

Dann fügen Sie alles zusammen und zeigen etwas in AR auf dem Rechteck überlagert. Hier ist ein Beispiel für das Anzeigen eines virtuellen Rechtecks ​​durch Unterklassen SCNNode :

%Vor%     
Mel 07.08.2017 03:46
quelle

Tags und Links