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

Спасибо.


person Juan Boero    schedule 06.01.2020    source источник
comment
Можете ли вы добавить код, в котором вы определяете свои модели и объекты привязки?   -  person Hermes    schedule 18.01.2020
comment
@Hermes, это RealityKit, кода для этого нет, все делается на Reality Composer   -  person Juan Boero    schedule 18.01.2020
comment
Есть способ сделать это в коде (это то, что Reality Composer использует под капотом).   -  person Hermes    schedule 19.01.2020
comment
@Hermes, хорошо, попробую, мы все безоговорочно согласны с тем, что Reality Composer не хватает этой функции.   -  person Juan Boero    schedule 20.01.2020


Ответы (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:) метода экземпляра (точно так же, как метод экземпляра 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)
    }
}
person Andy Fedoroff    schedule 19.01.2020