AABB или Axis Aligned Bounding Box - очень простой и быстрый объект для проверки пересечения / сдерживания двух трехмерных областей.
Как вы предполагаете, вы рассчитываете min и max x, y, z длядве области, которые вы хотите сравнить, например, область, которая описывает усеченную область, и область, которая описывает сетку.Он выровнен по оси, потому что последующий куб имеет ребра, параллельные каждой оси системы координат.Очевидно, что это может быть немного неточным (ложные положительные результаты пересечения / сдерживания, но никогда не ложные отрицательные), и поэтому, после того как вы отфильтруете свой список с помощью теста AABB, вы можете подумать о выполнении более точного теста для оставшихся сеток.
Вы проверяете на пересечение / удержание следующим образом:
F = AABB усеченного конуса
M = AABB меша
bool is_mesh_in_frustum(const AABB& F, const AABB& M)
{
if( F.min.x > M.max.x || M.min.x > F.max.x || F.min.y > M.max.y || M.min.y > F.max.y || F.min.z > M.max.z || M.min.z > F.max.z )
{
return false;
}
return true;
}
Вы также можете посмотреть алгоритмы для ограничивающих сферориентированный ограничивающий прямоугольник (OBB) и другие виды ограничивающих объемов.В зависимости от того, сколько мешей вы рендерите, вам может понадобиться или не потребоваться более точный метод.
Чтобы создать AABB, вы можете просто пройтись по вершинам сетки и записать минимум / максимумЗначения x, y и z, с которыми вы сталкиваетесь.
Также учтите, что если сетки не деформируются, то ограничивающий прямоугольник в координатном пространстве сетки будет статическим, поэтому вы можете рассчитать AABB для всех сеток каккак только у вас есть данные вершин.
Тогда вам просто нужно убедиться, что вы предварительно преобразовали предварительно вычисленные минимальную и максимальную вершины AABB в координатное пространство усеченного конуса, прежде чем выполнять тест на каждом проходе рендеринга.
РЕДАКТИРОВАТЬ (для комментария):
AABB может давать ложные срабатывания, потому что это в лучшем случае точная форма области, которую вы ограничиваете, но, как правило, больше, чем область, которую вы ограничиваете.
Рассмотрим сферу, если вы используете AABB, это все равно что положить баскетбольный мяч в коробку, у вас есть все эти пробелы в углахполе, куда шарик не может добраться.
Или в случае усеченного конуса, где усеченный углы направлены внутрь камеры, AABB для него будет просто продолжаться прямо вдоль оси в направлении камеры, эффективно ограничивая область большего размера.чем камера может видеть.
Это источник неточности, но он никогда не должен приводить к выбору объекта, который находится даже немного внутри усеченного конуса, так что в худшем случае вы все равно будете рисовать некоторые сетки, которые находятся близкок камере, но все еще за пределами усеченного конуса.
Вы можете исправить это, выполнив сначала тест AABB и создав меньший список сеток, которые возвращают значение true, а затем выполнив более точный тест в этом меньшем списке с болееТочный ограничивающий объем для усеченного конуса и / или ячеек.