像 SCNARView 一样计算 worldFront

Calculating worldFront like in SCNARView

SCNARView 中,我可以访问 camera node 的 属性,称为 worldFront,它表示相机旋转。我想从 CoreMotion 值计算相似向量,而不是使用 SCNARView,只是来自 CoreMotion 的数据。这样我就可以得到一个矢量,如果相机朝向相同的方向,则等于 SCNARView 中的 worldFront。有人可以解释一下如何计算这样的值吗?

态度属性可能会有帮助

func rollCam(motion: CMDeviceMotion) {
    let attitude = motion.attitude
    let roll     = Float(attitude.roll-M_PI/2)
    let yaw      = Float(attitude.yaw)
    let pitch    = Float(attitude.pitch)
    camNode.eulerAngles = SCNVector3Make(roll, -yaw, pitch)
}

使用这段代码,很久以前,我对 CoreMotion 进行了一些试验。我试图首先检测人类行走,然后(使用 startDeviceMotionUpdates 数据)将相机移动并滚动到 "anchored" SCNBox 附近。后来 ARKit 用 ARAnchor class

解决了我的需要

您在关注什么功能?

我找到答案了:

override var cameraFrontVector: double3 {
    guard let quaternion = motionService.deviceMotion?.attitude.quaternion else { return .zero }

    let x = 2 * -(quaternion.x * quaternion.z + quaternion.w * quaternion.y)
    let z = 2 *  (quaternion.y * quaternion.z - quaternion.w * quaternion.x)
    let y = 2 *  (quaternion.x * quaternion.x + quaternion.y * quaternion.y) - 1

    return double3(x: x, y: y, z: z)
}

这给了我像 SCNNode 中的 worldFront 这样的值。