Невозможно добиться успеха в отслеживании нескольких лиц в RealityKit, если вы используете модели со встроенным Face Anchor, т.е. модели, которые были получены из Reality Composer 'Предварительная настройка отслеживания лица (вы можете использовать только одну модель с .face
якорь, а не три). Или вы МОЖЕТЕ ИСПОЛЬЗОВАТЬ такие модели, но вам нужно удалить эти встроенные якоря 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()
Тем не менее, я достиг многоликого слежения, используя 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)
}
}