我有一个问题,我需要将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.
}
非常感谢!
答案 0 :(得分:0)
我认为您的问题是您没有足够的子框。分区数是指每个维度的分区,对吧?因此,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.
}
}
}
或者,您可以在partitios的多维数据集上放置一个巨大的循环,并通过循环内的除法和余数操作对索引进行排序,这对于三维来说有点混乱。
通过根据原始框的边长计算每个维度的三个独立子框长度,使代码更通用也是一个好主意。