Обновление положения глазного преобразования в Swift для iOS 12.0+ - PullRequest
0 голосов
/ 13 марта 2019

Я хотел бы постоянно выводить обновленные матрицы преобразования глаз для ARFaceGeometry в ARSession.До сих пор я писал следующее, и вместо того, чтобы постоянно обновлять позицию, он просто выводит исходную позицию и продолжает повторять эти значения.Я попытался реализовать updateFeatures(for node: SCNNode,using anchor: ARFaceAnchor) для положения глаз и не смог дать другой результат.Будут ли у вас какие-либо подсказки / явные ошибки, которые я не заметил, которые могли привести к тому, что eyeTransform не обновится?

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
    var leftEyeTransform: simd_float4x4 { get {
        return currentFaceAnchor!.leftEyeTransform}
        }
    print("Left Eye: \(currentFaceAnchor!.leftEyeTransform)")
    guard anchor == currentFaceAnchor,
        let contentNode = selectedContentController.contentNode,
        contentNode.parent == node
        else { return }
    selectedContentController.renderer(renderer, didUpdate: contentNode, for: anchor)    
}

В приведенном выше примере currentFaceAnchor - это константа let, определенная как ARFaceAnchor в методе renderer(didAdd:), а contentNode - это константа let, определенная как contentController.renderer(nodeFor: faceAnchor).

1 Ответ

1 голос
/ 14 марта 2019

Похоже, вы не используете anchor, который функция рендерера дает вам в качестве параметра.Это anchor содержит всю обновленную информацию о лице / глазе.currentFaceAnchor, на который вы ссылаетесь, содержит информацию о привязке лица только с момента ее первоначальной инициализации.Если вы добавите то, что ниже, вы должны увидеть обновления значений из leftEyeTransform.

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
    guard #available(iOS 12.0, *), let faceAnchor = anchor as? ARFaceAnchor else { return }

    print("\(faceAnchor.leftEyeTransform)")
}
...