如何从矩阵中获取角度

我有一个像这样的旋转矩阵:

1.0 0.0 0.0 2.07814 0.0 -0.809017 0.587785 0.0 0.0 -0.587785 -0.809017 0.0 0.0 0.0 0.0 1.0 

我怎样才能从中获得角度? 如果我应用逆,我得到这个

 cos exp -1 (-0.809017) = 144.0 sin exp -1 (-0.587785) = -36.0 sin exp -1 ( 0.587785) = 36.0 cos exp -1 (-0.809017) = 144.0 

但我的问题是我知道角度是216.0度,我该如何回到那个角度?

我认为你正在计算反函数 不正确 以一种让我感到奇怪的方式。 你应该使用asin作为逆sin,并使用acos作为逆cos。 你正在计算乘法逆,而不是函数逆。 虽然在这里,它看起来是一回事。

使用atan2()函数。 它将从y和x值产生角度。 它隐含地计算逆sin和逆cos,并检查y和x的符号以发现正确的象限。

  ATAN2(3)

名称
        1.8`atan2',`atan2f' -  y / x的反正切

概要
             #包括 
            双atan2(双Y,双X);
             float atan2f(float Y,float X);

描述
        `atan2'计算Y / X的反正切(反正切)。  `ATAN2' 
       即使对于pi / 2或-pi / 2附近的角度,也能产生正确的结果
       是,当X接近0时。

           `atan2f'与`atan2'相同,除了它需要并返回`float'。

退货
        `atan2'和`atan2f'以弧度为单位返回一个值,范围为-pi到pi。

我假设我们忽略了2.07814,这显然不是轮换的一部分。 atan2(0.587785, -0.809017)给了我144.0度。 atan(-0.587785, -0.809017)给出216.0。


啊哈! 你的矩阵与我习惯的“横向”。 我认为2.07814部分只是一个翻译。 使用这个3d旋转矩阵作为指导,

 1 0 0 0 cos sin 0 -sin cos 

……让我像以前一样困惑。 我一直得到144.0。


坦白。

我忽略了上面的弧度/度问题,因为我使用的是Postscript而不是C.

 $ gsnd -q GS>0.587785 -0.809017 atan = 144.0 GS>-0.587785 -0.809017 atan = 216.0 GS> 

要从3×3旋转矩阵(R)获得旋转角度(θ),您可以使用以下公式:

tr(R)= 1 + 2 * cos(theta),

其中tr是迹线 。

在您的示例中,旋转由下式给出:

 1.00000 0.00000 0.00000 0.00000 -0.80902 0.58779 0.00000 -0.58779 -0.80902 

因此,痕迹是

 1 - 0.80902 - 0.80902 = -0.61804` 

角度为acos(( – 0.61804-1)/ 2)*(180 / pi)= 144°

因此,矩阵表示逆时针旋转144°。 或者,当144 = -216 mod 360时,它表示顺时针旋转216°。