ARKit相机欧拉角旋转顺序

问题描述 投票:0回答:1

我是 ARKit 新手,我需要知道 ARKit 中相机的旋转顺序到底是什么?

我用谷歌搜索了很多这个信息,但没有明确的答案。

我需要带有相机变换矩阵的打印示例的答案。

(Rx, Ry, Rz) 

(Rz, Ry, Rx) ?
augmented-reality scenekit arkit euler-angles realitykit
1个回答
3
投票

理论

在 ARKit、SceneKit 和 RealityKit 中,默认节点(实体)方向表示为

  • 滚动,或绕
    Z
  • 旋转
  • 偏航,或绕
    Y
  • 旋转
  • 俯仰,或绕
    X
  • 旋转

Apple 开发者文档

SceneKit 以组件的相反顺序应用相对于节点的支点属性的这些旋转:首先滚动

Z
,然后偏航
Y
,然后俯仰
X
。旋转、eulerAngles 和方向属性都会影响节点变换属性的旋转方面。对这些属性之一的任何更改都会反映在其他属性中。

因此,AR/VR 对象的旋转顺序为:

(Rz, Ry, Rx)

我们如何检查这个?

使用此代码可确保Apple AR/VR生态系统中的轮换顺序为ZYX。

group(..)
型方式用于绕X轴和Z轴同时旋转(各轴360度)。

import SceneKit

class ViewController : NSViewController {
    let scene = SCNScene(named: "cubeWithPivot.scn")!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let sceneView = self.view as! SCNView
        sceneView.backgroundColor = .black
        sceneView.allowsCameraControl = true
        sceneView.autoenablesDefaultLighting = true
        sceneView.scene = self.scene
        
        checkRotationOrderFor(scene)
    }
    
    func checkRotationOrderFor(_ scene: SCNScene) {
        if let cube = scene.rootNode.childNode(withName: "pCube1",
                                            recursively: true) {
            // pivot point Z offset
            cube.pivot.m43 = -4.0
            // or use simdPivot
            // cube.simdPivot.columns.3.z = -4.0
            let rotateX = SCNAction.rotateBy(x: .pi*2, y: 0, z: 0, duration: 2.5)
            let rotateZ = SCNAction.rotateBy(x: 0, y: 0, z:-.pi*2, duration: 2.5)
            let parallelAction = SCNAction.group([rotateX, rotateZ])
            let repeatAction = SCNAction.repeatForever(parallelAction)
            cube.runAction(repeatAction)
        }
    }
}

现在让我们看看 SceneKit 的立方体在 ZYX 旋转顺序下是什么样子:

这是具有 XYZ 旋转顺序的 Maya 立方体(立方体沿着不同的轨迹移动):

Quod erat demostrandum。

© www.soinside.com 2019 - 2024. All rights reserved.