Быстрый способ трансформации 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 после трансформации объекта, но этот способ оказался одним из наиболее быстрых и простых.