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) から回転角度 (シータ) を取得するには、次の式を使用できます。

tr(R) = 1 + 2 * cos(シータ)、

ここで、tr はtraceです。

あなたの例では、回転は次のように与えられます。

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と逆cosに使用する必要がありますacos関数の逆数ではなく、乗法の逆数を計算しています。ここでも同じように見えます。

関数を使用しatan2()ます。y値とx値から角度が得られます。逆sinと逆cosを暗黙的に計算し、yとxの両方の符号をチェックして正しい象限を検出します。

ATAN2(3)

名前
       1.8 `atan2'、` atan2f'--y/xのアークタンジェント

概要
            #含む
            double atan2(double Y、double 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を取得し続けます。


告白。

Cの代わりにPostscriptを使用したため、上記のラジアン/度の問題について詳しく説明しました。

$ 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 に答える