diff --git a/3dtank.com/play/static/js/unpacked/hornet_bundle.js b/3dtank.com/play/static/js/unpacked/hornet_bundle.js index a923702..91fe5dd 100644 --- a/3dtank.com/play/static/js/unpacked/hornet_bundle.js +++ b/3dtank.com/play/static/js/unpacked/hornet_bundle.js @@ -6675,10 +6675,6 @@ var FPhysicsPosition = Fld('Physics.Position', 'bzr_1'); // 本地坦克世界位置 - // 「栅栏类」= 静态几何中「明显高于车体中心」的那部分: - // · 三角形:|法线 z| < 0.6(立面)且最高点高于车体中心 1m → 墙/栅栏 - // · 非三角形(盒/柱等代理):中心高于车体中心 1m → 障碍 - // · 地面/缓坡(最高点不高于车体中心)→ 一律保留,避免掉出地图 function LocalTankZ() { var Phys = GetLocalPhysics(); var P = Phys && Phys[FPhysicsPosition]; @@ -6698,16 +6694,20 @@ return (P && typeof P.h20_1 === 'number') ? P.h20_1 : null; } + // 「栅栏类」= 静态几何中的**立面三角形**: + // · 必须是三角形(type 8)—— 非三角形静态体(type 1/4 等)是地面/地形代理,跳过会导致掉出地图 + // · 最高点高于车体中心 1m(地面/缓坡不满足) + // · |法线 z| < 0.6(竖直立面) function IsFenceLike(Shape) { if (!IsStaticShape(Shape)) return false; + if (!IsTriangle(Shape)) return false; var TankZ = LocalTankZ(); if (TankZ === null) return false; var MaxZ = ShapeMaxZ(Shape); if (MaxZ === null) return false; - if (MaxZ < TankZ + 100) return false; // 不高于车体中心 1m → 地面/缓坡/低矮物 - if (!IsTriangle(Shape)) return true; // 高于车体中心的盒/柱代理 → 障碍 + if (MaxZ < TankZ + 100) return false; var Nz = TriangleNormalZ(Shape); - return Nz !== null && Math.abs(Nz) < 0.6; // 立面才算墙/栅栏 + return Nz !== null && Math.abs(Nz) < 0.6; } // ===== 诊断:识别「正在和什么物体重叠」===== diff --git a/3dtank_bundle.js b/3dtank_bundle.js index a923702..91fe5dd 100644 --- a/3dtank_bundle.js +++ b/3dtank_bundle.js @@ -6675,10 +6675,6 @@ var FPhysicsPosition = Fld('Physics.Position', 'bzr_1'); // 本地坦克世界位置 - // 「栅栏类」= 静态几何中「明显高于车体中心」的那部分: - // · 三角形:|法线 z| < 0.6(立面)且最高点高于车体中心 1m → 墙/栅栏 - // · 非三角形(盒/柱等代理):中心高于车体中心 1m → 障碍 - // · 地面/缓坡(最高点不高于车体中心)→ 一律保留,避免掉出地图 function LocalTankZ() { var Phys = GetLocalPhysics(); var P = Phys && Phys[FPhysicsPosition]; @@ -6698,16 +6694,20 @@ return (P && typeof P.h20_1 === 'number') ? P.h20_1 : null; } + // 「栅栏类」= 静态几何中的**立面三角形**: + // · 必须是三角形(type 8)—— 非三角形静态体(type 1/4 等)是地面/地形代理,跳过会导致掉出地图 + // · 最高点高于车体中心 1m(地面/缓坡不满足) + // · |法线 z| < 0.6(竖直立面) function IsFenceLike(Shape) { if (!IsStaticShape(Shape)) return false; + if (!IsTriangle(Shape)) return false; var TankZ = LocalTankZ(); if (TankZ === null) return false; var MaxZ = ShapeMaxZ(Shape); if (MaxZ === null) return false; - if (MaxZ < TankZ + 100) return false; // 不高于车体中心 1m → 地面/缓坡/低矮物 - if (!IsTriangle(Shape)) return true; // 高于车体中心的盒/柱代理 → 障碍 + if (MaxZ < TankZ + 100) return false; var Nz = TriangleNormalZ(Shape); - return Nz !== null && Math.abs(Nz) < 0.6; // 立面才算墙/栅栏 + return Nz !== null && Math.abs(Nz) < 0.6; } // ===== 诊断:识别「正在和什么物体重叠」===== diff --git a/tools/hornet_noclip.js b/tools/hornet_noclip.js index 39f36ae..c068bf1 100644 --- a/tools/hornet_noclip.js +++ b/tools/hornet_noclip.js @@ -151,10 +151,6 @@ var FPhysicsPosition = Fld('Physics.Position', 'bzr_1'); // 本地坦克世界位置 - // 「栅栏类」= 静态几何中「明显高于车体中心」的那部分: - // · 三角形:|法线 z| < 0.6(立面)且最高点高于车体中心 1m → 墙/栅栏 - // · 非三角形(盒/柱等代理):中心高于车体中心 1m → 障碍 - // · 地面/缓坡(最高点不高于车体中心)→ 一律保留,避免掉出地图 function LocalTankZ() { var Phys = GetLocalPhysics(); var P = Phys && Phys[FPhysicsPosition]; @@ -174,16 +170,20 @@ return (P && typeof P.h20_1 === 'number') ? P.h20_1 : null; } + // 「栅栏类」= 静态几何中的**立面三角形**: + // · 必须是三角形(type 8)—— 非三角形静态体(type 1/4 等)是地面/地形代理,跳过会导致掉出地图 + // · 最高点高于车体中心 1m(地面/缓坡不满足) + // · |法线 z| < 0.6(竖直立面) function IsFenceLike(Shape) { if (!IsStaticShape(Shape)) return false; + if (!IsTriangle(Shape)) return false; var TankZ = LocalTankZ(); if (TankZ === null) return false; var MaxZ = ShapeMaxZ(Shape); if (MaxZ === null) return false; - if (MaxZ < TankZ + 100) return false; // 不高于车体中心 1m → 地面/缓坡/低矮物 - if (!IsTriangle(Shape)) return true; // 高于车体中心的盒/柱代理 → 障碍 + if (MaxZ < TankZ + 100) return false; var Nz = TriangleNormalZ(Shape); - return Nz !== null && Math.abs(Nz) < 0.6; // 立面才算墙/栅栏 + return Nz !== null && Math.abs(Nz) < 0.6; } // ===== 诊断:识别「正在和什么物体重叠」=====