# AABB / OBB 轴对齐包围盒 (AABB) 和有向包围盒 (OBB)。 ## 头文件 ```cpp #include ``` ## 命名空间 `XCEngine::Math` ## AABB - 轴对齐包围盒 `AABB` 在 Math 库中通过 `Bounds` 类型实现,参见 [math-bounds.md](math-bounds.md)。 ## OBB - 有向包围盒 OBB 是可以任意方向旋转的包围盒。 ```cpp struct OBB { Vector3 center; Vector3 extents; // 半长 Matrix4 transform; // 变换矩阵 }; ``` ### 构造函数 - `OBB()` - 默认构造 - `OBB(const Vector3& center, const Vector3& extents)` - 从中心和半长构造 ### 实例方法 | 方法 | 返回值 | 描述 | |------|--------|------| | `GetAxis(index)` | `Vector3` | 获取局部轴 (0=X, 1=Y, 2=Z) | | `GetMin()` | `Vector3` | 局部空间最小点 | | `GetMax()` | `Vector3` | 局部空间最大点 | | `Contains(point)` | `bool` | 点是否在 OBB 内 | | `Intersects(OBB)` | `bool` | 与另一个 OBB 相交 (SAT) | | `Intersects(Sphere)` | `bool` | 与球体相交 | ## 备注 - AABB 与轴对齐,检测简单但可能不够紧凑 - OBB 可旋转,检测使用分离轴定理 (SAT) - OBB 适合动态旋转的物体 ## 使用示例 ```cpp // OBB OBB obb; obb.center = Vector3(0.0f); obb.extents = Vector3(1.0f); obb.transform = Matrix4::TRS(pos, rot, scale); Vector3 localAxis = obb.GetAxis(0); if (obb.Contains(point)) { ... } if (obb.Intersects(otherOBB)) { ... } if (obb.Intersects(sphere)) { ... } ```