如何使用 SwiftUI 让 AR 在 Stereo RealityView iOS 18 中工作

问题描述 投票:0回答:1

我在使用 RealityView 显示两个 AR 屏幕时遇到问题,虽然我确实成功地将其制作为非 AR,但现在我的代码无法正常工作。

它也可以使用 Storyboard 和 Swift 与 SceneKit 一起工作,那么为什么它不能在 RealityView 中工作?

目标是在 iPhone 上的增强现实中看到两侧的立方体,以制作 AR/VR 视图或 XR 视图,以便与 VR Box 一起使用,使用 SceneKit 与 Swift 非常成功,但现在它只显示左侧在 AR 中,右侧不动并且有点小。

enter image description here

这是我的代码:

import SwiftUI
import RealityKit


struct ContentView : View {
    var body: some View {
        HStack (spacing: 0){
            MainView()
            MainView()
        }
        .background(.black)
    }
}

struct MainView : View {
    @State var anchor = AnchorEntity()

    var body: some View {
        RealityView { content in
            let item = ModelEntity(mesh: .generateBox(size:     0.2), materials: [SimpleMaterial()])

            content.camera = .spatialTracking
            anchor.addChild(item)
            anchor.position = [0.0, 0.0, -1.0]
            anchor.orientation = .init(angle: .pi/4,    axis:[0,1,1])

            // Add the horizontal plane anchor to the scene
            content.add(anchor)
        }
    }
}
swiftui augmented-reality virtual-reality google-cardboard realityview
1个回答
0
投票

根据您的任务,您不仅可以在VR模式下使用iOS 18的全新

RealityView
,还可以在AR模式下使用。您所需要做的就是为每个
AnchorEntity
提供一个
.camera
案例。然而,这里有一个小麻烦等待着您:在右视图中,立方体基元将比左视图中更靠近相机。不知道这是不是一个bug...

import SwiftUI
import RealityKit

struct Controller : View {
    @State var position: UnitPoint = .zero
    @Binding var pose: SIMD3<Float>
    let anchor: AnchorEntity
    
    var dragGesture: some Gesture {
        DragGesture(minimumDistance: 15, coordinateSpace: .global)
            .onChanged {
                anchor.position.x = Float($0.translation.width +
                                             position.x) * 0.005
                anchor.position.y = Float($0.translation.height +
                                             position.y) * -0.005
                pose = anchor.position
            }
            .onEnded {
                position.x += $0.translation.width
                position.y += $0.translation.height
            }
    }
    var body: some View {
        RealityView { rvc in
            rvc.camera = .spatialTracking
            let box = ModelEntity(mesh: .generateBox(size: 0.25))
            anchor.addChild(box)
            rvc.add(anchor)
            
            anchor.position.z = -1.0
            anchor.orientation = .init(angle: .pi/4, axis:[0,1,1])
        }
        .gesture(dragGesture)
    }
}

struct ContentView : View {
    @State var pose: SIMD3<Float> = .zero
    let anchor1 = AnchorEntity(.camera)
    let anchor2 = AnchorEntity(.camera)

    var body: some View {
        HStack {
            VStack {
                Text(anchor1.position.description)
                    .font(.subheadline)
                    .padding(20)
                Controller(pose: $pose, anchor: anchor1)
                    .onChange(of: pose) { (_, new) in
                        anchor2.position = SIMD3<Float>(new)
                    }
            }
            VStack {
                Text(anchor2.position.description)
                    .font(.subheadline)
                    .padding(20)
                Controller(pose: $pose, anchor: anchor2)
                    .onChange(of: pose) { (_, new) in
                        anchor1.position = SIMD3<Float>(new)
                    }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.