SwiftUI AR Quick Look

SwiftUI 调用 AR Quick Look 打开AR模型
1.您应该通过Xcode重写。
2.swift playground 打开,需要上传到 test flight 才能正常使用。
第一部分


第二部分
代码1


import SwiftUI
@main
struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

代码2


import SwiftUI
struct ContentView: View {
    @State var ARshow = false
    var body: some View {
        ARShow(ARImage: "tutorial", ARText1: "1.1", ARText2: "tutorial", ARName: "tutorial", ARshow: ARshow)
        //你只需要一行代码即可打开AR模型
        //You only need one line of code to open the AR model
        //ARShow(
    }
}

代码3


import SwiftUI
import QuickLook
import ARKit
struct QLModel: UIViewControllerRepresentable {
    var name: String
    var allowScaling: Bool = true
    func makeCoordinator() -> QLModel.Coordinator {
        Coordinator(self)
    }
    func makeUIViewController(context: Context) -> QLPreviewController {
        let controller = QLPreviewController()
        controller.dataSource = context.coordinator
        return controller
    }
    func updateUIViewController(_ controller: QLPreviewController, context: Context) { }
    class Coordinator: NSObject, QLPreviewControllerDataSource {
        let parent: QLModel
        private lazy var fileURL: URL = Bundle.main.url(forResource: parent.name, withExtension: "reality")!//usdz
        init(_ parent: QLModel) {
            self.parent = parent
            super.init()
        }
        func numberOfPreviewItems(in controller: QLPreviewController) -> Int { return 1 }
        func previewController(_ controller: QLPreviewController, previewItemAt index: Int) -> QLPreviewItem {
            guard let fileURL = Bundle.main.url(forResource: parent.name, withExtension: "reality") else {
                fatalError("Unable to load \(parent.name).reality from main bundle")}//usdz
            let item = ARQuickLookPreviewItem(fileAt: fileURL)
            item.allowsContentScaling = parent.allowScaling
            return item
        }
    }
}
struct ARShow: View {
    @Environment(\.colorScheme) var colorScheme//暗黑模式
    var ARImage: String
    var ARText1: String
    var ARText2: String
    var ARName: String
    @State var ARshow = false
    func simpleSuccess() {UINotificationFeedbackGenerator().notificationOccurred(.success)}
    var body: some View {
        HStack{
            Button(action: {self.ARshow.toggle()}){
                Image(ARImage)
                    .resizable()
                    .aspectRatio(contentMode: .fit)
                    .frame(width: 80, height: 80)
                    .background(Color.gray.opacity(0.1))
                    .cornerRadius(10, antialiased: true)
                Text(ARText1)
                    .foregroundColor(.orange)
                Text(ARText2)
                    .multilineTextAlignment(.leading)
                    .foregroundColor(colorScheme == .light ? .black : .white)
            }
            .fullScreenCover(isPresented: $ARshow){
                ZStack{
                    QLModel(name: ARName).edgesIgnoringSafeArea(.all)
                    VStack{
                        Button(action: {self.ARshow.toggle(); simpleSuccess()}, label: {
                            HStack{
                                Image(systemName: "chevron.backward.circle")
                                    .font(.title3)
                                Spacer()
                                
                            }
                        })
                        .padding()
                        Spacer()
                    }
                }
            }
            Spacer()
        }
    }
}
3 个赞

GitHub:GitHub - S-way520/SwiftUI-AR-Quick-Look: This is a way to open a .usdz or .reality file, where you only need one line of code to open the AR model.

1 个赞

我还以为是Playgrounds可以直接和reality composer联动了,看着模型好像reality composer做的

如您所说。是reality composer制作,导出reality,再加载。

无法运行,可以问我或加我好友哈。我教一位同学时发现这个教程对新手不太友好,我也让他帮忙写教程了。它写好后,我会留下他的教程的链接。

感谢你之前在群里发的RealityKit的pdf教程,我跟着它学习了Reality Kit的使用,对我十分有帮助 让我能够快速入门Reality和SwiftUI的结合;
看完你现在这个贴子后我想询问一下我可以用代码直接写Reality Composer中的触发事件嘛?就是我的意思是我想通过不同的手势控制模型播放不同的动画(这个动画不是简单的移动、旋转,而是我通过Blender去制作的动画) 现在我不知道该如何去实现它,想请求你帮助

我不知道您要达到什么效果,代码可以直接控制usdz模型,而且实现起来很方便。我更新了博客,希望能向您确认“代码可以影响usdz”模型。