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 ↗Code shown on screen · 7 snippets
RoomCaptureView API - Scan & Process
// 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
// 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
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
// 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
// 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
// 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
// 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
Related sessions
-
23 min -
13 min -
22 min -
1 min