2017-09-19 4 views
2

Ich arbeite an der Erstellung von Anmerkungen mit overlaySKScene etwas ähnliches (https://sketchfab.com/models/1144d7be20434e8387a2f0e311eca9b1#). Ich folgte https://github.com/halmueller/ImmersiveInterfaces/tree/master/Tracking%20Overlay, um das Overlay zu erstellen.Wie man Anmerkungen für 3D-Objekt mit Scenekit dynamisch erstellt - ARKit in iOS 11?

Aber in dem bereitgestellten Beispiel erstellen sie nur eine Anmerkung und es ist statisch. Ich möchte mehrere Annotationen dynamisch erstellen, basierend auf der Anzahl der untergeordneten Knoten, die wir haben, und auch in der Lage sein, die Annotation über dem jeweiligen Kindknoten zu positionieren. Wie erreiche ich das?

Ich bin Overlay Hinzufügen wie unten,

sceneView.overlaySKScene = InformationOverlayScene(size: sceneView.frame.size) 

wo InformationOverlayScene ist die SKScene, in dem ich zwei childnodes hinzugefügt haben, eine Anmerkung zu erstellen.

+0

cooles Projekt .. Ich wünschte, ich könnte einige helfen, aber nicht Scenekit/Arkit noch .. – Fluidity

Antwort

1

Erstellen Sie ein Array mit den Annotation-Sprites, die auf die childnodes Array zugeordnet ist, und dann etwas tun, wie folgt aus:

func renderer(_ aRenderer: SCNSceneRenderer, updateAtTime time: TimeInterval) { 

    let scnView = self.view as! SCNView 
    //for each character 
    for var i in 0...inBattleChars.count-1 { 
     let healthbarpos = scnView.projectPoint(inBattleChars[i].position) 

     battleSKO.healthbars[i].position = CGPoint(x: CGFloat(healthbarpos.x), y: (scnView.bounds.size.height-10)-CGFloat(healthbarpos.y)) 
    } 
} 

Vor jedem Frame gerendert wird diese aktualisiert die Position eines SKSprite (in Gesundheitsleisten) für jeden SCNNode in inBattleChars. Der Hauptteil ist, wo projectPoint verwendet wird, um die 2D-Position der SK-Überlagerungsszene basierend auf dem SCNNode in der 3D-Szene zu erhalten.

Um zu verhindern, dass die Anmerkungen von nicht sichtbaren Knoten angezeigt werden (z. B. untergeordnete Knoten auf der Rückseite des übergeordneten Objekts), verwenden Sie die Methode nodesInsideFrustum (of :) des SCNRenderer.

+0

@ Xartec Ich habe genau das gleiche gemacht. Jetzt kann ich das Overlay aber an zwei verschiedenen Positionen sehen. Wenn ich die Kamerasitzung öffne, zeigt es die Überlagerung mit 3D-Objekt korrekt an, aber wenn ich die Kamera um 180 Grad bewege, könnte ich dieselbe Überlagerung an einer anderen Position wieder sehen. Es ist nur an 2 Stellen und nicht irgendwo anders sichtbar. Wie konnte das passieren? – yaali

+0

Das hat funktioniert. Aber da wir die Position des Overlays in der updateAtTime-Methode ändern, scheint das Overlay immer wackelig zu sein und sieht nicht stabil aus. Gibt es eine Möglichkeit, die Position von Overlay-Child-Objekten nur bei einigen bemerkenswerten Kamerabewegungen oder 3D-Modellbewegungen zu aktualisieren? – yaali

1

Sie können eine SKScene oder eine CALayer als material property hinzufügen.

Sie könnten eine SCNPlane mit einer bestimmten Breite und Höhe erstellen und eine SpriteKit-Szene als Material hinzufügen. Sie können ein Beispiel here finden.

Dann positionieren Sie einfach die Ebene, wo Sie es haben möchten und erstellen und löschen Sie die Anmerkungen, wie Sie sie brauchen.

+0

Ich möchte diese Art von Textfeld für viele Kindknoten dynamisch hinzufügen. Außerdem möchte ich, dass sich das wie eine Anmerkung verhält. Auch wenn ich die Größe des 3D-Objekts ändere oder sich von ihm wegbewege, sollten die Anmerkungen immer noch die gleiche Größe haben. Bitte beziehen Sie sich auf https://sketchfab.com/models/1144d7be20434e8387a2f0e311eca9b1#. Mit dieser Methode kann ich so etwas erreichen? – yaali

+0

Nein, das erstellt Anmerkungen, die eine feste Position im Raum haben, und skaliert entsprechend. – orangenkopf

Verwandte Themen