4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【visionOS】WorldTrackingProviderでApple Vision Proの位置と向きを取得する

Last updated at Posted at 2024-05-09

本記事ではApple Vision Proの位置と向きを取得する方法を紹介します。

デモ

画面収録 2024-05-09 13.23.00.gif

方法

ARKitSessionをWorldTrackingProviderで開始し、そのqueryDeviceAnchor(atTimestamp:)メソッドを呼び出すことで、DeviceAnchorを作成します。
DeviceAnchorにはApple Vision Proのデバイスの位置と向きの情報が含まれています。
originFromAnchorTransformを使用することで、デバイスから見た空間における平面の位置と方向を取得することができます。

実装

ImmersiveViewModel

@MainActor
final class ImmersiveViewModel: ObservableObject {

    let session = ARKitSession()
    let worldInfo = WorldTrackingProvider()

    func run() async {
        do {
            try await session.run([worldInfo])
            await handleAnchorUpdates()
        } catch {
            assertionFailure("Failed to run session: \(error)")
        }
    }

    func handleAnchorUpdates() async {
        for await update in worldInfo.anchorUpdates {
            switch update.event {
            case .added, .updated:
                print("Anchor position updated.")
            case .removed:
                print("Anchor position now unknown.")
            }
        }
    }
    
    func getTransform() async -> simd_float4x4? {
        if let anchor = worldInfo.queryDeviceAnchor(atTimestamp: CACurrentMediaTime()) {
            return anchor.originFromAnchorTransform
        }
        return nil
    }
}

WorldTracking用に設定されたARKitSessionを使用し、DeviceAnchorのUpdate情報の受信を開始します。

ImmersiveView

struct ImmersiveView: View {
    @StateObject var vm: ImmersiveViewModel = ImmersiveViewModel()
    @State var timer = Timer.publish(every: 0.02, on: .main, in: .common).autoconnect()
    
    var body: some View {
        RealityView { content in
            // Add the initial RealityKit content
            if let scene = try? await Entity(named: "Immersive", in: realityKitContentBundle) {
                content.add(scene)
            }
        }
        .task() {
            await vm.run()
        }
        .onReceive(timer) { _ in
            Task {
                let transform = await vm.getTransform()
                let position = SIMD3<Float>(transform!.columns.3.x, transform!.columns.3.y, transform!.columns.3.z)
                print("x: \(position.x), y: \(position.y), z: \(position.z)")
            }
        }
    }
}

Apple Vision Proデバイスの位置と向きが0.02秒ごとに取得され、コンソールに表示されます。これにより、ARコンテンツをデバイスの動きに合わせて更新することが可能になります。

(※技適特例届け出済み)

参考資料

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?