2017-09-18 7 views
0

Mit ARKit/Scenekit, ich suche ein 2D-Bild auf einer Ebene Knoten in eine Szene, aber ich möchte diesen Knoten kontinuierlich auf den Benutzer/Kamera zentrieren.ARKit - Center SCNode auf Kamera

Hier ist meine Funktion zum Hinzufügen des Knotens an der ursprünglichen 0,0,0 Position.

let plane = SCNPlane(width: 20, height: 20) 
let material = SCNMaterial() 
material.isDoubleSided = true 
material.diffuse.contents = UIImage(named: "CompassRose.png") 
plane.materials = [material] 

NodeCompass = SCNNode(geometry: plane) 
NodeCompass.position = SCNVector3Make(0,0,0) 

skScene.rootNode.addChildNode(NodeCompass) 

Der Trick besteht darin, die Position dieses Knotens zu ändern, wenn sich der Benutzerstandort ändert. Wie wird das gemacht?

Antwort

2

Um Ihren Knoten immer in der Mitte der Ansicht zu halten, müssen Sie die Mittelposition der Weltposition berechnen.

extension ARSCNView { 
    // create real world position of the point 
    func realWorldPosition(for point: CGPoint) -> SCNVector3? { 
     let result = self.hitTest(point, types: [.featurePoint]) 
     guard let hitResult = result.last else { return nil } 
     let hitTransform = SCNMatrix4(hitResult.worldTransform) 

     // m4x -> position ;; 1: x, 2: y, 3: z 
     let hitVector = SCNVector3Make(hitTransform.m41, hitTransform.m42, hitTransform.m43) 

     return hitVector 
    } 
} 

// MARK: - ARSCNViewDelegate 
func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) { 
    DispatchQueue.main.async { 
     let center = self.view.center 
     guard let realWorldPosition = self.sceneView.realWorldPosition(for: center) else { return } 
     self.NodeCompass.position = realWorldPosition 
    } 
} 
+0

funktioniert gut. Vielen Dank. – Villainsoft