Разделение AABB

У меня есть проблема, когда мне нужно разделить AABB на несколько маленьких AABB. Мне нужно найти минимальные и максимальные баллы в каждой из меньших AABB.

введите описание изображения здесь

Если мы возьмем этот кубоид в качестве примера, мы увидим, что он разделен на 64 меньших кубоида. Мне нужно вычислить минимальные и максимальные точки всех этих меньших кубоидов, где число кубоидов (64) может быть указано конечным пользователем.

Я сделал основную попытку с помощью следующего кода:

// Half the length of each side of the AABB.
float h = side * 0.5f;

// The length of each side of the inner AABBs.
float l = side / NUMBER_OF_PARTITIONS;

// Calculate the minimum point on the parent AABB.
Vector3 minPointAABB(
origin.getX() - h,
origin.getY() - h,
origin.getZ() - h
);

// Calculate all inner AABBs which completely fill the parent AABB.
for (int i = 0; i < NUMBER_OF_PARTITIONS; i++)
{
// This is not correct! Given a parent AABB of min (-10, 0, 0) and max (0, 10, 10) I need to
// calculate the following positions as minimum points of InnerAABB (with 8 inner AABBs).
// (-10, 0, 0), (-5, 0, 0), (-10, 5, 0), (-5, 5, 0), (-10, 0, 5), (-5, 0, 5),
// (-10, 5, 5), (-5, 5, 5)

Vector3 minInnerAABB(
minPointAABB.getX() + i * l,
minPointAABB.getY() + i * l,
minPointAABB.getZ() + i * l
);

// We can calculate the maximum point of the AABB from the minimum point
// by the summuation of each coordinate in the minimum point with the length of each side.
Vector3 maxInnerAABB(
minInnerAABB.getX() + l,
minInnerAABB.getY() + l,
minInnerAABB.getZ() + l
);

// Add the inner AABB points to a container for later use.
}

Большое спасибо!

2

Решение

Я предполагаю, что ваша проблема в том, что вы не получаете достаточно вложенных блоков. Количество разделов относится к разделам на измерение, верно? Таким образом, 2 раздела дают 8 вложенных блоков, 3 раздела дают 27 вложенных блоков и так далее.

Тогда у вас должно быть три вложенных цикла, по одному для каждого измерения:

for (int k = 0; k < NUMBER_OF_PARTITIONS; k++)
for (int j = 0; j < NUMBER_OF_PARTITIONS; j++)
for (int i = 0; i < NUMBER_OF_PARTITIONS; i++)
{
Vector3 minInnerAABB(
minPointAABB.getX() + i * l,
minPointAABB.getY() + j * l,
minPointAABB.getZ() + k * l
);

Vector3 maxInnerAABB(
minInnerAABB.getX() + l,
minInnerAABB.getY() + l,
minInnerAABB.getZ() + l
);

// Add the inner AABB points to a container for later use.
}
}
}

В качестве альтернативы, вы можете иметь один огромный цикл над кубом ваших группировок и сортировать индексы по операциям деления и остатка внутри цикла, что немного беспорядочно для трех измерений.

Также может быть хорошей идеей сделать код более общим, рассчитав три независимых длины суббокса для каждого измерения на основе длин сторон исходного блока.

0

Другие решения

Других решений пока нет …