Нормализовать расстояние между шариками (после столкновения) - JavaScript - PullRequest
0 голосов
/ 26 августа 2011

Я пытаюсь нормализовать расстояние между двумя шарами после обнаружения столкновения

обнаружение столкновения

do_shapes_collide: function(shape1,shape2)
{
    var reach1 = shape1.radius + shape1.velocity() + vr.o.border_width;
    var reach2 = shape2.radius + shape2.velocity() + vr.o.border_width;

    var distance = vr.distance(shape1, shape2);

    return distance < reach1 + reach2;

},

поэтому, как только мы определили, что эти сферы сталкиваются, мне нужно сбросить их расстояние друг от друга ... Я вспоминаю свои дни в классе алгебры с формулами точки / наклона и т. Д ...

У меня есть необходимое расстояние, которое должно существовать между ними, и (как я считаю, угол столкновения).

Мне нужно установить shape x / y на угол столкновения.

рисуя пробел на том, что я должен сделать, чтобы установить shape х и у ...

if (vr.do_shapes_collide(shape, next_shape))
{
    var req_distance = shape.radius + next_shape.radius + (vr.o.border_width * 2);
    var slope = (shape.y - next_shape.y) / (shape.x - next_shape.x);
    shape.x = 
    shape.y =
}

1 Ответ

3 голосов
/ 26 августа 2011

Думайте векторы.Если у вас две фигуры перекрываются, у вас есть вектор от центра одной к центру другой, например, так (это имеет смысл только после добавления их скоростей к их позициям, поскольку именно тогда они будут перекрываться):

var diff = {
    x: next_shape.x - shape.x,
    y: next_shape.y - shape.y
};

Это вектор от shape до next_shape.И у него есть меньшая величина (это короче), чем это должно быть для форм, чтобы остаться в стороне.Таким образом, чтобы найти количество, которое необходимо переместить фигурам

var diff_magnitude = Math.sqrt(diff.x*diff.x + diff.y*diff.y);
var overlap = (req_distance - diff_magnitude) / 2; // each shape needs to move this distance

Теперь масштабируйте вектор diff, чтобы соответствовать расстоянию / величине

diff.x = overlap * diff.x / diff_magnitude;
diff.y = overlap * diff.y / diff_magnitude;

Наконец, переместите одну фигуру в однунаправление, а другая фигура - в противоположном направлении

shape.x -= diff.x;
shape.y -= diff.y;
next_shape.x += diff.x;
next_shape.y += diff.y;

Теперь две фигуры должны быть направлены друг против друга.

Вы также захотите установить их скорости вположительное / отрицательное направление diff, поэтому они продолжают движение по этой траектории после столкновения, если действительно сохраняют свои скорости.

Обратите внимание, что это на самом деле не "отскакивает" формы друг от друга, а толькоудаляет их достаточно, чтобы устранить перекрытие, которое существует после того, как они начали перекрываться.Так что это довольно упрощенно.Но существует множество источников, которые дадут вам более точные методы обнаружения столкновений и реагирования на них.

...