2010-12-13 3 views
1

У меня с трудом обнаружено обнаружение столкновения по опыту. Я делаю коробку, à la Minecraft, и нахожусь на стадии внедрения обнаружения столкновений.C++ 3D идеальное обнаружение столкновений

Я сделал оси 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, когда игрок падает с высокой скоростью и даже при определении респектабельного поля столкновения он в конечном счете выглядит противным (игрок наполовину похоронен).

ответ

3

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

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

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

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

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

+0

Ну, там код на 2 дня стоит. Не только непрерывная модель является точной, но и дешевле (в данном случае). – Solenoid

2

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

Смежные вопросы