Коллизии машины и объектов на ландшафте
Автор: Alena Категория: Программист
Нехорошо когда машина может проехать сквозь здание, стоящее на ландшафте. Чтобы такого безобразия не случалось, надо спрограммить коллизии между машиной и объектами.
Все здания у нас трудами Джима забраны в охватывающие боксы. Игроку они не виды, но на самом деле все здания выглядят примерно так:

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

А вот с теми объектами, что по сферам пересеклись, начинается уже более вдумчивая работа. Сначала я пыталась машину таки оставить сферой, и делать пересечения такой сферической машины и объектов на ландшафте. Пересечения сфера-бокс строить гораздо проще и быстрее, чем пересечения бокс-бокс. Получилось, как ни странно, отвратительно. Если брать сферу такого размера, чтобы машина туда влезла целиком, то у машины появляются эдакие невидимые крылья, которые за все по дороге цепляются. Если брать сферу маленького размера, то машина носом и кормой норовит провалиться туда, куда ей проваливаться совсем не следует. После серии экспериментов я попробовала приблизить машину не одной, а несколькими сферами, получалось похоже на гусеницу. А потом Джим уговорил меня не извращаться и построил для машины охватывающий бокс.
И мне таки пришлось строить коллизии бокс-бокс. Я не раз видела такое радостное восклицание: “А что тут строить! Нужно проверить, чтобы вершины одного бокса не попадали внутрь другого и все дела”. Вот такое вот работать не будет. Потому что вот боксы, вершины ни одного из них внутрь другого не попадают, но при этом они прекрасно себе пересекаются.

Для построения коллизий бокс-бокс есть весьма известный алгоритм разделяющих осей. Вот его я и использую. Его описание с кодом есть на Гамасутре.
Можно пойти дальше и построить еще более точную коллизию, подсчитать все до треугольника. Но я так делать не стала, боксов нам вполне хватит.
Построить коллизии мало. С коллизиями есть такая неприятная штука. Машина может в коллизии застрять навечно. Чтобы такого не случалось есть различные методы решения этой проблемы. Пока я искала что-либо подходящее для нашего случая, я изобрела свой собственный метод. Очень не люблю я что-либо изобретать и подозреваю, что я далеко не первая изобрела что-либо подобное, но мое изобретение мне понравилось и я его реализовала. Итак, у нас машина охвачена двумя боксами. При движении вперед я проверяю только передний, при движении назад только задний. Два бокса оказались хороши еще и тем, что так машина охватывается значительно лучше.

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


А если поставить сферы на каждый угол бокса и проверять их?
Автор: Alena (03.29.06, Март 29, 2006, 10:21)Это аналогично проверке четырех вершин, этого недостаточно. Применительно к машине, ситуация в которой это не будет работать: машина врезается в сравнительно тонкую перекладину, находящуюся на некоторой высоте от земли.