如何保留 Reality Composer 的行为?
How to preserve behaviors from Reality Composer?
我想在图像上显示 Reality Composer 体验,但是我不希望 AR 对象在我忘记图像时隐藏,所以我创建了一个 AnchorEntity 并从 didAdd 中获取了 ImageAnchor 的翻译anchors 委托方法如下:
func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
// If we already added the content to render, ignore
if rootAnchor != nil {
return
}
// Make sure we are adding to an image anchor. Assuming only
// one image anchor in the scene for brevity.
guard anchors[0] is ARImageAnchor else {
return
}
// Create the entity to render, could load from your experience file here
// this will render at the center of the matched image
rootAnchor = AnchorEntity(world: [0,0,0])
guard let boxAnchor = boxAnchor else { return }
rootAnchor!.addChild(boxAnchor.tap!)
arView.scene.addAnchor(rootAnchor!)
}
正如您在此处看到的,我正在从 Reality Composer 文件中获取 tap 实体,以便将其重新插入到 Anchor 实体。
我现在的问题是我丢失了我的 Reality Composer 文件中的行为,这个实体有一些行为,比如当你点击它时它会翻转或接近相机。通过失去行为,我失去了 Reality Composer 的全部意义。
现在我的问题是,如何从现实文件中检索行为?我考虑过锚定整个体验而不是一个实体,所以不是 rootAnchor!.addChild(boxAnchor.tap!)
而是 rootAnchor!.addChild(boxAnchor)
,但是 update delagate 方法不会更新场景中实体的位置,这里是代码:
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
guard let rootAnchor = rootAnchor else {
return
}
// Code is assuming you only have one image anchor for brevity
guard let imageAnchor = anchors[0] as? ARImageAnchor else {
return
}
if !imageAnchor.isTracked {
return
}
rootAnchor.transform = Transform(matrix: imageAnchor.transform)
}
基本上rootAnchor.transform = Transform(matrix: imageAnchor.transform)
如果root anchor是整个场景就不行
那么如何在根据图像更新anchor的同时保持行为呢?
谢谢
问题是:在 RealityKit 2.0 中,我们无法访问 Reality Composer 的行为(notification
除外)和锚点类型——我们知道它是 AnchorEntity(.image) – 您在 Reality Composer 中分配的工作方式与 ARKit 在 ARImageTrackingConfig 中的图像锚点的工作方式相同,即它使用局部跟踪而不是全局跟踪。换句话说,在当前的 Reality Composer 场景中,您很难得到这样的场景。
尝试使用 ARKit 及其 ARWorldTrackingConfig 进行图像跟踪。所有“行为”都必须在 RealityKit 或 SceneKit 中从头开始重新创建。
我想在图像上显示 Reality Composer 体验,但是我不希望 AR 对象在我忘记图像时隐藏,所以我创建了一个 AnchorEntity 并从 didAdd 中获取了 ImageAnchor 的翻译anchors 委托方法如下:
func session(_ session: ARSession, didAdd anchors: [ARAnchor]) {
// If we already added the content to render, ignore
if rootAnchor != nil {
return
}
// Make sure we are adding to an image anchor. Assuming only
// one image anchor in the scene for brevity.
guard anchors[0] is ARImageAnchor else {
return
}
// Create the entity to render, could load from your experience file here
// this will render at the center of the matched image
rootAnchor = AnchorEntity(world: [0,0,0])
guard let boxAnchor = boxAnchor else { return }
rootAnchor!.addChild(boxAnchor.tap!)
arView.scene.addAnchor(rootAnchor!)
}
正如您在此处看到的,我正在从 Reality Composer 文件中获取 tap 实体,以便将其重新插入到 Anchor 实体。
我现在的问题是我丢失了我的 Reality Composer 文件中的行为,这个实体有一些行为,比如当你点击它时它会翻转或接近相机。通过失去行为,我失去了 Reality Composer 的全部意义。
现在我的问题是,如何从现实文件中检索行为?我考虑过锚定整个体验而不是一个实体,所以不是 rootAnchor!.addChild(boxAnchor.tap!)
而是 rootAnchor!.addChild(boxAnchor)
,但是 update delagate 方法不会更新场景中实体的位置,这里是代码:
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
guard let rootAnchor = rootAnchor else {
return
}
// Code is assuming you only have one image anchor for brevity
guard let imageAnchor = anchors[0] as? ARImageAnchor else {
return
}
if !imageAnchor.isTracked {
return
}
rootAnchor.transform = Transform(matrix: imageAnchor.transform)
}
基本上rootAnchor.transform = Transform(matrix: imageAnchor.transform)
如果root anchor是整个场景就不行
那么如何在根据图像更新anchor的同时保持行为呢?
谢谢
问题是:在 RealityKit 2.0 中,我们无法访问 Reality Composer 的行为(notification
除外)和锚点类型——我们知道它是 AnchorEntity(.image) – 您在 Reality Composer 中分配的工作方式与 ARKit 在 ARImageTrackingConfig 中的图像锚点的工作方式相同,即它使用局部跟踪而不是全局跟踪。换句话说,在当前的 Reality Composer 场景中,您很难得到这样的场景。
尝试使用 ARKit 及其 ARWorldTrackingConfig 进行图像跟踪。所有“行为”都必须在 RealityKit 或 SceneKit 中从头开始重新创建。