Быстрый способ трансформации AABB
При вращении объектов, возникает необходимость перерасчета AABB (Axis Aligned Bounding Box — Параллельный Осям Ограничивающий Прямоугольник). Сразу приходит простая идея — взять 8 вершин и повернуть их. Но в этом случае мы получим весьма дорогой способ. Нам потребуется, посчитать координаты самих вершин и координаты после трансформации, а уже после найти минимальное и максимальное значение.
Наиболее оптимальное решение:
function transformAABB(bbox, matrix) { var min_x = matrix.axisX * bbox.min.x; var max_x = matrix.axisX * bbox.max.x; var min_y = matrix.axisY * bbox.min.y; var max_y = matrix.axisY * bbox.max.y; var min_z = matrix.axisZ * bbox.min.z; var max_z = matrix.axisZ * bbox.max.z; var pos = matrix.getPosition(); return [ vec3.min(min_x, max_x) + vec3.min(min_y, max_y) + vec3.min(min_z, max_z) + pos, vec3.max(min_x, max_x) + vec3.max(min_y, max_y) + vec3.max(min_z, max_z) + pos ]; }
Конечно, есть и другие методы быстрого вычисления AABB после трансформации объекта, но этот способ оказался одним из наиболее быстрых и простых.