2017-09-12 4 views
0

Ich versuche, meinen Kopf um Apples ARKit API zu wickeln, und ich habe ihre example ARKitExample project auf GitHub geschoben. In diesem Demo/Beispielprojekt bewegen Sie Ihre Telefonkamera in Ihrer Umgebung und es erscheint , um flache Oberflächen automatisch zu erkennen und eine Reihe von "Fokusquadrate" über der Stelle zu platzieren, an der Ihre Kamera über dieser Oberfläche zentriert ist. Wenn Sie dann eine "+" UI-Schaltfläche drücken und aus einem von mehreren Objekten (Lampe, Becher, Vase usw.) auswählen, wird das virtuelle Objekt anstelle der Fokusquadrate gerendert. Sie können das alles in Aktion sehen right here das ist wahrscheinlich besser als ich versuche, es zu erklären!ARKit API von Beispiel

Ich versuche, den Platz im Code zu finden, wo das virtuelle Objekt tatsächlich aufgerufen und auf dem Bildschirm gerendert wird. Dies wäre nur, nachdem es ausgewählt ist, die ich denke stattfinden here:

@IBAction func chooseObject(_ button: UIButton) { 
    // Abort if we are about to load another object to avoid concurrent modifications of the scene. 
    if isLoadingObject { return } 

    textManager.cancelScheduledMessage(forType: .contentPlacement) 
    performSegue(withIdentifier: SegueIdentifier.showObjects.rawValue, sender: button) 
} 

Aber im Grunde wählt der Benutzer ein virtuelles Objekt und dann wird es gemacht, wo der Fokus Platz derzeit befindet - I Suchst du, wo das passiert, irgendwelche Ideen?

+1

Sie in der Nähe sind. Die 'performSegue'-Funktion sollte Ihnen sagen, dass die Aktion in einem anderen' ViewController' passiert ist, in diesem Fall 'ViewController + ObjectSelection.swift' und genauer gesagt' virtualObjectSelectionViewController (_: VirtualObjectSelectionViewController, didSelectObjectAt index: Int) '. – axelspark

+0

Danke @axelspark (+1) - so sieht es aus wie "virtualObjectManager.loadVirtualObject" ist, wo Objekte geladen werden zu einem bestimmten Ort auf dem Bildschirm dann? – smeeb

+0

wird es ja aber nicht zu einem bestimmten Ort auf dem Bildschirm des Geräts geladen. Der dritte Parameter dieser Funktion wandelt die "bildschirmlokale" Koordinate in eine "reale Welt-global" -Koordinate um, so dass Sie Ihre Kameraansicht "vom Bildschirm des Geräts" entfernen können, das Objekt jedoch immer noch an der gleichen Position bleibt, wenn Sie die Kamera bewegen zurück – axelspark

Antwort

1

Es fügt die virtualObject Instanz als Kind des Wurzelknotens des SCNScene (die eine Unterklasse von SCNNode ist):

func virtualObjectSelectionViewController(_: VirtualObjectSelectionViewController, didSelectObjectAt index: Int) { 
    guard let cameraTransform = session.currentFrame?.camera.transform else { 
     return 
    } 

    let definition = VirtualObjectManager.availableObjects[index] 
    let object = VirtualObject(definition: definition) 
    let position = focusSquare?.lastPosition ?? float3(0) 
    virtualObjectManager.loadVirtualObject(object, to: position, cameraTransform: cameraTransform) 
    if object.parent == nil { 
     serialQueue.async { 
      self.sceneView.scene.rootNode.addChildNode(object) 
     } 
    } 
} 
+0

Ah danke @leandrodemarco (+1) - so sieht es aus wie 'virtualObjectManager.loadVirtualObject' ist die ARKit-Funktion, die tatsächlich virtuelle Objekte an einen bestimmten Ort auf dem Bildschirm lädt? – smeeb

+1

Gern geschehen. In der Tat, wenn Sie beginnen, in diesem Anruf zu graben, werden Sie sehen, dass es die virtualObject (Knoten) -Position in der 'setNewVirtualObjectPosition'-Funktion setzt. Randnotiz, diese Eigenschaft ist mehr von SCNKit als ARKit richtig – leandrodemarco

+0

Ahh nochmals danke @leandrodemarco (+1 wieder), und es * klingt * wie SCNKit ist wie Apples OpenGL (Grafik-Lib), die als Grundlage ARKit fungiert? Danke noch einmal! – smeeb