如何在 ARKit for VisionOS 中将网格实体放置在跟踪图像上

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

我尝试使用 ARKit for VisionOS 中的 ImageTrackingProvider 将网格球体放置在跟踪图像上。以下代码是我设置的图像跟踪视图模型,用于初始化 ARKit 会话并更新任何检测到的图像的锚点。当我在设备上运行它时,控制台会按预期打印出跟踪源结果,因此我可以确认跟踪是否正常工作。但是我无法让球体出现。是否有另一种更简单的方法来使用打印的原点变换作为 3d 对象的锚点?我当前的方法是基于苹果的例子这里

import RealityKit
import SwiftUI
import ARKit
import RealityKitContent

@MainActor var imageAnchors: [UUID: ImageAnchor] = [:]
@MainActor var entityMap: [UUID: Entity] = [:]

@MainActor
class ImageTrackingViewModel: ObservableObject {
  private let session = ARKitSession()
  private var rootEntity = Entity()
  private let imageInfo = ImageTrackingProvider(
      referenceImages: ReferenceImage.loadReferenceImages(inGroupNamed: "albumCovers")
  )

  func start() async {
      do {
          if ImageTrackingProvider.isSupported {
              print("ARKitSession starting.")
              Task {
                  try await session.run([imageInfo])
                  for await update in imageInfo.anchorUpdates {
                      updateImage(update.anchor, rootEntity: rootEntity)
                  }
              }
          }
      }
  }

  func updateImage(_ anchor: ImageAnchor, rootEntity: Entity) {
      
          // Add a new entity to represent this image.
          let entity = ModelEntity(mesh: .generateSphere(radius: 0.1), materials: [SimpleMaterial(color: .systemBlue, isMetallic: false)])
          entityMap[anchor.id] = entity
          rootEntity.addChild(entity)
      

      if anchor.isTracked {
          print("Anchor Transform:")
          print(anchor.originFromAnchorTransform)
          entityMap[anchor.id]?.transform = Transform(matrix: anchor.originFromAnchorTransform)
      }
  }
}

我尝试设置一个entityMap数组,并尝试按照上面链接的苹果示例的建议在跟踪图像上生成一个新实体,但它不会导致在生成的锚点位置上放置可见的球体网格

augmented-reality arkit realitykit visionos
1个回答
0
投票

事实证明我错误地管理了根实体。我通过在 RealityView 配置中添加以下内容解决了这个问题:

var body: some View {
    RealityView { content in
        content.add(model.setupContentEntity())
    }
}

这会调用视图模型中的一个新函数:

func setupContentEntity() -> Entity {
    return contentEntity
}

这使我能够确保在会话开始时创建根实体(我在此处将其重命名为 contentEntity),以便我可以向其中添加子对象。感谢 reddit 用户 Time_Concert_1751 帮助解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.