2016-09-01 2 views
0

J'ai fait une fonction get_angle à l'intérieur de ma classe Vector3 mais j'ai un problème avec celle-ci.obtenir l'angle entre deux points 3d

L'angle Y est parfaitement parfait. L'angle de pas (X) qu'il renvoie est légèrement au-dessus de ma position de destination lorsque le vecteur de base est dessus (et quand il se passe sous le contraire).

La quantité de ce qui est faux dépend de la différence de hauteur.

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); 
} 

C'est probablement mes maths qui sont mauvais ici.

Répondre

0

Qu'essayez-vous exactement de calculer? Que représente votre classe "Angle"? Je suppose que vous voulez, soit:

  1. Calculer l'angle entre les deux vecteurs, à savoir une seule valeur scalaire. La formule peut être trouvée ici comme 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. Ou, pour convertir des vecteurs de coordonnées sphériques (phi, thêta), et calculer un delta pour chaque phi et thêta, à savoir vous calculer deux angles. La formule de conversion de cartésiennes en coordonnées sphériques se trouve ici: https://en.wikipedia.org/wiki/Spherical_coordinate_system#Cartesian_coordinates

+0

Ma classe d'angle représente les 3 angles de l'espace 3D: tangage, lacet et rouleau. J'ai cependant résolu mon problème. Publié le problème qu'il avait dans un autre message. –

0

J'ai trouvé une solution à mon problème:

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 
    ); 
}