2016-12-16 25 views
0

私の現在のプロジェクトでは、3D回転行列から方向ベクトルの角度距離を求める必要があります。与えられた3D回転行列と3D方向ベクトルが角度差を見つける

これを行うと思われるレガシーコードはバグであり、動作していません。私の問題を理解するのに役立つかもしれないので、私はそれを共有したいと思っています。

double angularDiff(bool isSideAngle, const Matrix& in3DRotationMatrix, const Vector& in3DDirection) 
{ 
    // Unit vector convertion 
    in3DDirection.Normalize(); 

    // Simple matrix vector multiplication 
    Vector newDir = in3DRotationMatrix*in3DDirection; 

    // Code suppose to find side angle difference 
    // or forward angle difference according to boolean parameter 
    if (isSideAngle) 
     result = atan2(newDir[1], newDir[0]); 
    else 
     result = atan2(newDir[2], newDir[0]); 

    return result;  
} 

上記の方法に欠けているものは何ですか?または私のアプローチを完全に変更する必要がありますか?方向ベクトルを与えると、回転行列からX方向とY方向の角度距離を求める最良の方法は何ですか?

+0

回転行列(座標系)にローカルなベクトルの方向を表す2つの角度があります。どの角度をお望みですか?あるいは、回転行列は3つの直交する方向ベクトルを定義し、[2つのベクトルの間の角度]を計算することによって、それぞれのベクトルの角度を見つけることができます(http://stackoverflow.com/questions/35438395/calculating-small-大 - 中 - 大 - ベクトル - 三次元)。 – ja72

+0

@ ja72私はそれらの両方が欲しいです。新しい関数の上のコードと同様に、createにはパラメータbool isSideAngleがあります。このブール値によれば、私はサイドアングルまたはフォワードアングルを計算します。 –

+0

ワールド座標またはローカル座標で 'in3DDirection'ですか? – ja72

答えて

1

ローカル座標系でベクターを作成してください(in3DDirectionは既にあると思います)。spherical coordinateの逆変換を適用してください。リンクの式(1)〜(3)を参照してください。

double x = in3DDirection[0], y = in3DDirection[1], z=in3DDirection[2]; 
double r = sqrt(x*x+y*y+z*z); 
theta = atan2(y,x); // range is -pi..pi 
phi = acos(z/r);  // range is -pi/2..pi/2 
+0

私はあなたが送るコードに決して回転行列が関与していないことに興味があります。 in3DDirectionはグローバル座標系にあり、回転行列を使って複数の方向ベクトルをローカル座標系に移動する必要があります。 –

+0

回転行列は、通常、ローカルからグローバルへの変換です。 'in3DDirection'をローカル座標に変換するには、' in3DRotationMatrix'の転置を使う必要があります。 – ja72

関連する問題