using OpenTK.Mathematics; namespace Yw.WinFrmUI.Hydro { /// /// 包围盒辅助类 /// internal class BoundingBox3Helper { /// /// 计算圆点包围盒 /// /// 圆点 /// 半径 /// public static BoundingBox3 CalcuPointBoundingBox(Vector3 pt, float radius) { var min = pt - new Vector3(radius); var max = pt + new Vector3(radius); return new BoundingBox3(min, max); } /// /// 计算圆柱体的轴对齐包围盒(AABB) /// public static BoundingBox3 CalcuLineBoundingBox(Vector3 start, Vector3 end, float width) { var radius = width / 2f; Vector3 dir = (end - start).Normalized(); float dirX = dir.X, dirY = dir.Y, dirZ = dir.Z; // 计算各轴的端点和扩展量 float minX = Math.Min(start.X, end.X); float maxX = Math.Max(start.X, end.X); float extensionX = radius * (float)MathF.Sqrt(1f - dirX * dirX); minX -= extensionX; maxX += extensionX; float minY = Math.Min(start.Y, end.Y); float maxY = Math.Max(start.Y, end.Y); float extensionY = radius * (float)MathF.Sqrt(1f - dirY * dirY); minY -= extensionY; maxY += extensionY; float minZ = Math.Min(start.Z, end.Z); float maxZ = Math.Max(start.Z, end.Z); float extensionZ = radius * (float)MathF.Sqrt(1f - dirZ * dirZ); minZ -= extensionZ; maxZ += extensionZ; return new BoundingBox3(new Vector3(minX, minY, minZ), new Vector3(maxX, maxY, maxZ)); } } }