我正在创建用于ARCore和Unity锻炼的室内导航应用程序。
该应用与该网址Navigation App Using ARCore上的应用非常相似
主要区别在于相机从上方跟随指针,而指针是箭头。还有另一个对象(红色立方体)显示手机的方向。
我已经成功地从手机中获得了姿势旋转,并将其用于红色立方体上:
myRedCube.transform.rotation = Frame.Pose.rotation;
现在,我只需要根据手机的移动方向在x-z平面上旋转箭头,以使用户看到他要去的地方(相机从上方看向指针)。如果我设置一个固定角度,则可以很好地工作,但是如果我使用ARCore的角度,旋转角度将与我预期的不同。
我尝试提取Frame.Pose.rotation的y欧拉角,并用于:
arrow.transform.rotation = Quaternion.Euler(0,myYAngle,0);
但是旋转不正确。
我做过的另一项测试是使用传递给LookRotation的定向向量:
Vector3 tempVector = Quaternion.AngleAxis(myYAngle, Vector3.up) * Vector3.forward;
arrow.transform.rotation = Quaternion.LookRotation(tempVector);
在这种情况下,箭头也不考虑x-z平面上的旋转。 在这两个示例中,myYAngle是从Frame.Pose.rotation.eulerAngles属性获得的。
在四元数的提取与新旋转的应用之间,我可能会丢失一些东西。
有人可以解释我如何从Frame.Pose中操纵旋转四元数以达到所需的效果吗?欢迎使用其他建议的方法。我正在使用三星Galaxy S9测试该应用程序。