2012-02-07 15 views
2

私は、波状のパターンでマウスに向かって弾丸を弾くようにしています。私は弾丸を波状のパターンで動かすことができます(しかし、私が予測した方法ではありませんでしたが)。2次元の波ベクトル

Vector2 BulletFun::sine(Vector2 vec) { 
    float w = (2 * PI)/1000; // Where 1000 is the period 
    float waveNum = (2 * PI)/5; // Where 5 is the wavelength 

    Vector2 k(0.0F, waveNum); 

    float t = k.dot(vec) - (w * _time); 

    float x = 5 * cos(t); // Where 5 is the amplitude 
    float y = 5 * sin(t); 

    Vector2 result(x, y); 

    return result; 
} 

今の速度は、私はこれを考え出したらそれが問題のあまりすべきではない、心配のあまりないです。私はいくつかの角度の変更を取得しますが、それは逆転され、わずか1/8th円です。

私はたぶんどこかで誤算しています。私は波のベクトルについてちょっと知りました。

1次元の進行波や、通常の正弦波を調整する別のものをvecで試してみました。それは多かれ少なかれ同じ結果を持っていた。

ありがとうございます!

EDIT:

vecは、マウスクリックの場所にプレイヤーの位置からの変位です。返り値は、ウェイトパターンに従うように調整された新しいベクトルです。BulletFun::sineは、弾丸を受け取り更新するたびに呼び出されます。

セットアップは、このようなものです:擬似コードで

void Bullet::update() { 
    _velocity = BulletFun::sine(_displacement); 

    _location.add(_velocity); // add is a property of Tuple 
           // which Vector2 and Point2 inherit 
} 
+0

それはあなたが実際に欲しいものを見るのは難しいと非常によく似た機能になります。関数が与えられた 'vec'の値は何ですか?また、その返り値は何を表すのでしょうか? – leftaroundabout

答えて

3

、何をする必要があると、次のされています。伝統的な座標フレーム内の波数ベクトルを計算する必要があり

waveVector = Vector2(travelDistance,amplitude*cos(2*PI*frequency*travelDistance/unitDistance); 

cosTheta = directionVector.norm().dot(waveVector.norm()); 
theta = acos(cosTheta); 

waveVector.rotate(theta); 
waveVector.translate(originPosition); 

、およびそれを方向ベクトルのローカル座標フレーム(方向ベクトルはローカルx軸)に回転させ、波のベクトルを希望の原点の位置に合わせて翻訳しますビームまたは何でも...

これは

Vector2 
BulletFun::sine(Bullet _bullet, float _amplitude, float _frequency, float _unitDistance) 
{ 
    float displacement = _bullet.getDisplacement(); 
    float omega = 2.0f * PI * _frequency * _displacement/_unitDistance; 

    // Compute the wave coordinate on the traditional, untransformed 
    // Cartesian coordinate frame. 
    Vector2 wave(_displacement, _amplitude * cos(omega)); 

    // The dot product of two unit vectors is the cosine of the 
    // angle between them. 
    float cosTheta = _bullet.getDirection().normalize().dot(wave.normalize()); 
    float theta = acos(cosTheta); 

    // Translate and rotate the wave coordinate onto 
    // the direction vector. 
    wave.translate(_bullet.origin()); 
    wave.rotate(theta); 
} 
+0

ちょうどフォローアップ - これはあなたの質問に答えましたか? – hatboyzero

関連する問題