3

速度のあるオブジェクト A があります。速度は 3D ベクトルとして指定されますa = (x, y, z)。位置は 3D ポイントA [X, Y, Z]です。現在の速度がこのオブジェクトを位置 の別のオブジェクト B に導くかどうかを調べる必要がありますB [X, Y, Z]
3番目の次元を無視して、これを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 ベクトル座標は無視されます。
2 番目の角度を取得するには、どのような計算を行う必要がありますか?

回答に基づいて編集
: 球座標を使用し、それらの角度を比較して、2 つのベクトルが同じ方向を向いているかどうかを確認しています。1 つのベクトルが AB で、別の A の速度で、ID A が B に向かっていることを確認しています。

4

1 に答える 1

5

あなたが探している「2番目の角度」はφだと思います。つまり、球座標を使用しています。

(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 に答える