You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 12:25:05