我希望获取所有三个轴的旋转角度。我试图在横屏模式下实现这一点。 当设备从左侧旋转到右侧(Y-旋转)时,我希望当用户设置一个左端并向右旋转时,度数只覆盖一次。因此,当达到起始点时,我们需要度数360。因此,对于y-旋转,使用以下计算即可。
let q = sceneView.pointOfView.orientation
let yRotation = Float.pi - atan2f( (2*q.y*q.w)-(2*q.x*q.z), 1-(2*pow(q.y,2))-(2*pow(q.z,2)) )
同样,想要Z轴旋转角度,对于Z轴旋转,不需要360度旋转。但需要在旋转约90度时获得精确值。 如果我们使用
var zRotation = sceneView.pointOfView.eulerAngles.z
如果我们将设备向左或向右(Y方向)旋转一定角度,然后检查Z轴旋转角度,那么如果仅仅使用原来的方法,则会出现错误,Z轴旋转角度应该接近180度而不是0度。
所以我尝试了一种不好的方法来获取Z轴的旋转角度:
var zRotation = sceneView.pointOfView.eulerAngles.z
if abs(sceneView.pointOfVieweulerAngles.z.toDegree) > 90 {
zRotation = (abs(cameraNode.eulerAngles.z.toDegree) - 180).toRadian
}
但这并不准确,我们可以看到当减去180时,Z旋转值出现跳跃。
你能建议一个合适的方法吗?
X旋转值类似于Z旋转,在左右(Y旋转)旋转一定度数后检查时,获取接近180的值。
谢谢。
更新:2019年9月3日 对于X和Y,我现在正在使用
let xRotation = sceneView!.session.currentFrame!.camera.eulerAngles.x
let zRotation = sceneView!.session.currentFrame!.camera.eulerAngles.z