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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *