Распознавание нескольких лиц в RealityKit - PullRequest
2 голосов
/ 06 января 2020

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

Спасибо.

1 Ответ

1 голос
/ 19 января 2020

Невозможно добиться успеха в отслеживании нескольких лиц в RealityKit, если вы используете модели со встроенным Face Anchor, т.е. модели, которые были получены из 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 Intializer внутри session(:didUpdate:) метода экземпляра (точно так же, как renderer() SceneKit метод экземпляра).

Вот мой код:

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)
    }
}
...