| Game Developer's Links Collection |
|
|
Использование выпуклых многогранников |
Данный алгоритм был предложен Ming C. Lin и John F. Canny в 1991 г., он работает с выпуклыми многогранниками и позволяет определить ближайшие точки двух многогранников, расстояние между ними, а также факт пересечения многогранников. Для поиска очередных ближайших точек алгоритм использует результаты предыдущего поиска и скорость его работы практически постоянна, т.е. не зависит от сложности многогранников. Почти постоянная скорость работы в данном случае обуславливается тем, что обычно положение объектов от кадра к кадру меняется достаточно слабо, таким образом, зная ближайшие точки многогранников из предыдущего кадра определить очередные ближайшие точки можно почти сразу. В отличии от алгоритма GJK, который ищет ближайшие точки сквозь многогранники, Lin-Canny в поиске ближайших точек "пробегает" по поверхности многогранников, проверяя вершины, линии и фейсы. Для данного алгоритма каждый многогранник представлен в виде набора фрагментов - вершин, линий и фейсов. Также, для каждого фрагмента известны соседние фрагменты и определена область Вороного (для этого можно использовать, например, библиотеку Qhull). Область Вороного - это множество точек, расположенных ближе к данному, чем к какому-либо другому фрагменту многогранника.
В качестве структур данных для
областей Вороного используются ячейки,
в которых хранятся плоскости,
ограничивающие область Вороного с
ссылками на соседние ячейки (с которыми
граничат плоскости). Теперь рассмотрим проверку попадания точки в область Вороного фрагмента многогранника. Существуют три основных комбинации - точка-вершина, точка-линия и точка-фейс. Точка-Вершина Если вершина V многогранника B является ближайшим фрагментом к точке P многогранника A, то точка P должна лежать внутри области Вороного вершины V, ограниченной плоскостями, перпендикулярными линиям, касающимся V (рис. 2).
Если же точка находится вне области
Вороного и лежит с другой стороны одной
из ограничивающих плоскостей, то это
означает, что по крайней мере одна из
соседних линий ближе к точке P, чем
вершина V. В этом случае алгоритм
возьмет соответствующую линию и
проверит, является ли она ближайшей к
фрагменту, содержащему точку P.
Если точка находится вне области
Вороного и лежит с другой стороны одной
из ограничивающих плоскостей,
проходящих через концы линии (это
означает, что одна из
соседних вершин ближе к точке P, чем
линия E) или одной из ограничевающих
плоскостей, параллельных нормалям
прилегающих фейсов (это означает, что
один из соседних фейсов ближе к точке P,
чем линия E), то алгоритм
возьмет соответствующую вершину или
фейс и
проверит, является ли этот фрагмент
ближайшим к
фрагменту, содержащему точку P.
Далее необходимо проверить, чтобы точка
лежала над плоскостью,
проходящую через фейс F, т.к. в
противном случае точка может находиться
внутри
многогранника.
Следующая сложность проявляется при попытке определить ближайшие точки фрагментов многогранников. Всего возможно 6 вариантов сочетаний фрагментов - вершина-вершина, вершина-линия, вершина-фейс, линия-линия, линия-фейс, фейс-фейс. Определить ближайшие точки в первых четырех комбинациях в общем труда не представляет, но вот в вариантах линия-фейс и фейс-фейс возможно возникновение неоднозначностей, особенно когда линии и/или фейсы параллельны (довольно запутанный субалгоритм, с помощью которого можно определить ближайшие точки в комбинациях линия-фейс и фейс-фейс я здесь приводить не буду). Из плюсов алгоритма можно отметить достаточно высокую скорость работы и меньшую чувствительность к ошибкам округления по сравнению с GJK, из минусов - большое количество дополнительной информации (предварительно определенные области Вороного) и сложности при определении ближайших точек (эта проблема решена в алгоритме V-Clip). Более подробно об алгоритме Lin-Canny можно
прочитать здесь: |
| |
|