我在使用 RealityView 显示两个 AR 屏幕时遇到问题,虽然我确实成功地将其制作为非 AR,但现在我的代码无法正常工作。
它也可以使用 Storyboard 和 Swift 与 SceneKit 一起工作,那么为什么它不能在 RealityView 中工作?
目标是在 iPhone 上的增强现实中看到两侧的立方体,以制作 AR/VR 视图或 XR 视图,以便与 VR Box 一起使用,使用 SceneKit 与 Swift 非常成功,但现在它只显示左侧在 AR 中,右侧不动并且有点小。
这是我的代码:
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)
}
}
}
根据您的任务,您不仅可以在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)
}
}
}
}
}