- Z-ROLLを無視することにして、向きのベクトルを与えてピッチ角とヨー角を計算して取り出す
- 向きのベクトルと、それに直行するベクトルを与えて、ロール角も取り出す
という2つの計算方法がまず考えられます。この方法はクォータニオンを元にベクトルを回転させて、その2つのベクトルのなす角度を計算しています。
他方、クォータニオンの4元数 x, y, z, w から直接計算する式もあります。
float Quaternion::getPitch()
{
return atan2(2*(y*z + w*x), w*w - x*x - y*y + z*z);
}
float Quaternion::getYaw()
{
return asin(-2*(x*z - w*y));
}
float Quaternion::getRoll()
{
return atan2(2*(x*y + w*z), w*w + x*x - y*y - z*z);
}
計算される角度は最短距離の角度であり、ベクトルを使って射影し、なす角度を測る場合に比べると、クォータニオンらしい値が出てくることになります。たとえば真後ろへの振り向きがヨー180°ではなく、ロール180°ピッチ-180°だったり……この値は再計算や保存値に使うには心もとないですが、単独で計算できるため、画面出力やダンプに向いています。
