1

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

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 度,我该如何找回那个角度?

4

2 回答 2

6

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

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

其中 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°。

于 2013-03-07T05:38:09.457 回答
5

我认为您正在计算反函数错误地以一种让我感到奇怪的方式。您应该使用asin逆sin 和acos逆cos。您正在计算乘法逆,而不是功能逆。虽然在这里,它似乎是同一件事。

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

ATAN2(3)

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

概要
            #包括
            双atan2(双Y,双X);
            浮动 atan2f(浮动 Y,浮动 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>
于 2013-03-07T04:14:49.453 回答