Enhance ARKit with RoomPlan object detection

RoomObjectReplicator

As Apple states, RoomPlan allows one to create a 3D model of a room. But what if we ignored room reconstruction and instead enhanced ARKit by piggy-backing off RoomPlan‘s underlying object recognition technology. Specifically, for each CapturedRoom.Object we can add a custom ARAnchor subclass instance.

The RoomObjectReplicator class does exactly that, creating and updating an RoomObjectAnchor for each object in the captured room. Once you have a replicator instantiated, anchor the objects in the capture session delegate methods:

func captureSession(_ session: RoomCaptureSession, didAdd room: CapturedRoom) {
    replicator.anchor(objects: room.objects, in: session)
}

func captureSession(_ session: RoomCaptureSession, didChange room: CapturedRoom) {
    replicator.anchor(objects: room.objects, in: session)
}

func captureSession(_ session: RoomCaptureSession, didUpdate room: CapturedRoom) {
    replicator.anchor(objects: room.objects, in: session)
}

func captureSession(_ session: RoomCaptureSession, didRemove room: CapturedRoom) {
    replicator.anchor(objects: room.objects, in: session)
}

Mirroring room object as anchors allows us to easily integrate other Frameworks such as RealityKit. The RoomObjectEntity is a custom RealityKit entity that will anchor to RoomObjectAnchors. The RoomObjectSystem will then resize a box model to match the room object’s dimensions.

func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
    view.scene.addRoomObjectEntities(for: anchors)
}

func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
    view.scene.updateRoomObjectEntities(for: anchors)
}

GitHub

View Github