fix(ignore): 只忽略立面三角形,type 1/4 静态代理不再跳过(修复掉地)

实测 byType={16/4:26530,16/1:4620} 表明被跳过的是非三角形地形代理,导致穿地。现判定只对 type=8 三角形生效:最高点高于车体中心 1m 且 |法线z|<0.6;非三角形静态一律保留。
This commit is contained in:
TermiNexus committed 2026-10-21 00:36:30 +08:00
1 parent 580a456032
commit 2ba8df0245
3 files changed
+21 -21

No files matched your search

@@ -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;
}
// ===== 诊断:识别「正在和什么物体重叠」=====
+7 -7
View File
@@ -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;
}
// ===== 诊断:识别「正在和什么物体重叠」=====
+7 -7
View File
@@ -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;
}
// ===== 诊断:识别「正在和什么物体重叠」=====