Press ESC to close

ARKit ile Çizim İşlemleri

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

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir