微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ARKit + SceneKit:无法移动锚定到面部的节点

如何解决ARKit + SceneKit:无法移动锚定到面部的节点

编辑:link to project

我有一个固定在用户脸上的简单框,我想用 3 个不同的 UiSlider 控件更改它的 XYZ 位置。我尝试了几种方法,但没有任何反应。对象保持静态。

我认为代码可以说得更好:

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)
        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,sender.value))
    }
    
    @IBAction func setScale(sender: UiSlider) {
        rootNode.scale = SCNVector3(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) {
        
    }
}

在这里不明白什么?谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。