12/08/2018, 18:25

Draw line với ARKit

Overview ARKit Thực tế tăng cường (AR) mô tả trải nghiệm người dùng thêm các yếu tố 2D(ARSKView) hoặc 3D(ARSCNView) vào chế độ xem trực tiếp từ máy ảnh của thiết bị theo cách khiến các yếu tố đó xuất hiện để sống trong thế giới thực. ARKit kết hợp theo dõi chuyển động thiết bị, chụp cảnh quay ...

Overview ARKit

Thực tế tăng cường (AR) mô tả trải nghiệm người dùng thêm các yếu tố 2D(ARSKView) hoặc 3D(ARSCNView) vào chế độ xem trực tiếp từ máy ảnh của thiết bị theo cách khiến các yếu tố đó xuất hiện để sống trong thế giới thực. ARKit kết hợp theo dõi chuyển động thiết bị, chụp cảnh quay camera, xử lý cảnh nâng cao và tiện ích hiển thị để đơn giản hóa nhiệm vụ xây dựng trải nghiệm AR. Bạn có thể sử dụng các công nghệ này để tạo nhiều loại trải nghiệm AR bằng cách sử dụng camera sau hoặc camera trước của thiết bị iOS.

ARSCNView

Là view hiển thị AR(augmented reality) của camera bằng nội dung 3D.

ARSKView

Là view hiển thị AR(augmented reality) của camera bằng nội dung 2D.

ARWorldTrackingConfiguration

Cấu hình sử dụng máy ảnh mặt sau, theo dõi hướng và vị trí của thiết bị và phát hiện các bề mặt trong thế giới thực cũng như các hình ảnh hoặc đối tượng đã biết.

Draw với ARKit

Đầu tiên trong ViewController tạo ARSCNView

@IBOutlet var sceneView: ARSCNView!
@IBOutlet weak var drawButton: UIButton!

Trong viewDidLoad chúng ta set delegate cho ARSCNView

override func viewDidLoad() {
        super.viewDidLoad()

        // Set the view's delegate
        sceneView.delegate = self

        // Show statistics such as fps and timing information
        sceneView.showsStatistics = true
    }

Trong viewWillAppear tạo ARWorldTrackingConfiguration và run nó trong ARSCNView

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        // Create a session configuration
        let configuration = ARWorldTrackingConfiguration()

        // Run the view's session
        sceneView.session.run(configuration)
    }

Trong ARSCNViewDelegate draw line với geometry là SCNSphere

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 cameraPosition = orientation + location
        
        //Draw
        if self.drawButton.isHighlighted {
            let node = SCNNode(geometry: SCNSphere(radius: 0.03))
            node.geometry?.firstMaterial?.diffuse.contents = UIColor.purple
            node.position = cameraPosition
            self.sceneView.scene.rootNode.addChildNode(node)
        }

Kết quả

0