3D向量的角度 - 获取两个角度

3

我有一个物体A,它有一个速度。速度被指定为3D向量a = (x, y, z)。位置是3D点A [X, Y, Z]。我需要找出,当前的速度是否将这个物体带到另一个位于位置B [X, Y, Z]的物体B。
我已经成功地在2维中实现了这一点,忽略了第三个维度:

   /*A is projectile, B is static object*/
    //entity is object A
    //  - .v[3] is the speed vector
    //position[3] is array of coordinates of object B    


    double vector[3];                               //This is the vector c = A-B
    this->entityVector(-1, entity.id, vector);      //Fills the correct data
    double distance = vector_size(vector);          //This is distance |AB|
    double speed = vector_size(entity.v);      //This is size of speed vector a

    float dist_angle = (float)atan2(vector[2],vector[0])*(180.0/M_PI);           //Get angle of vector c as seen from Y axis - using X, Z
    float speed_angle = (float)atan2((double)entity.v[2],entity.v[0])*(180.0/M_PI); //Get angle of vector a seen from Y axis - using X, Z
    dist_angle = deg180to360(dist_angle);             //Converts value to 0-360
    speed_angle = deg180to360(speed_angle);           //Converts value to 0-360
    int diff = abs((int)compare_degrees(dist_angle, speed_angle));   //Returns the difference of vectors direction

我需要创建完全相同的比较来使其在3D中工作-现在,Y位置和Y向量坐标被忽略。
我应该做什么计算来获得第二个角度?

根据答案进行编辑:
我正在使用球面坐标并比较它们的角度以检查两个向量是否指向相同方向。其中一个向量是A-B,另一个是A的速度,我正在检查A是否朝着B前进。


你有什么问题?“第二个角度”是什么意思? - gspr
1
我猜你想知道向量a是否与向量B-A平行,我的猜测正确吗?如果是的话,只需计算它们的点积,看看它是否接近于1即可。 - gspr
点积在某个范围内是否有效?我的意思是,我能否判断它们不是平行的,但它们很接近? - Tomáš Zato
两个归一化向量的点积是它们之间夹角的余弦值。接近1意味着它们几乎平行,接近-1意味着它们几乎平行但方向相反,接近0意味着它们几乎正交。点积始终有效。 - Alexey Frunze
请在 Mathematics SE 上提出数学问题。 - GManNickG
@GManNickG: 我也对实现很感兴趣。我知道有数学StackExchange分支。 - Tomáš Zato
1个回答

5

我假设你要找的“第二个角度”是φ。也就是说,你正在使用球坐标:

(x,y,z) => (r,θ,φ)
r = sqrt(x^2 + y^2 + z^2)
θ = cos^-1(z/r)
φ = tan^-1(y/x)

然而,如果你只想要查找A是否以速度a向B移动,则可以使用点积得到基本答案。
1st vector: B - A (vector pointing from A to B)
2nd vector: a (velocity)
dot product: a * (B-A)

如果点积为0,意味着你没有更接近目标 - 你只是在以B为中心、半径为||B-A||的球面上移动。如果点积大于0,则表示你正在向该点移动,而如果点积小于0,则表示你正在远离它。

谢谢,我想这个解释将来会帮助我很多次 :) - Tomáš Zato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接