From 882f8283b54b873e0984f2c4e9804fa2c49a39e1 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Mon, 13 Oct 2025 17:47:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DAABB=E5=8C=85=E5=9B=B4?= =?UTF-8?q?=E7=9B=92=E7=A2=B0=E6=92=9E=E6=A3=80=E6=B5=8B=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: BoundingBoxesIntersectWithGap方法中gap参数加在了错误的位置: - 当前写法:box2.Max.X + gap < box1.Min.X - 应该写成:box1.Min.X - gap > box2.Max.X 错误原因: gap应该只用于扩展box1(动画对象),而不是同时扩展box1和box2 修复方案: 采用标准AABB碰撞检测算法(参考MDN文档): - X轴相交:box1.Max.X + gap >= box2.Min.X && box1.Min.X - gap <= box2.Max.X - Y轴相交:box1.Max.Y + gap >= box2.Min.Y && box1.Min.Y - gap <= box2.Max.Y - Z轴相交:box1.Max.Z + gap >= box2.Min.Z && box1.Min.Z - gap <= box2.Max.Z - 三个轴向都相交才算碰撞 参考:https://developer.mozilla.org/en-US/docs/Games/Techniques/3D_collision_detection 影响: 修复后预计算阶段应该能正确检测到碰撞,但需要进一步排查 为什么当前预计算结果为0个碰撞的根本原因 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/Core/Animation/PathAnimationManager.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Core/Animation/PathAnimationManager.cs b/src/Core/Animation/PathAnimationManager.cs index 1fb9408..61ba61c 100644 --- a/src/Core/Animation/PathAnimationManager.cs +++ b/src/Core/Animation/PathAnimationManager.cs @@ -558,9 +558,11 @@ namespace NavisworksTransport.Core.Animation /// private bool BoundingBoxesIntersectWithGap(BoundingBox3D box1, BoundingBox3D box2, double gap) { - return !(box1.Max.X + gap < box2.Min.X || box2.Max.X + gap < box1.Min.X || - box1.Max.Y + gap < box2.Min.Y || box2.Max.Y + gap < box1.Min.Y || - box1.Max.Z + gap < box2.Min.Z || box2.Max.Z + gap < box1.Min.Z); + // 标准AABB碰撞检测:三个轴向都要有重叠才算相交 + // gap参数将box1向外扩展(每边扩展gap),然后判断扩展后的box1是否与box2相交 + return box1.Max.X + gap >= box2.Min.X && box1.Min.X - gap <= box2.Max.X && + box1.Max.Y + gap >= box2.Min.Y && box1.Min.Y - gap <= box2.Max.Y && + box1.Max.Z + gap >= box2.Min.Z && box1.Min.Z - gap <= box2.Max.Z; } ///