C ++ 3D идеальное обнаружение столкновений - PullRequest
1 голос
/ 14 декабря 2010

Мне трудно учиться обнаружению столкновений на собственном опыте. Я делаю коробочную игру, как Minecraft, и нахожусь на стадии реализации обнаружения столкновений.

Я сделал оси x и y ', так как все состоит из кубов, я хотел бы сделать свой собственный детектор столкновений и сделать его как можно более легким.

Есть ли способ сделать "идеальные по пикселям" столкновения, то есть когда ограничивающий прямоугольник (или круг) игрока касается ящика, который он регистрирует как столкновение? Прямо сейчас это то, что я сделал:

if(-TOUCH_DISTANCE-1 < yPlayer-yBox && yPlayer-yBox < TOUCH_DISTANCE-1)
{
    collisionNorth = true;
}
if(-TOUCH_DISTANCE+1 < yPlayer-yBox && yPlayer-yBox < TOUCH_DISTANCE+1)
{
    collisionSouth = true;
}

Он в основном обнаруживает столкновение в пределах определенного поля, и это означает ошибки, которые мне не нравятся :(. Обратите внимание на +/- 1, который смещает "стену столкновения" к соответствующей стороне поля.

Это работает на более низких скоростях, но когда есть какое-то действие (когда я разбираю переменную скорости), столкновение больше не может быть обнаружено, так как я иду слишком быстро и прохожу прямо через куб ... Есть ли способ сделать это доказательством wallhax0r?

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

Ответы [ 2 ]

3 голосов
/ 14 декабря 2010

Вы определили одну из проблем использования дискретной математики для моделирования пути объекта. Во время t объект находится «здесь», а во время t + delta он «там» - фактически не пройдя через промежуточные точки.

Вы можете получить больше точности, уменьшив дельту, но в конечном итоге вы достигнете предела того, что вы можете рассчитать за этот промежуток времени.

Если вы можете обнаружить приближающееся столкновение, используя относительно большую дельту времени и свободную ограничивающую рамку, вы можете затем повысить точность, но снова вы достигнете пределов.

Преобразование в непрерывную модель может помочь, но может потребовать больше вычислительных мощностей. Вы можете переключиться на это, когда ваши объекты находятся рядом, поэтому вы не делаете это все время.

Извините, у меня нет определенного ответа, только указатели.

2 голосов
/ 14 декабря 2010

Обычно вам нужно отслеживать предыдущую позицию объектов, а также текущую позицию. Затем при обновлении вы можете проверить, пересекались ли объекты в течение периода времени, а не пересекаются ли они «в данный момент».

...