如果您使用带有嵌入式 Face Anchor 的模型,即来自 Reality Composer 的 Face Tracking 预设的模型(您只能使用一个带有.face
锚的模型,而不是三个),您将无法在 RealityKit 中成功进行多面跟踪。或者您可以使用此类模型,但您需要删除这些嵌入的AnchorEntity(.face)
锚点。尽管有更好的方法——只需以.usdz
格式加载模型。
让我们看看 Apple 文档中关于嵌入式锚点的说明:
您可以使用代码手动加载和锚定 Reality Composer 场景,就像处理其他 ARKit 内容一样。当您在代码中锚定场景时,RealityKit 会忽略场景的锚定信息。
Reality Composer 支持 5 种锚类型:Horizontal
、Vertical
、Image
、Face
& Object
。它为每种锚类型显示一组不同的指南,以帮助您放置内容。如果您选择了错误的选项或改变了如何锚定场景的想法,您可以稍后更改锚点类型。
有两种选择:
在新的 Reality Composer 项目中,取消Create with default content
选中您在启动时看到的操作表左下方的复选框。
在 RealityKit 代码中,删除现有的Face Anchor
并分配一个新的。后一个选项不是很好,因为您需要从头开始重新创建对象位置:
boxAnchor.removeFromParent()
尽管如此,我还是使用 intializer inside 实例方法实现了多面跟踪AnchorEntity()
(ARAnchor
就像session(:didUpdate:)
SceneKit 的renderer()
实例方法一样)。
这是我的代码:
import ARKit
import RealityKit
extension ViewController: ARSessionDelegate {
func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {
guard let faceAnchor = anchors.first as? ARFaceAnchor
else { return }
let anchor1 = AnchorEntity(anchor: faceAnchor)
let anchor2 = AnchorEntity(anchor: faceAnchor)
anchor1.addChild(model01)
anchor2.addChild(model02)
arView.scene.anchors.append(anchor1)
arView.scene.anchors.append(anchor2)
}
}
class ViewController: UIViewController {
@IBOutlet var arView: ARView!
let model01 = try! Entity.load(named: "angryFace") // USDZ file
let model02 = try! FacialExpression.loadSmilingFace() // RC scene
override func viewDidLoad() {
super.viewDidLoad()
arView.session.delegate = self
guard ARFaceTrackingConfiguration.isSupported else {
fatalError("Alas, Face Tracking isn't supported")
}
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let config = ARFaceTrackingConfiguration()
config.maximumNumberOfTrackedFaces = 2
arView.session.run(config)
}
}