2016-09-01 16 views
0

私はVector3クラス内でget_angle関数を作成しましたが、問題があります。2つの3Dポイント間の角度を取得

Yの角度は完全に細かいです。

ベースベクトルがその上にあるとき(逆が起きているとき)、それが返すピッチ角(X)は目標位置をわずかに上回ります。

間違っている量は、高さの違いによって異なります。

Angle get_angle(const Vector3f& v) const { 
    return Angle(
     math::rad_to_deg(atan2(get_distance(v), v.z - z)) - 90.0f, 
     math::rad_to_deg(atan2(v.y - y, v.x - x)), 
     0.0f); 
} 

おそらく私の数学はここでは悪いです。

答えて

0

正確に何を計算しようとしていますか?あなたの「アングル」クラスは何を表していますか?

  1. は、2つのベクトル間の角度、すなわち、単一のスカラー値を計算します。 私はあなたのいずれかがしたいと思います。この式はここではcos(theta) == dot(*this, v)/(norm() * v.norm())です。

    https://math.stackexchange.com/questions/974178/how-to-calculate-the-angle-between-2-vectors-in-3d-space-given-a-preset-function
  2. あるいは、球面座標(PHI、シータ)の両方のベクトルを変換し、各ファイおよびシータのデルタを計算する、すなわち、次の2つの角度を計算します。球面座標へのデカルト座標から変換式は、ここで見つけることができる:https://en.wikipedia.org/wiki/Spherical_coordinate_system#Cartesian_coordinates

+0

を:ピッチ、ヨーおよびロール。 私の問題は解決しました。 問題を別の投稿に掲載しました。 –

0

私は私の問題への解決策が見つかりました:私の角度クラスは、3D空間から3つの角度表す

Angle get_angle(const Vector3f& v) const { 
    return Angle(
    math::rad_to_deg(
     atan2(
     sqrt(pow(X - v.X, 2) + pow(Y - v.Y, 2)), // the problem was here, 
               // the distance between the vectors should not include the Z position distance in it 
     v.Z - Z)) - 90.0f, 

    math::rad_to_deg(atan2(v.Y - Y, v.X - X)), // this worked correctly 

    0.0f // roll angle should always be 0.0f 
    ); 
} 
関連する問題