Я довольно новый программист, но я пытаюсь создать свой собственный физический движок без использования каких-либо библиотек.Это для межпланетной игры в мини-гольф.
У меня хорошо работает гравитация, основанная на плотности и расположении планет, и мое обнаружение столкновений работает правильно, но что делать, когда они сталкиваютсяэто то, что я не могу решить.
Планеты не будут двигаться, но использование Javascript для выполнения тригонометрии, необходимой для вычисления результирующей скорости, оказывается очень трудным.
Вот мой физический код, будучивыполняется с requestAnimationFrame:
var a = [0, 0];
// p is in the format [x, y, radius, density]
planets.forEach(function (p) {
var d = Math.sqrt((p[0] - ball.coor[0]) ** 2 + (p[1] - ball.coor[1]) ** 2);
var m = p[3] * 4 / 3 * Math.PI * p[2] ** 3;
var f = G * m / d ** 2;
var angle = Math.atan2(p[1] - ball.coor[1], p[0] - ball.coor[0]);
a[0] += f * Math.cos(angle);
a[1] += f * Math.sin(angle);
if (d < p[2] + ball.radius) {
var impulse = [0, 0];
// What to do here?
// This is the closest I got:
var velocitya = Math.atan(b.v[1] / b.v[0]);
var trianglea = Math.abs(velocitya - angle);
var currV = Math.sqrt(b.v[0] ** 2 + b.v[1] ** 2);
var newV = currV * bounciness;
var newa = (Math.PI / 2 - trianglea) * 2 + velocitya;
b.v[0] = newV * Math.cos(newa);
b.v[1] = newV * Math.sin(newa);
// Somehow I just can't get it right.
// It's the JavaScript, not the math concepts.
}
});
ball.v[0] += a[0];
ball.v[1] += a[1];
ball.coor[0] += ball.v[0];
ball.coor[1] += ball.v[1];
ball
- просто объект для мяча для гольфа.
Я пробовал различные методы, но я просто не могу заставить коллизии работать должным образом.Кажется, работа с указаниями и углами приносит мне горе.Я провел много исследований, но ничего из того, что я нашел, похоже, не решает мою проблему правильно.
Итак, вот мой вопрос: как я могу рассчитать импульс, используя ванильный JavaScript?
Примечание: Планеты не двигаются, и бодрость должна быть переменной.