私はゲームに2つのベクトルを持っています。 1つのベクトルはプレーヤー、1つのベクトルはオブジェクトです。私はまた、プレイヤーが向いている場合の方向を指定するベクトルを持っています。方向ベクトルにはzの部分はありません。それは起点のどこかに置かれた1の大きさを持つ点です。2点と方向ベクトルから角度を計算する
私は兵士が現在向いている方向とオブジェクトとの角度を計算したいので、いくつかの音声を正しくパンすることができます(ステレオのみ)。
下の図は私の問題を説明しています。私は2つの破線の間の角度を計算したいと思います。 1つの点線はプレーヤーとオブジェクトを接続し、もう1つはプレーヤーが向いている地点からプレーヤーが向いている方向を表す線です。
瞬間、私はこれをやっている(選手、オブジェクトと方向は、すべての3ポイントで、x、yおよびzを有するベクターあると仮定):
Vector3d v1 = direction;
Vector3d v2 = object - player;
v1.normalise();
v2.normalise();
float angle = acos(dotProduct(v1, v2));
しかし、与えているようです私は間違った結果になります何かアドバイス?コードの
テスト:3D空間で
Vector3d soldier = Vector3d(1.f, 1.f, 0.f);
Vector3d object = Vector3d(1.f, -1.f, 0.f);
Vector3d dir = Vector3d(1.f, 0.f, 0.f);
Vector3d v1 = dir;
Vector3d v2 = object - soldier;
long steps = 360;
for (long step = 0; step < steps; step++) {
float rad = (float)step * (M_PI/180.f);
v1.x = cosf(rad);
v1.y = sinf(rad);
v1.normalise();
float dx = dotProduct(v2, v1);
float dy = dotProduct(v2, soldier);
float vangle = atan2(dx, dy);
}
あなたの数学が健全である: は、その場合は数式を使用すると、便利な内積を持っている場合だけ少し複雑ですが、シンプルな。それはあなたが期待しているものと少し相殺されていますか?あなたがテストしていた番号を教えてください。 –
@Ron Warholic、oggmonster:数学は正しくありません。 1つの問題は、[0,2pi]の範囲の角度を必要とするとき、 'acos'は常に[0、pi]の範囲の角度を返します。あなたが情報を失うので、ドットプロダクトを取って、それから角度を計算することはできません。 あなたが必要とするものは[atl2]関数です。これは[-pi、pi]の範囲を持ち、[0,2pi]に十分接近しています - 単純な関数は絶対に必要な場合にこれを修正できますが、ほとんどの場合、大きな問題ではありません。 – dvitek
atan2の第2引数として何を使用すればよいですか? – oggmonster