3

我有对象A,速度很快。速度被指定为 3D 矢量a = (x, y, z)。位置是 3D 点A [X, Y, Z]。我需要找出当前速度是否将该对象引向 position 上的另一个对象B [X, Y, Z]B。
我已经成功地在二维中实现了这一点,忽略了第三个:

   /*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 矢量坐标。
我应该怎么计算才能得到第二个角度?

根据答案进行编辑
: 我正在使用球坐标并比较它们的角度来检查两个向量是否指向同一方向。一个向量是 AB,另一个是 A 的速度,我正在检查 id A 正在前往 B。

4

1 回答 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,则意味着您没有靠近 - 您正在围绕一个恒定半径的球体 ||BA|| 移动。以 B 为中心。如果点积 > 0,您正在向该点移动,如果点积 < 0,您正在远离该点。

于 2013-03-22T23:23:15.507 回答