2

我在 Reality Composer 中向面部锚点添加了内容,稍后,在加载了Experience我在 Reality Composer 上创建的内容后,我创建了一个这样的面部跟踪会话:

guard ARFaceTrackingConfiguration.isSupported else { return }
let configuration = ARFaceTrackingConfiguration()
configuration.maximumNumberOfTrackedFaces = ARFaceTrackingConfiguration.supportedNumberOfTrackedFaces
configuration.isLightEstimationEnabled = true

arView.session.delegate = self
arView.session.run(configuration, options: [.resetTracking, .removeExistingAnchors])

它没有将内容添加到正在检测的所有面部,并且我知道它正在检测多个面部,因为其他面部遮挡了粘在另一张面部上的内容,这是限制RealityKit还是我遗漏了一些东西作曲家?实际上很难错过一些东西,因为它是如此基本和简单。

谢谢。

4

1 回答 1

2

如果您使用带有嵌入式 Face Anchor 的模型,即来自 Reality Composer 的 Face Tracking 预设的模型(您只能使用一个带有.face锚的模型,而不是三个),您将无法在 RealityKit 中成功进行多面跟踪。或者您可以使用此类模型,但您需要删除这些嵌入的AnchorEntity(.face)锚点。尽管有更好的方法——只需以.usdz格式加载模型。

让我们看看 Apple 文档中关于嵌入式锚点的说明

您可以使用代码手动加载和锚定 Reality Composer 场景,就像处理其他 ARKit 内容一样。当您在代码中锚定场景时,RealityKit 会忽略场景的锚定信息。

Reality Composer 支持 5 种锚类型:HorizontalVerticalImageFace& Object。它为每种锚类型显示一组不同的指南,以帮助您放置内容。如果您选择了错误的选项或改变了如何锚定场景的想法,您可以稍后更改锚点类型。

有两种选择:

  1. 在新的 Reality Composer 项目中,取消Create with default content选中您在启动时看到的操作表左下方的复选框。

  2. 在 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)
    }
}
于 2020-01-19T11:35:06.873 回答