如何求解两个轴对齐立方体的交集顶点与体积(Unity环境下)
轴对齐立方体(AABB)交集体积计算实现方案
你原有的筛选顶点的思路存在逻辑缺陷:轴对齐立方体的交集顶点并不一定属于两个原始立方体的原有顶点,多数情况下会落在原始立方体的边或面上,无法通过筛选16个原始顶点得到交集的8个顶点。实际上轴对齐立方体的交集本身也为轴对齐结构,直接通过边界值计算即可得到结果,无需处理顶点逻辑,具体实现如下:
实现步骤
- 首先通过Unity内置属性获取两个待计算立方体的
Bounds对象,可通过Bounds.center获取质心、Bounds.extents获取半长,也可直接读取Bounds.min和Bounds.max拿到立方体的最小、最大边界坐标。 - 计算交集区域的三个轴边界值:
float xMin = Mathf.Max(boundsA.min.x, boundsB.min.x); float xMax = Mathf.Min(boundsA.max.x, boundsB.max.x); float yMin = Mathf.Max(boundsA.min.y, boundsB.min.y); float yMax = Mathf.Min(boundsA.max.y, boundsB.max.y); float zMin = Mathf.Max(boundsA.min.z, boundsB.min.z); float zMax = Mathf.Min(boundsA.max.z, boundsB.max.z); - 相交性判断:只要任意一个轴的最小边界大于等于最大边界,说明两个立方体无交集,交集体积直接返回0。
- 体积计算:若存在交集,三个轴的长度分别为
xMax - xMin、yMax - yMin、zMax - zMin,三者相乘即可得到交集体积。
扩展:单个轴对齐立方体顶点获取方法
如果你确实需要获取单个立方体的8个顶点,可通过Bounds的min和max属性直接生成,无需调用额外API:
Vector3[] GetBoundsVertices(Bounds bounds) { Vector3 min = bounds.min; Vector3 max = bounds.max; return new Vector3[] { new Vector3(min.x, min.y, min.z), new Vector3(min.x, min.y, max.z), new Vector3(min.x, max.y, min.z), new Vector3(min.x, max.y, max.z), new Vector3(max.x, min.y, min.z), new Vector3(max.x, min.y, max.z), new Vector3(max.x, max.y, min.z), new Vector3(max.x, max.y, max.z) }; }
内容的提问来源于stack exchange,提问作者Enrico Gliaschera
相关产品推荐
相关产品推荐

