Преобразование лучей формы: лучший способ определить последнюю позицию, которая НЕ пересекает что-либо?

Я использую Box2D (в частности, jBox2D), и я пытаюсь сделать тетрис-подобное столкновение блоков (т.е. останавливаться непосредственно перед тем, как они перекрывают друг друга, чтобы они плавно сцеплялись)

Каков самый простой способ определить последнюю позицию на «луче» перед пересечением фигуры с другой? (т. е. определить, в каком положении должен оказаться блок, если он движется в определенном направлении, чтобы он плавно блокировался с другими блоками) Box2D, похоже, предоставляет общие функции raycasting, но я не вижу, как это легко сделать с предоставленными функциями.


(Примечание: в целом блочная игра может быть смоделирована как сетка, и это значительно упрощает обнаружение столкновения/пункта назначения, поскольку вам не нужно полагаться на фактические свойства 2D/3D. Однако использовать сетку, подобную этой, невозможно. в моей ситуации)


person David Roberts    schedule 12.06.2011    source источник
comment
Хм, а нельзя ли просто найти длину, которую должен пройти луч, чтобы пересечь другой объект, вычесть крошечный эпсилон (0.00001 или что-то в этом роде) и использовать это расстояние?   -  person Blender    schedule 13.06.2011
comment
@Blender: я использовал аналогичный метод до сих пор (хотя я непрерывно вычитал очень небольшое количество из конца луча, проверял пересечение, а затем продолжал до тех пор, пока пересечение больше не происходило). Проблема здесь только в точности — иногда блокировка будет выглядеть идеально, иногда немного не так. Я также просто подумал, что должен быть лучший метод   -  person David Roberts    schedule 13.06.2011
comment
Вы имеете в виду, что вы тестируете луч длиной x единиц, и если он попадает, вы делаете x немного меньше и пытаетесь снова, до тех пор, пока он не попадет? Вам не нужно этого делать, потому что функция raycast (правда, Box2D?) сообщит вам, как далеко находится перекресток. См. здесь более четкое описание: iforce2d.net/b2dtut/raycasting Затем сделайте то, что сказал Блендер.   -  person iforce2d    schedule 13.06.2011


Ответы (1)


Хорошо, я думаю, что у меня есть способ обойти эту проблему, по крайней мере, для моего случая - после того, как я определил точку пересечения из raycast как обычно, я придумал несколько функций, которые могут определить (на основе размер и форма пересекаемого объекта + пересечение) положение, в котором объект должен «прибыть», чтобы хорошо сцепиться с другим блоком. Так что я в основном решаю ту же проблему, но не напрямую с самим raycast. Есть несколько крайних случаев, когда это не работает так хорошо, но на данный момент этого достаточно для моего проекта.

Однако мне все еще интересно, есть ли точный ответ на первоначальный вопрос: существует ли метод или вариант поверх обычного raycasting, который может определить последнее «хорошее» положение фигуры перед ее пересечением? ?

@iforce2d iforce2d - Может быть, я неправильно понял, но, конечно же, информация, которую дает мне Box2D, будет только о том, где находится перекресток и как далеко он от начала? Ни один из них полностью не делает то, что я хочу - мне нужна последняя точка перед пересечением, где две фигуры можно расположить так, чтобы они не пересекались (т.е. как можно ближе друг к другу). возможно получить без пересечения)

person David Roberts    schedule 13.06.2011
comment
Вы не должны комментировать @ людей в своих ответах. Если вы хотите продолжить обсуждение проблемы с людьми, публикующими эти вещи в виде комментариев или, что еще лучше, откройте чат. :) - person ; 08.02.2012