Apple Vision Pro图像追踪:替换球体为带onTapGesture的Model3D
图像追踪集成Model3D(带点击交互)完整实现
核心代码实现
import SwiftUI import RealityKit import ARKit class ImageTrackingModel: ObservableObject { var arView: ARView? let targetImageGroupName = "AR Resources" // 替换为你的图像资源组名 func setupARView() { let arView = ARView(frame: .zero) self.arView = arView // 配置图像追踪 guard let referenceImages = ARReferenceImage.referenceImages(inGroupNamed: targetImageGroupName, bundle: nil) else { fatalError("无法加载目标图像资源") } let configuration = ARImageTrackingConfiguration() configuration.trackingImages = referenceImages configuration.maximumNumberOfTrackedImages = 1 arView.session.run(configuration) arView.session.delegate = self } // 加载Model3D并添加交互 func loadModelAtAnchor(anchor: ARImageAnchor) { guard let arView = arView else { return } // 加载3D模型(替换为你的模型文件名) let modelEntity = try! Entity.load(named: "YourModelName") // 调整模型大小适配图像 let imageSize = anchor.referenceImage.physicalSize modelEntity.scale = SIMD3<Float>(imageSize.width, 0.1, imageSize.height) // 添加点击交互 let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleModelTap(_:))) arView.addGestureRecognizer(tapGesture) // 创建锚点实体并挂载模型 let anchorEntity = AnchorEntity(anchor: anchor) anchorEntity.addChild(modelEntity) arView.scene.addAnchor(anchorEntity) } @objc func handleModelTap(_ gesture: UITapGestureRecognizer) { guard let arView = arView else { return } let location = gesture.location(in: arView) // 检测点击的实体 let hitResults = arView.hitTest(location, types: .existingPlaneUsingExtent) if let hitEntity = hitResults.first?.entity { // 自定义点击逻辑示例 print("模型被点击!") hitEntity.move(to: SIMD3<Float>(1.2, 1.2, 1.2), relativeTo: hitEntity.parent, duration: 0.3) } } } extension ImageTrackingModel: ARSessionDelegate { func session(_ session: ARSession, didAdd anchors: [ARAnchor]) { for anchor in anchors { guard let imageAnchor = anchor as? ARImageAnchor else { continue } loadModelAtAnchor(anchor: imageAnchor) } } } struct ARViewContainer: UIViewRepresentable { @ObservedObject var model: ImageTrackingModel func makeUIView(context: Context) -> ARView { model.setupARView() return model.arView! } func updateUIView(_ uiView: ARView, context: Context) {} } struct ContentView: View { @StateObject private var trackingModel = ImageTrackingModel() var body: some View { ARViewContainer(model: trackingModel) .edgesIgnoringSafeArea(.all) } } #Preview { ContentView() }
关键配置与调整
- 图像资源:将目标图像添加到
AR Resources资源组(可自定义组名),并在Info.plist中添加NSCameraUsageDescription权限描述。 - 模型替换:将代码中的
YourModelName替换为你的3D模型文件名(支持.usdz/.reality格式)。 - 尺寸适配:根据目标图像的实际物理尺寸,调整
modelEntity.scale参数,确保模型与图像匹配。 - 交互扩展:在
handleModelTap方法中可添加自定义逻辑,比如弹窗、视图跳转、音效播放等。
内容的提问来源于stack exchange,提问作者kartbouni
相关产品推荐
相关产品推荐

