如何解决ARKit + SceneKit:无法移动锚定到面部的节点
我有一个固定在用户脸上的简单框,我想用 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 举报,一经查实,本站将立刻删除。