Как применить гравитацию к снаряду, имеющему направленную скорость? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть пуля, которая стреляет под углом.Я хочу, чтобы пуля реагировала на гравитационную силу.Следующий код находится в функции обновления пули.

this.pos.x += Math.cos(this.angle * Math.PI/4) * (this.vel.x);
this.pos.y += Math.sin(this.angle * Math.PI/4) * (this.vel.y);

Это означает, что пуля была выпущена в this.angle, которая не должна меняться.Скорости всегда должны находиться под углом this.angle.Теперь возникает вопрос: как мне добавить гравитацию?Вот то, что я пробовал до сих пор.

Следующий код просто изгибает пулю (вниз, но также вверх).

this.pos.x += Math.cos(this.angle * Math.PI/4) * (this.vel.x);
this.pos.y += Math.sin(this.angle * Math.PI/4) * (this.vel.y);
this.vel.y += GRAVITY

Я также пробовал это:

this.pos.x += Math.cos(this.angle * Math.PI/4) * (this.vel.x);
this.pos.y += Math.sin(this.angle * Math.PI/4) * (this.vel.y);
this.vel.y += Math.sin(this.angle * Math.PI/4) * GRAVITY

Последнее самое близкое, что я получил к тому, что я хочу, чтобы он делал.Однако, когда this.angle равно 0, sin(0) is also 0.Это приводит к странному неправильному поведению снаряда, когда угол равен 0.

Каковы лучшие / обычные обходные пути для этого?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Ваше уравнение положения не зависит от угла.Вам нужен только угол для инициализации значений vel.x и vel.y.

Вы должны иметь нормальную скорость и инициализировать их с помощью

var bulletSpeed = 100;
this.vel.x = Math.cos(this.angle)*bulletSpeed;
this.vel.y = Math.sin(this.angle)*bulletSpeed;

Затем обновите значения с помощью

this.pos.x += this.vel.x;
this.pos.y += this.vel.y;
this.vel.y += GRAVITY

Это не использует гравитацию в качестве ускорения, хотя, как я могу сказать, нет никакой временной переменной

0 голосов
/ 24 мая 2018

есть ли переменная для времени?если это так, то

this.vel.y += GRAVITY * time

может работать

...