波矢量2维

时间:2012-02-07 21:36:24

标签: c++ vector wave

所以我试图让玩家以波浪形图射出朝向鼠标的子弹。我可以让子弹以波浪形式移动(尽管不是我预测的那样),但不是朝向鼠标。

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/8圈。

我可能在某处错误地计算了某些东西。我只是了解波矢量。

我尝试了一些其他的东西,比如一维行波和另一件涉及通过vec调整正常正弦波的事情。这或多或少有相同的结果。

谢谢!

编辑:

vec是从玩家位置到鼠标点击位置的位移。返回是一个新的向量,经过调整以遵循波形模式,每次子弹接收和更新时都会调用BulletFun::sine

设置是这样的:

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

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

1 个答案:

答案 0 :(得分: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);
}