Волновой вектор в 2 измерениях - PullRequest
2 голосов
/ 08 февраля 2012

Итак, я пытаюсь заставить игрока выстрелить в пулю, которая движется к мышке волнообразным образом.Я могу заставить пулю двигаться волнообразно (хотя и не совсем так, как я предсказывал), но не в направлении мыши.

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 Ответ

3 голосов
/ 08 февраля 2012

В псевдокоде вам нужно сделать следующее:

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);

Это должно вычислить волновой вектор в традиционной системе координат, а затем повернуть ее в локальную систему координат вектора направления (где вектор направления - это локальная ось х), а затем преобразовать волновой вектор относительно желаемой исходной позиции волны луч или чего-либо еще ...

Это приведет кфункция очень похожа на

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...