Обнаружение нескольких лиц в RealityKit

Я добавил контент к привязке лица в 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или мне что-то не хватает в композиторе? на самом деле довольно сложно что-то упустить, так как это так просто и просто.

Спасибо.

1 ответ

Вы не сможете добиться успеха в отслеживании нескольких лиц в RealityKit, если вы используете модели со встроенным якорем лица, то есть модели, полученные из предустановки отслеживания лица Reality Composer (вы можете использовать только одну модель с .faceякорь, а не три). Или вы МОЖЕТЕ ИСПОЛЬЗОВАТЬ такие модели, но вам необходимо удалить эти встроенныеAnchorEntity(.face)якоря. Хотя есть лучший подход - просто загрузите модели в.usdz формат.

Давайте посмотрим, что в документации Apple говорится о встроенных якорях:

Вы можете вручную загружать и закреплять сцены Reality Composer с помощью кода, как и с другим контентом ARKit. Когда вы закрепляете сцену в коде, RealityKit игнорирует информацию привязки сцены.

Reality Composer поддерживает 5 типов привязок: Horizontal, Vertical, Image, Face & Object. Он отображает разные наборы направляющих для каждого типа привязки, чтобы помочь вам разместить свой контент. Вы можете изменить тип привязки позже, если выберете неправильный вариант или передумаете, как привязать сцену.

Есть два варианта:

  1. В новом проекте Reality Composer снимите флажок Create with default content флажок в левом нижнем углу листа действий, который вы видите при запуске.

  2. В коде RealityKit удалите существующие Face Anchorи назначьте новый. Последний вариант не очень хорош, потому что вам нужно воссоздавать положение объектов с нуля:

     boxAnchor.removeFromParent()
    

Тем не менее, я добился многопользовательского отслеживания, используя AnchorEntity() с ARAnchor инициализатор внутри session(:didUpdate:) метод экземпляра (как и SceneKit's 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)
    }
}
Другие вопросы по тегам