diff --git a/src/Core/Animation/PathAnimationManager.cs b/src/Core/Animation/PathAnimationManager.cs
index 04324d5..90fb60a 100644
--- a/src/Core/Animation/PathAnimationManager.cs
+++ b/src/Core/Animation/PathAnimationManager.cs
@@ -539,9 +539,6 @@ namespace NavisworksTransport.Core.Animation
double yawRadians = ComputeYawOnPath(i, allSampledPoints, edgeIndex, edgeProgress);
- // 🔥 调试日志:输出framePosition
- LogManager.Debug($"[调试] 帧{i}: framePosition=({framePosition.X:F2},{framePosition.Y:F2},{framePosition.Z:F2})");
-
// 创建帧并检测碰撞
var frame = new AnimationFrame
{
@@ -600,16 +597,9 @@ namespace NavisworksTransport.Core.Animation
var colliderBox = collider.BoundingBox();
// 🔥 调试日志:输出包围盒信息
- bool intersects = BoundingBoxGeometryUtils.BoundingBoxesIntersectWithTolerance(virtualBoundingBox, colliderBox, _detectionGap);
- if (intersects)
- {
- double distanceX = Math.Max(0, Math.Max(virtualBoundingBox.Min.X - colliderBox.Max.X, colliderBox.Min.X - virtualBoundingBox.Max.X));
- double distanceY = Math.Max(0, Math.Max(virtualBoundingBox.Min.Y - colliderBox.Max.Y, colliderBox.Min.Y - virtualBoundingBox.Max.Y));
- double distanceZ = Math.Max(0, Math.Max(virtualBoundingBox.Min.Z - colliderBox.Max.Z, colliderBox.Min.Z - virtualBoundingBox.Max.Z));
- double minDistance = Math.Max(distanceX, Math.Max(distanceY, distanceZ));
-
- LogManager.Debug($"[碰撞检测] 帧{i}: 车辆包围盒=[({virtualBoundingBox.Min.X:F2},{virtualBoundingBox.Min.Y:F2},{virtualBoundingBox.Min.Z:F2})-({virtualBoundingBox.Max.X:F2},{virtualBoundingBox.Max.Y:F2},{virtualBoundingBox.Max.Z:F2})], 物体={collider.DisplayName}, 包围盒=[({colliderBox.Min.X:F2},{colliderBox.Min.Y:F2},{colliderBox.Min.Z:F2})-({colliderBox.Max.X:F2},{colliderBox.Max.Y:F2},{colliderBox.Max.Z:F2})], 最小距离={minDistance:F3}m, 检测间隙={_detectionGap:F3}m");
- }
+ // 使用改进的精确距离检测方法(先检查相交,再计算精确距离)
+ double preciseDistance = BoundingBoxGeometryUtils.CalculatePreciseDistance(virtualBoundingBox, colliderBox);
+ bool intersects = preciseDistance <= _detectionGap;
if (intersects)
{
diff --git a/src/Utils/BoundingBoxGeometryUtils.cs b/src/Utils/BoundingBoxGeometryUtils.cs
index 5a4bf9d..c665ae6 100644
--- a/src/Utils/BoundingBoxGeometryUtils.cs
+++ b/src/Utils/BoundingBoxGeometryUtils.cs
@@ -177,6 +177,62 @@ namespace NavisworksTransport.Utils
box1.Min.Z <= box2.Max.Z && box1.Max.Z >= box2.Min.Z;
}
+ ///
+ /// 使用ClosestPoint方法计算两个包围盒之间的精确距离
+ /// 这种方法比简单的包围盒相交检测更精确,可以避免AABB扩大导致的误报
+ ///
+ /// 第一个包围盒
+ /// 第二个包围盒
+ /// 两个包围盒之间的精确距离
+ public static double CalculatePreciseDistance(BoundingBox3D box1, BoundingBox3D box2)
+ {
+ try
+ {
+ // 先检查包围盒是否相交
+ bool intersects = box1.Intersects(box2);
+
+ if (intersects)
+ {
+ return 0.0;
+ }
+
+ // 如果不相交,使用ClosestPoint方法计算精确距离
+ // 计算box1上距离box2最近的点
+ Point3D closestPointOnBox1 = box1.ClosestPoint(box2.Center);
+
+ // 计算box2上距离closestPointOnBox1最近的点
+ Point3D closestPointOnBox2 = box2.ClosestPoint(closestPointOnBox1);
+
+ // 计算两个最近点之间的距离
+ double dx = closestPointOnBox1.X - closestPointOnBox2.X;
+ double dy = closestPointOnBox1.Y - closestPointOnBox2.Y;
+ double dz = closestPointOnBox1.Z - closestPointOnBox2.Z;
+
+ double distance = Math.Sqrt(dx * dx + dy * dy + dz * dz);
+ return distance;
+ }
+ catch (Exception ex)
+ {
+ // API调用失败,记录错误并抛出异常
+ LogManager.Error($"[CalculatePreciseDistance] API调用失败: {ex.Message}");
+ throw new InvalidOperationException($"CalculatePreciseDistance API调用失败: {ex.Message}", ex);
+ }
+ }
+
+ ///
+ /// 使用ClosestPoint方法检查两个包围盒是否在容差范围内相交
+ /// 这种方法比简单的包围盒相交检测更精确,可以避免AABB扩大导致的误报
+ ///
+ /// 第一个包围盒
+ /// 第二个包围盒
+ /// 容差值
+ /// 如果包围盒在容差范围内相交则返回true
+ public static bool BoundingBoxesIntersectWithTolerancePrecise(BoundingBox3D box1, BoundingBox3D box2, double tolerance)
+ {
+ double preciseDistance = CalculatePreciseDistance(box1, box2);
+ return preciseDistance <= tolerance;
+ }
+
///
/// 获取包围盒的中心点