#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. можете ли вы поделиться проектом?