Comments 10
Ваше условие неверно:
Например, попробуйте такой случай:
Лучше написать так:
if ((obj1.x+obj1.width > obj2.width )&&(obj1.x < obj2.x + obj2.width)) XColl=true;
if ((obj1.y+obj1.height > obj2.height )&&(obj1.y < obj2.y + obj2.height)) YColl=true;
Например, попробуйте такой случай:
var obj1 = {x:10, y:10, width:10, height: 10};
var obj2 = {x:0, y:0, width:100, height: 100};
Лучше написать так:
if ((obj1.x + obj1.width >= obj2.x) && (obj1.x <= obj2.x + obj2.width)) XColl = true;
if ((obj1.y + obj1.height >= obj2.y) && (obj1.y <= obj2.y + obj2.height)) YColl = true;
+1
Спасибо исправил! Извиняюсь что заметил не сразу. В моем примере я искал столкновение квадратов, а там я использовал другой принцип нахождения пересечения.
//…
var X=X1-X2;
var Y=Y1-Y2;
var GIP=WIDTH1+WIDTH2;
if (X*X + Y*Y <= GIP*GIP)
{
return true;
}
//…
0
можно проще, в одну строку
return
((obj1.x + obj1.width >= obj2.x) && (obj1.x <= obj2.x + obj2.width)
&&
((obj1.y + obj1.height >= obj2.y) && (obj1.y <= obj2.y + obj2.height));
0
У меня вопрос к автору
Как решается задача про пересечение прямоугольников ( можно проще — кругов ), когда один из них — неподвижен, а второй движется со скоростью, при которой за один такт вычислений он перемещается дальше, чем максимальный его размер ( размер метр на метр, скорость 10 м/такт, например )
Как решается задача про пересечение прямоугольников ( можно проще — кругов ), когда один из них — неподвижен, а второй движется со скоростью, при которой за один такт вычислений он перемещается дальше, чем максимальный его размер ( размер метр на метр, скорость 10 м/такт, например )
+1
Ваш вопрос это шаг к разработке физическому движку проекта. Смысл моей статьи был в том, что не всегда есть необходимость в таких движках. Поэтому в рамках статьи я не могу ответить на ваш вопрос. И если честно, физикой в играх я не занимался и ближайшее время не планирую, т.к. на мой взгляд грех — создавать что то слишком «навороченное» на HTML5.
-1
Самый простой способ — просто разбить вычисления на количество шагов (расстояние / радиус).
Способ быстрый — взять вектор движения каждого угла прямоугольника. Далее — проверить пересечения векторов движения и линий неподвижного прямоугольника. В случае с кругом — взять вектор движения центра круга, получить от него два равноудаленных (на расстояние радиуса) вектора с одинаковой длиной. Затем от неподвижного круга получить отрезок-диаметр круга, направленный перпендикулярно вектору движения первого круга. После точно так же проверяются пересечения линий (только уже не восьми, а трех).
Извиняюсь, если где-то чего-то неправильно написал (и буду рад, если меня поправят), но мне почему-то кажется это именно так :-)
Способ быстрый — взять вектор движения каждого угла прямоугольника. Далее — проверить пересечения векторов движения и линий неподвижного прямоугольника. В случае с кругом — взять вектор движения центра круга, получить от него два равноудаленных (на расстояние радиуса) вектора с одинаковой длиной. Затем от неподвижного круга получить отрезок-диаметр круга, направленный перпендикулярно вектору движения первого круга. После точно так же проверяются пересечения линий (только уже не восьми, а трех).
Извиняюсь, если где-то чего-то неправильно написал (и буду рад, если меня поправят), но мне почему-то кажется это именно так :-)
+1
По поводу неподвижности второго объекта — я слегка упростил.
Думаю проще объяснить задачу на примере.
Есть космический корабль, движущийся со скоростью несколько десятков километров в секунду при линейных размерах 10 метров. Также есть астероид, дрейфующий со скоростью несколько метров в секунду.
Задача — проверить, не столкнётся ли корабль с астероидом
Думаю проще объяснить задачу на примере.
Есть космический корабль, движущийся со скоростью несколько десятков километров в секунду при линейных размерах 10 метров. Также есть астероид, дрейфующий со скоростью несколько метров в секунду.
Задача — проверить, не столкнётся ли корабль с астероидом
+1
Тогда проще взять описанные окружности объектов и проверить сначала их — взять векторы движения по бокам окружностей, продлить их в обе стороны на расстояние радиуса, а затем проверить все векторы на наличие пересечений. Если таковые имеют место быть, рассмотреть ситуацию в месте пересечения (либо между местами пересечения) более подробно, в том числе разбивая вычисления на более мелкие отрезки. Имхо, как-то так.
0
перемещение некоторых объектов заменяется фогурами. допустим пуля вполне может быть заменена отрезком, в универсальном случае заменяем ориентированным боундинг боксом или цилиндром, который включает в себя начальное и конечное положение объекта. определяются пары объектов которые могли взаимодействовать и время возможного взаимодействия, находим минимальное — это первый шаг симуляции. дальше перерасчитываем скорости провзаимодействовавших объектов и повторяем с момента получения бокса или цилиндра движения. и так до тех пор пока не получим конечную точку симуляции.
но так редко делают в играх для всех объектов, так как миры довольно разрежены и объекты сталкиваются реже чем раз за тик, но попадание пуль/ракет определяется таким образом ибо двигаются они слишком быстро.
но так редко делают в играх для всех объектов, так как миры довольно разрежены и объекты сталкиваются реже чем раз за тик, но попадание пуль/ракет определяется таким образом ибо двигаются они слишком быстро.
0
Sign up to leave a comment.
Базовая теория столкновения объектов, спрайтов на Javascript