Есть набор точек для которого вычислены AABB OBB боксы, которые вычисляются при инициализации,
Как вычислить AABB бокс при повороте. как не пытаюсь он ломается.
Без пересчета точек.
Для объекта есть матрица трансформации, так же есть минимальный охватывающий прямоугольник, заданный своей матрицей.
public class PolyObject
{
private Vector2[] points;
private Matrix3x2 matrix;
private Vector2 min;
private Vector2 max;
private Vector2 minInit;
private Vector2 maxInit;
private OBB _obb;
}
private void _updateAABB(in Matrix3x2 matrix)
{
Vector2 t0 = minInit;
Vector2 t1 = new Vector2(maxInit.X,minInit.Y);
Vector2 t2 = new Vector2(minInit.X,maxInit.Y);
Vector2 t3 = maxInit;
var tranformCorner0 = Vector2.Transform(t0, matrix);
var tranformCorner1 = Vector2.Transform(t1, matrix);
var tranformCorner2 = Vector2.Transform(t2, matrix);
var tranformCorner3 = Vector2.Transform(t3, matrix);
min = Vector2.Min(Vector2.Min(tranformCorner0, tranformCorner1),Vector2.Min(tranformCorner2, tranformCorner3));
max = Vector2.Max(Vector2.Max(tranformCorner0, tranformCorner1),Vector2.Max(tranformCorner2, tranformCorner3));
}
Вот например функция ниже не работает, как надо, прямоугольник всегда больше. При первом же повороте ломаетс
Легко объяснить, если допустим мы на 45 градусов повернем квадрат, то AABB бокс будет в 2 раза больше, так как угловые точки сместятся в внешние позиции и тем самым увеличат площадь охватывающего бокса
Вот например OBB который сложнее по структуре и геометрии, вообще легко обновлять, умножив на матрицу только.
Есть ли способ, кроме этого, как будто через OBB что-то можно
max = new Vector2(float.MinValue,float.MinValue);
min = new Vector2(float.MaxValue,float.MaxValue);
for (int i = 0; i < points.Length; i++)
{
var p = points[i];
p = Vector2.Transform(p,matrix);
min = Vector2.Min(min, p);
max = Vector2.Max(max, p);
}
//m