速度のあるオブジェクト 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 に向かっていることを確認しています。