import MetalKit import ARKit extension MTKView : RenderDestinationProvider {} class ViewController: UIViewController, MTKViewDelegate, ARSessionDelegate { var session: ARSession! var renderer: Renderer! override func viewDidLoad() { super.viewDidLoad() session = ARSession() session.delegate = self if let view = self.view as? MTKView { view.device = MTLCreateSystemDefaultDevice() view.delegate = self renderer = Renderer(session: session, metalDevice: view.device!, renderDestination: view) renderer.drawRectResized(size: view.bounds.size) } let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.handleTap(gestureRecognize:))) view.addGestureRecognizer(tapGesture) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) let configuration = ARWorldTrackingConfiguration() configuration.planeDetection = .horizontal session.run(configuration) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) session.pause() } @objc func handleTap(gestureRecognize: UITapGestureRecognizer) { if let currentFrame = session.currentFrame { var translation = matrix_identity_float4x4 translation.columns.3.z = -0.2 let transform = simd_mul(currentFrame.camera.transform, translation) let anchor = ARAnchor(transform: transform) session.add(anchor: anchor) } } func mtkView(_ view: MTKView, drawableSizeWillChange size: CGSize) { renderer.drawRectResized(size: size) } func draw(in view: MTKView) { renderer.update() } func session(_ session: ARSession, didAdd anchors: [ARAnchor]) { print(anchors) } func session(_ session: ARSession, didFailWithError error: Error) {} func sessionWasInterrupted(_ session: ARSession) {} func sessionInterruptionEnded(_ session: ARSession) {} }