如何使用 RealityKit 将 3D 模型放置在参考图像之上?
Posted
技术标签:
【中文标题】如何使用 RealityKit 将 3D 模型放置在参考图像之上?【英文标题】:How to place a 3D model on top of a reference image with RealityKit? 【发布时间】:2021-12-27 16:30:59 【问题描述】:当它被识别时,我想将来自本地设备的 3D 模型放置在参考图像的顶部。为此,我尝试了以下方法:
-
将参考图像添加到会话配置中:
override func viewDidLoad()
super.viewDidLoad()
arView.session.delegate = self
// Check if the device supports the AR experience
if (!ARConfiguration.isSupported)
TLogger.shared.error_objc("Device does not support Augmented Reality")
return
guard let qrCodeReferenceImage = UIImage(named: "QRCode") else return
let detectionImages: Set<ARReferenceImage> = convertToReferenceImages([qrCodeReferenceImage])
let configuration = ARWorldTrackingConfiguration()
configuration.detectionImages = detectionImages
arView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])
-
使用
ARSessionDelegate
在检测到参考图像时得到通知,并将 3D 模型放置在与他的ARImageAnchor
相同的位置:
func session(_ session: ARSession, didAdd anchors: [ARAnchor])
for anchor in anchors
guard let imageAnchor = anchor as? ARImageAnchor else return
let position = imageAnchor.transform
addEntity(self.localModelPath!, position)
func addEntity(_ modelPath: URL, _ position: float4x4)
// Load 3D Object as Entity
let entity = try! Entity.load(contentsOf: modelPath)
// Create the Anchor which gets added to the AR Scene
let anchor = AnchorEntity(world: position)
anchor.addChild(entity)
anchor.transform.matrix = position
arView.scene.addAnchor(anchor)
但是,每当我尝试将包含我的 3D 模型(实体)的锚点放置在特定位置时,它都不会出现在 arView 中。看起来模型正在加载,因为在执行 addEntity
函数时丢失了几帧。当我没有专门设置锚点位置时,模型会出现在镜头前。
任何人都可以在这里引导我走向正确的方向吗?
【问题讨论】:
【参考方案1】:解决方案一
要使您的代码正常工作,请删除此行:
anchor.transform.matrix = position
@TimLangner – “...但我想让模型出现在参考图像之上,而不是任何其他位置...”
如您所见,我的测试球体出现在参考图像之上。更改其位置时,请记住,如果 QR 是垂直的,图像锚的 Y 轴指向相机,如果 QR 码在水平面上,则指向向上。
确保枢轴点位于应有的位置。
就我而言(您可以看到我正在使用 AppClipCode),要将球体向上移动 30 厘米,我必须沿负 Z 方向移动。
entity.position.z = anchor.position.z - 0.3
解决方案二
在我看来,最简单和高效的解决方案是使用 RealityKit 的原生 AnchorEntity(.image(...)),而无需在委托方法中实现 ARImageAnchor
。
AnchorEntity(.image(group: "GroupName", name: "forModel"))
这是一个代码:
import UIKit
import RealityKit
class ViewController: UIViewController
@IBOutlet var arView: ARView!
override func viewDidLoad()
super.viewDidLoad()
let entity = ModelEntity(mesh: .generateSphere(radius: 0.1))
let anchor = AnchorEntity(.image(group: "AR Resources",
name: "appClipCode"))
anchor.addChild(entity)
entity.position.z = anchor.position.z - 0.3
arView.scene.anchors.append(anchor)
【讨论】:
模型的比例很好。如果我不设置锚点的位置,模型就会出现在镜头前。我将编辑问题以使其更清楚。 就我而言,枢轴点设置正确。 解决方案 II 对我有用。似乎我将参考图像添加到资产目录的方式也不正确。我现在在我创建的资产目录中添加了一个 AR 资源组,然后我将参考图像移动到其中。之后,我可以使用 ARReferenceImage.referenceImages(inGroupNamed: String, bundle: Bundle?) 获取会话配置的参考图像。以上是关于如何使用 RealityKit 将 3D 模型放置在参考图像之上?的主要内容,如果未能解决你的问题,请参考以下文章
LiDAR 和 RealityKit – 为扫描模型捕获真实世界纹理
我如何在RealityKit中访问Reality Composer的模型组件?
RealityKit - 隐藏和显示 usdz 模型的部分(网格)