ARKit SceneKit: не удается переместить узел, привязанный к лицу

#position #scenekit #arkit #tracking #face

Вопрос:

ИЗМЕНИТЬ: ссылка на проект

У меня есть простая коробка, прикрепленная к лицу пользователя, и я хотел бы изменить ее положение XYZ с помощью 3 различных UISlider элементов управления. Я испробовал несколько методов, но ничего не вышло. Объект остается статичным.

Я думаю, что код может говорить лучше:

 import Foundation
import UIKit
import ARKit
import SceneKit

class SceneKitViewController: UIViewController {
    @IBOutlet private var sceneView: ARSCNView!
    
    var rootNode: SCNNode!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        guard ARFaceTrackingConfiguration.isSupported else { return }
        
        sceneView.delegate = self
        sceneView.session.delegate = self
        sceneView.automaticallyUpdatesLighting = true
        sceneView.showsStatistics = true
        
        rootNode = box
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        let configuration = ARFaceTrackingConfiguration()
        configuration.maximumNumberOfTrackedFaces = 1
        configuration.isLightEstimationEnabled = true
        sceneView.session.run(configuration, options: [])
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        sceneView.session.pause()
    }
    
    var box: SCNNode {
        let box = SCNBox(width: 0.1, height: 0.1, length: 0.1, chamferRadius: 0)
        let node = SCNNode(geometry: box)
        node.position = SCNVector3(0,0,0)
        return node
    }
    
    @IBAction func setXAxis(sender: UISlider) {
        setNewPosition(SCNVector3(sender.value, rootNode.position.y, rootNode.position.z))
    }
    
    @IBAction func setYAxis(sender: UISlider) {
        setNewPosition(SCNVector3(rootNode.position.x, sender.value, rootNode.position.z))
    }
    
    @IBAction func setZAxis(sender: UISlider) {
        setNewPosition(SCNVector3(rootNode.position.x, rootNode.position.y, sender.value))
    }
    
    @IBAction func setScale(sender: UISlider) {
        rootNode.scale = SCNVector3(sender.value, sender.value, sender.value)
    }
    
    private func setNewPosition(_ vector: SCNVector3) {
        // 
        print("moving to (vector)")
//        rootNode.position = vector
//        rootNode.localTranslate(by: vector)
        updatePositionOf(rootNode, withPosition: vector)
    }
    
    func updatePositionOf(_ node: SCNNode, withPosition position: SCNVector3) {
        var translationMatrix = matrix_identity_float4x4
        translationMatrix.columns.3.x = position.x
        translationMatrix.columns.3.y = position.y
        translationMatrix.columns.3.z = position.z
        
        node.transform = SCNMatrix4(translationMatrix)
    }
}

extension SceneKitViewController: ARSCNViewDelegate {
    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
        if let _ = anchor as? ARFaceAnchor {
            return rootNode
        }
        return nil
    }

    func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
        
    }
}
 

Чего я здесь не понимаю? Спасибо!

Комментарии:

1. С какой проблемой вы столкнулись? Разве это работает не так, как ожидалось? Что именно происходит?

2. Ничего не происходит

3. что говорит оператор печати, который должен выводить новый вектор? работает ли это?

4. Ты имеешь в виду moving to xyz ? Он печатает вектор, который я отправил, но ничего не происходит

5. можете ли вы поделиться проектом?