旋转 - Yaw Roll Pitch

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

我正在尝试根据传感器值(俯仰滚转偏航)旋转对象。我有以下脚本代码片段来旋转对象。

if ((0<=ax&& ax<1.03f) && (0 <= az && az <1.03f))
        {
            if (x > calibrateX)
                x = x - calibrateX;
            else
                x = calibrateX - x;
            //x = Mathf.Abs(x);
            Debug.Log("0-90 Rotation on X @ " + x);

            Quaternion xangle = Quaternion.Euler(new Vector3(x, transform.eulerAngles.y, transform.eulerAngles.z));
            transform.rotation = Quaternion.Slerp(transform.rotation, xangle, Time.deltaTime * 2f);
        }
        //Pitch 90-180;
        else if ((0<= ax && ax<1.03f) && (-1.03f<=az && az< 0))
        {
            x = x+180;
            Debug.Log("90-180 Rotation on X @ " + x);
            Quaternion xangle = Quaternion.Euler(new Vector3(x, transform.rotation.eulerAngles.y, transform.rotation.eulerAngles.z));
            transform.rotation = Quaternion.Slerp(transform.rotation,xangle, Time.deltaTime*2f);
        }

该脚本适用于0到90之间的角度。旋转平稳且符合预期。但是,当角度在90 -180之间时,物体旋转不平滑。在编辑器中,它看起来像是在两点之间跳跃。例如,如果角度为110(xangle),则对象在角度110和70之间跳跃。这发生在90-180之间的任何角度。

我需要帮助才能理解我做错了什么。谢谢你的quantime。

unity3d rotation quaternions euler-angles
1个回答
0
投票

问题可能出在x = x + 180。据Quaternion.Euler's documentation说:

返回围绕z轴旋转z度,围绕x轴旋转x度,围绕y轴旋转y度的旋转。

因此,如果x从0到90然后从90到180,则目标旋转将是:0到90然后是270到360。

为了更好地理解问题,您可以发布x的计算方式。

从现在看来x似乎只是角度间距,解决方案就是删除x = x + 180

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