欧拉角的定义与计算

       项目需要欧拉角的相关计算,最近告一段落,在此总结一下。

       百度了一下欧拉角的定义,用来确定定点转动刚体位置的3个一组独立角参量,由章动角θ、旋进角(即进动角)ψ和自转角j组成,为欧拉首先提出而得名。后面一串冗杂的公式计算,第一眼看到我是拒绝的,这什么玩意啊,怎么算啊,不要慌,其实欧拉角的计算主要分成三个轴上的旋转,分别是x轴的pitch,y轴的yaw,z轴的roll。下面借一下飞机的图片,这三张动图形象的表示了欧拉角的旋转方式。第一张是绕x轴旋转pitch,第二张绕y轴旋转yaw,第三张是绕z轴旋转roll。    

                                       欧拉角的定义与计算_第1张图片                                                                                        欧拉角的定义与计算_第2张图片

                                     欧拉角的定义与计算_第3张图片

       其实就相当于飞机是一个坐标系,地面也是一个坐标系,飞机的坐标系是局部坐标系,也可以叫做机体坐标系,地面的坐标系是世界坐标系,两者都是右手坐标系,欧拉角的pitch就是局部坐标系的X轴与世界坐标系的Y轴的夹角,yaw就是世界坐标系的X轴与局部坐标系铅垂面的法向量的夹角,其中局部坐标系铅垂面就是下图的阴影面,roll就是局部坐标系的Z轴与局部铅垂面法向量的夹角。其中pitch值不能超过90度,这里牵扯到了万向锁的知识,有兴趣的可以去搜索一下四元数和欧拉角的关系,在此就不多做介绍了。

欧拉角的定义与计算_第4张图片

       最后贴一下计算角度的代码:

    private float ComputePlusMinusEulerAngle(Vector3 from, Vector3 to)
    {
        Vector3 v3 = Vector3.Cross(from, to);
        float x = Vector3.Angle(from, to);        

        if (x >= 90)
        {
            if (x == 90) return x;
            float temp = 180 - x;
            x = 90 - temp;
        }
        else
        {
            float temp = 90 - x;
            x = temp;
        }

        if (v3.z < 0)
        {
            x = -x;
        }

        return x;
    }

 

你可能感兴趣的:(游戏开发,Unity)