項目需要歐拉角的相關計算,最近告一段落,在此總結一下。
百度了一下歐拉角的定義,用來確定定點轉動剛體位置的3個一組獨立角參量,由章動角θ、旋進角(即進動角)ψ和自轉角j組成,爲歐拉首先提出而得名。後面一串冗雜的公式計算,第一眼看到我是拒絕的,這什麼玩意啊,怎麼算啊,不要慌,其實歐拉角的計算主要分成三個軸上的旋轉,分別是x軸的pitch,y軸的yaw,z軸的roll。下面借一下飛機的圖片,這三張動圖形象的表示了歐拉角的旋轉方式。第一張是繞x軸旋轉pitch,第二張繞y軸旋轉yaw,第三張是繞z軸旋轉roll。
其實就相當於飛機是一個座標系,地面也是一個座標系,飛機的座標系是局部座標系,也可以叫做機體座標系,地面的座標系是世界座標系,兩者都是右手座標系,歐拉角的pitch就是局部座標系的X軸與世界座標系的Y軸的夾角,yaw就是世界座標系的X軸與局部座標系鉛垂面的法向量的夾角,其中局部座標系鉛垂面就是下圖的陰影面,roll就是局部座標系的Z軸與局部鉛垂面法向量的夾角。其中pitch值不能超過90度,這裏牽扯到了萬向鎖的知識,有興趣的可以去搜索一下四元數和歐拉角的關係,在此就不多做介紹了。
最後貼一下計算角度的代碼:
private float ComputeEulerAngle(Vector3 from, Vector3 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;
}
return x;
}