Merhaba arkadaşlar, bu yazımızda Swift ARKit ile nasıl çizim işlemleri yapılır bundan bahsedeceğiz. Bir önceki yazıma buradan ulaşabilirsiniz.
Bir proje oluşturup, daha önceki yazılarımızda yaptığımız işlemleri yapmamız gerekiyor Tasarım kısmında SceneKit ekledikten sonra çizime başlamak için bir buton koyalım ve kullanıcı bu butona bastıktan sonra çizme işlemleri başlasın. Tasarımla işimiz bittikten sonra burayı ViewController’a bağlamamız gerekiyor.
Sonrasında ise ARKit sahnesi her render olduğunda burada işlem yapmamız gerekiyor. Bu render olduğunda yakalayabilmemiz için delegesini bağlamalıyız. Been bunu bir Extension ile sağlıyorum. Ardından ekranın orta noktasının koordinatlarını almam gerekiyor. Bu bilgileri de elde ettikten sonra kullanıcı butona basıyorsa ekrana her render ettiğinde bir nokta koyacağım. Eğer butona basmıyorsa ekranın orta noktasını kullanıcıya göstermek için pembe bir pointer koyacağım. Kullanıcı butona bastığında bu pointer kaybolup çizim başlayacak.
// // ViewController.swift // arkit-drawing // // Created by Omer Sezer on 9.07.2021. // import UIKit import ARKit class ViewController: UIViewController { @IBOutlet weak var sceneView: ARSCNView! @IBOutlet weak var btnDraw: UIButton! let configuration = ARWorldTrackingConfiguration() override func viewDidLoad() { super.viewDidLoad() setUI() } func setUI() { // MARK: sceneView sceneView.debugOptions = [.showWorldOrigin, .showFeaturePoints] sceneView.showsStatistics = true sceneView.delegate = self sceneView.session.run(configuration) } } extension ViewController: ARSCNViewDelegate { func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval) { guard let pointOfView = sceneView.pointOfView else { return } let transform = pointOfView.transform let orientation = SCNVector3(-transform.m31, -transform.m32, -transform.m33) let location = SCNVector3(transform.m41, transform.m42, transform.m43) let currentPositionOfCamera = orientation + location DispatchQueue.main.async { if self.btnDraw.isHighlighted { let nodeSphere = SCNNode(geometry: SCNSphere(radius: 0.02)) nodeSphere.position = currentPositionOfCamera self.sceneView.scene.rootNode.addChildNode(nodeSphere) nodeSphere.geometry?.firstMaterial?.diffuse.contents = UIColor.green } else { let pointer = SCNNode(geometry: SCNSphere(radius: 0.01)) pointer.name = "pointer" pointer.position = currentPositionOfCamera self.sceneView.scene.rootNode.enumerateChildNodes { node, _ in if node.name == "pointer" { node.removeFromParentNode() } } self.sceneView.scene.rootNode.addChildNode(pointer) pointer.geometry?.firstMaterial?.diffuse.contents = UIColor.systemPink } } } } func +(left: SCNVector3, right: SCNVector3) -> SCNVector3 { return SCNVector3(x: left.x + right.x, y: left.y + right.y, z: left.z + right.z) }
Projenin ekran çıktısı aşağıdaki gibidir.
Projeye buradan ulaşabilirsiniz. Sorularınız olursa mail veya yorum atarak ulaşabilirsiniz. İyi çalışmalar.
Bir yanıt yazın