|

рис.1
пример AABB в 2D
|
|
Хранить AABB лучше в виде двух
векторов - позиции в пространстве (P)
и размеров (E), но если планируется
использовать проверку на
пересечение со сферой, можно также
сохранить и минимальную (vMin) и
максимальную (vMax) точки. (рис. 1, а
также Пример класса AABB)
Обратите внимание, что размеры AABB
указываются относительно позиции в
пространстве.
|
Итак, для того, чтобы построить AABB для объекта,
нужно всего лишь найти размеры объекта
по осям координат, т.е. границы объекта.
Это можно сделать, например, следующим
образом (предполагается, что Vertices - это
массив, в котором находятся уже
трансформированные в мировое
пространство вершины объекта):
void cdAABB::CreateFromVertices(const TArray<mVector>
&Vertices)
{
vMin = vMax = Vertices[0];
// ищем минимальную/максимальную точки
for (int i=1;i<Vertices.Num();i++)
{
// проходим по x,y,z
for (int t=0;t<3;t++)
{
vMax[t] = max(vMax[t], Vertices[i][t]);
vMin[t] = min(vMin[t], Vertices[i][t]);
}
}
// вычисляем размеры
E = (vMax - vMin) / 2.f;
// и положение в пространстве
P = vMin + E;
}
Легко заметить, что
на проверку всех вершин объекта (которых
может быть несколько сотен или даже
тысяч) может
уйти огромное количество времени -
строить AABB придется каждый кадр, т.к. при
вращении объекта размеры AABB меняются.
В случае же аппаратного T&L это вообще
недопустимая трата ресурсов, т.к. работа
ускорителя в части трансформации
дублируется.
|
Обойти это
проблему можно, если
воспользоваться OBB - построить один
раз Bounding Box и вращать его вместе с
объектом, а для создания AABB
использовать только 8 точек этого OBB.
Таким образом всего за 8
трансформаций мы получаем AABB и
теряем точность проверки (рис.2) |

рис. 2
К вопросу о точности |
|
зеленым
цветом обозначен OBB,
красным -
оптимальный AABB,
циановым
- AABB, построенный с помощью OBB. |
Также можно в
качестве AABB использовать куб такого
размера, чтобы объект в любом положении
не выходил за его пределы. Разумеется, в этом
случае вообще ничего пересчитывать не
надо, но зато точность проверки
существенно снижается.
Итак, полученный с помощью вышеперечисленных махинаций
AABB иногда более чем в два раза превышает
размеры самого объекта и здесь возникает
законный вопрос - а зачем вообще такие
сложности? Проще сразу использовать OBB и
не мучиться с преобразованиями туда-сюда...
Однако проверка на столкновения с AABB все
еще быстрее, чем любая другая, и хотя
выбор AABB в качестве единственной
проверки, мягко говоря, не является
лучшим вариантом, использовать AABB для предварительной
грубой проверки перед более точной
и более медленной,
можно и нужно. |