我正在一个ARKit项目中,需要管理一个对象(白框)在平面(蓝色正方形)上的移动。
环境特征是:
通过在设备上滑动来处理盒子的移动。无论用户或飞机处于什么位置,滑动操作都必须使滑动框相对于用户在屏幕上看到的方向沿滑动方向移动,而不必在框的坐标空间中使用相同的方向(向上滑动)例如,如果用户将用户向平面左侧移动了90°,或者在用户仍在原始位置的情况下,该平面向右旋转了90°,则设备可能位于该平面中如上图所示,将飞机指向用户前方。可能的组合是无限的。
我正在努力寻找解决方案。
我发现了一种解决方案,它可以通过EulerAngles属性给出的摄像头的俯仰,偏航和侧倾来管理用户围绕飞机的运动,如下所述。
func DefineARMovement(Level: LevelClass, NextMovement: inout eTypeMovement)
{
let LevelNode = (MainPlayer.Level as! Level3DClass).TransformNode
// Calculation of the angle of the camera taking into account the possible rotation of the plane.
// Works only if plane is rotating around Y axis.
var CameraAngleBoardRef = SCNVector3.init(
AngleDiff(AngleA: 90 - VCPlayAR.CameraAngles.x, AngleB: Float(RadiansToDegrees(Double(LevelNode.eulerAngles.x)).rounded(.up).RoundTo(Places: 0))),
AngleDiff(AngleA: VCPlayAR.CameraAngles.y, AngleB: Float(RadiansToDegrees(Double(LevelNode.eulerAngles.y)).rounded(.up).RoundTo(Places: 0))),
AngleDiff(AngleA: VCPlayAR.CameraAngles.z, AngleB: Float(RadiansToDegrees(Double(LevelNode.eulerAngles.z)).rounded(.up).RoundTo(Places: 0))))
switch CameraAngleBoardRef.y
{
case _ where CameraAngleBoardRef.y > 315 || CameraAngleBoardRef.y < 45:
break
case _ where CameraAngleBoardRef.y > 45 && CameraAngleBoardRef.y < 135:
switch NextMovement
{
case .Up:
NextMovement = .Left
case .Down:
NextMovement = .Right
case .Right:
NextMovement = .Up
case .Left:
NextMovement = .Down
default:
break
}
case _ where CameraAngleBoardRef.y > 135 && CameraAngleBoardRef.y < 225:
NextMovement = NextMovement.Inverse()
case _ where CameraAngleBoardRef.y > 225 && CameraAngleBoardRef.y < 315:
switch NextMovement
{
case .Up:
NextMovement = .Right
case .Down:
NextMovement = .Left
case .Right:
NextMovement = .Down
case .Left:
NextMovement = .Up
default:
break
}
default:
break
}
if CameraAngleBoardRef.x > 180 { NextMovement = NextMovement.Inverse() }
if CameraAngleBoardRef.z > 180 { NextMovement = NextMovement.Inverse() }
}
但是一旦我开始以3D旋转平面,我就迷路了...
直觉上,我会说我需要:
我的问题是,我不知道如何确定平面节点坐标空间中ARCamera的EulerAngles。
我也不知道如何在这里使用相机的Orientation或Rotation属性,因为ARCamera仅提供了Transform和EulerAngles属性(而且我不知道如何提取方向和/或旋转度)这些属性中的...)
如果有人考虑使用更简单的解决方案或已经存在的算法,我也很感兴趣