ARImageAnchor在与SCNNode的方向关系中。

huangapple go评论103阅读模式
英文:

ARImageAnchor orientation in relation to a SCNNode

问题

我的当前代码库提供了与世界相关的ARImageAnchor的方向(俯仰偏航翻滚)。我想要实现的目标是获取ARImageAnchor方向数据,相对于在启动会话后的某个时间添加的节点。

  1. func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
  2. guard let _ = anchor as? ARImageAnchor else { return }
  3. DispatchQueue.main.async {
  4. let cylinderNode = SCNNode()
  5. cylinderNode.geometry = SCNCylinder(radius: 0.05, height: 0.4)
  6. node.addChildNode(cylinderNode)
  7. let ea: SCNVector3 = node.eulerAngles
  8. print(self.convert(ea.x), self.convert(ea.y), self.convert(ea.z))
  9. }
  10. }

希望能提供帮助!

英文:

My current code base provides the orientation (pitch, yaw, roll) of an ARImageAnchor in relation to the world. What I want to achieve is to get the ARImageAnchor orientation data in relation to a node that has been added sometime after starting the session.

  1. func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode,
  2. for anchor: ARAnchor) {
  3. guard let _ = anchor as? ARImageAnchor else { return }
  4. DispatchQueue.main.async {
  5. let cylinderNode = SCNNode()
  6. cylinderNode.geometry = SCNCylinder(radius: 0.05, height: 0.4)
  7. node.addChildNode(cylinderNode)
  8. let ea: SCNVector3 = node.eulerAngles
  9. print(self.convert(ea.x), self.convert(ea.y), self.convert(ea.z))
  10. }
  11. }

Any help would be much appreciated!

答案1

得分: 1

你可以将锚点的 orientation part 部分从 simd_float4x4 transform 传递给你的模型(请注意,这些数据存储在当前会话的每个 ARFrame 中),以恢复位置:

  1. import ARKit
  2. import SceneKit
  3. class ViewController: UIViewController, ARSCNViewDelegate {
  4. @IBOutlet var sceneView: ARSCNView!
  5. var model = SCNNode()
  6. override func viewDidLoad() {
  7. super.viewDidLoad()
  8. sceneView.delegate = self
  9. sceneView.scene = SCNScene(named: "ARScene")!
  10. model = sceneView.scene.rootNode.childNode(withName: "model",
  11. recursively: true)!
  12. }
  13. @IBAction func passTransformButton(_ sender: UIButton) {
  14. if let trans = sceneView.session.currentFrame?.anchors[0].transform {
  15. model.simdTransform = trans // Full Transform
  16. model.simdTransform.columns.3.x = 0 // 恢复位置 X
  17. model.simdTransform.columns.3.y = 0 // 恢复位置 Y
  18. model.simdTransform.columns.3.z = 0 // 恢复位置 Z
  19. }
  20. }
  21. }
英文:

You can pass anchor's orientation part of the simd_float4x4 transform to your model (note that this data is stored in each ARFrame of the current session) restoring position:

  1. import ARKit
  2. import SceneKit
  3. class ViewController : UIViewController, ARSCNViewDelegate {
  4. @IBOutlet var sceneView: ARSCNView!
  5. var model = SCNNode()
  6. override func viewDidLoad() {
  7. super.viewDidLoad()
  8. sceneView.delegate = self
  9. sceneView.scene = SCNScene(named: "ARScene")!
  10. model = sceneView.scene.rootNode.childNode(withName: "model",
  11. recursively: true)!
  12. }
  13. @IBAction func passTransformButton(_ sender: UIButton) {
  14. if let trans = sceneView.session.currentFrame?.anchors[0].transform {
  15. model.simdTransform = trans // Full Transform
  16. model.simdTransform.columns.3.x = 0 // restore position X
  17. model.simdTransform.columns.3.y = 0 // restore position Y
  18. model.simdTransform.columns.3.z = 0 // restore position Z
  19. }
  20. }
  21. }

huangapple
  • 本文由 发表于 2023年4月10日 23:10:43
  • 转载请务必保留本文链接:https://go.coder-hub.com/75978284.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定