From 2ba8df02456f72aed1b9920a05b8747cbd8e7cc2 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 21 Oct 2026 00:36:30 +0800 Subject: [PATCH] =?UTF-8?q?fix(ignore):=20=E5=8F=AA=E5=BF=BD=E7=95=A5?= =?UTF-8?q?=E7=AB=8B=E9=9D=A2=E4=B8=89=E8=A7=92=E5=BD=A2=EF=BC=8Ctype=201/?= =?UTF-8?q?4=20=E9=9D=99=E6=80=81=E4=BB=A3=E7=90=86=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E8=B7=B3=E8=BF=87=EF=BC=88=E4=BF=AE=E5=A4=8D=E6=8E=89=E5=9C=B0?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实测 byType={16/4:26530,16/1:4620} 表明被跳过的是非三角形地形代理,导致穿地。现判定只对 type=8 三角形生效:最高点高于车体中心 1m 且 |法线z|<0.6;非三角形静态一律保留。 --- .../play/static/js/unpacked/hornet_bundle.js | 14 +++++++------- 3dtank_bundle.js | 14 +++++++------- tools/hornet_noclip.js | 14 +++++++------- 3 files changed, 21 insertions(+), 21 deletions(-) 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; } // ===== 诊断:识别「正在和什么物体重叠」=====