var trackerNode:SCNNode! var gameHasStarted = false var foundSurface = false var gamePos = SCNVector3(0.0, 0.0, 0.0) func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) { guard !gameHasStarted else { return } guard let hitTest = sceneView.hitTest(CGPoint(x: view.frame.midX, y: view.frame.midY), types: [.existingPlane, .featurePoint, .estimatedHorizontalPlane]).last else { return } let trans = SCNMatrix4(hitTest.worldTransform) gamePos = SCNVector3Make(trans.m41, trans.m42, trans.m43) if !foundSurface { let trackerPlane = SCNPlane(width: 0.3, height: 0.3) trackerPlane.firstMaterial?.diffuse.contents = #imageLiteral(resourceName: "surface.png") trackerNode = SCNNode(geometry: trackerPlane) trackerNode.eulerAngles.x = .pi * -0.5 sceneView.scene.rootNode.addChildNode(trackerNode) } trackerNode.position = gamePos foundSurface = true }