Dunfey · Hotel WWDC as data, est. 1983
Front desk everything
Years
Topics

2022 Photos & CameraSpatial Computing

WWDC22 · 16 min · Photos & Camera / Spatial Computing

Create parametric 3D room scans with RoomPlan

RoomPlan can help your app quickly create simplified parametric 3D scans of a room. Learn how you can use this API to easily add a room scanning experience. We’ll show you how to adopt this API, explore the 3D parametric output, and share best practices to help your app get great results with every scan.

Watch at developer.apple.com ↗

Transcript all transcripts

Code shown on screen · 7 snippets

RoomCaptureView API - Scan & Process swift · at 4:36 ↗
// RoomCaptureView API - Scan & Process

import UIKit
import RoomPlan

class RoomCaptureViewController: UIViewController {

    var roomCaptureView: RoomCaptureView
    var captureSessionConfig: RoomCaptureSession.Configuration

   private func startSession() {
        roomCaptureView?.captureSession.run(configuration: captureSessionConfig)
     }
    
    private func stopSession() {
        roomCaptureView?.captureSession.stop()
	}
}
RoomCaptureView API - Export swift · at 5:00 ↗
// RoomCaptureView API - Export

import UIKit
import RoomPlan

class RoomCaptureViewController: UIViewController {
  
  func captureView(shouldPresent roomDataForProcessing: CapturedRoomData, error: Error?) -> Bool {
    // Optionally opt out of post processed scan results.
    return false
  }

  func captureView(didPresent processedResult: CapturedRoom, error: Error?) {
    // Handle final, post processed results and optional error.
    // Export processedResults
    
    try processedResult.export(to: destinationURL)
    
  }
}
RoomCaptureSession - setup previewVisualizer swift · at 6:50 ↗
import UIKit
import RealityKit
import RoomPlan
import ARKit

class ViewController: UIViewController {
    @IBOutlet weak var arView: ARView!
    var previewVisualizer: Visualizer!
    lazy var captureSession: RoomCaptureSession = {
        let captureSession = RoomCaptureSession()
        arView.session = captureSession.arSession
        return captureSession
    }()
    override func viewDidLoad() {
        super.viewDidLoad()
        captureSession.delegate = self
        // set up previewVisualizer
    }
}
RoomCaptureSession - live results and user instructions swift · at 7:40 ↗
// Getting live results and user instructions

extension ViewController: RoomCaptureSessionDelegate {

    func captureSession(_ session: RoomCaptureSession,
                        didUpdate room: CapturedRoom) {
        previewVisualizer.update(model: room)
    }
    
    func captureSession(_ session: RoomCaptureSession,
                   didProvide instruction: Instruction) {
        previewVisualizer.provide(instruction)
    }
}
Setup RoomBuilder swift · at 9:12 ↗
// RoomBuilder
import UIKit
import RealityKit
import RoomPlan
import ARKit

class ViewController: UIViewController {
    
    @IBOutlet weak var arView: ARView!
    var previewVisualizer: Visualizer!

    // set up RoomBuilder
    var roomBuilder = RoomBuilder(options: [.beautifyObjects])
}
RoomBuilder - generate final 3D CapturedRoom swift · at 9:30 ↗
// RoomBuilder with the latest CapturedRoomData to generate final 3D CapturedRoom

extension ViewController: RoomCaptureSessionDelegate
{
    func captureSession(_ session: RoomCaptureSession, 
                        didEndWith data: CapturedRoomData, error: Error?)
    {
        if let error = error {
            print("Error: \(error)")
        }
        Task {
            let finalRoom = try! await roomBuilder.capturedRoom(from: data)
            previewVisualizer.update(model: finalRoom)
        }
    }
}
CapturedRoom and export swift · at 11:20 ↗
// CapturedRoom and export

public struct CapturedRoom: Codable, Sendable
{
    public let walls: [Surface]
    public let doors: [Surface]
    public let windows: [Surface]
    public let openings: [Surface]
    public let objects: [Object]

    public func export(to url: URL) throws

    // Surface definitions ...
    
    // Object definitions ...
}

Resources