diff --git a/src/CounterDrone.Core/Simulation/SimulationEngine.cs b/src/CounterDrone.Core/Simulation/SimulationEngine.cs index 8332aa1..a4c3c4c 100644 --- a/src/CounterDrone.Core/Simulation/SimulationEngine.cs +++ b/src/CounterDrone.Core/Simulation/SimulationEngine.cs @@ -275,22 +275,28 @@ namespace CounterDrone.Core.Simulation } } - // 6. 毁伤判定:积分路径段在云内的时间 + // 6. 毁伤判定:积分路径段在云内的时间(快速排斥:先检查包围盒) var (wvx, wvy, wvz) = Kinematics.WindToVector((WindDirection)_scene.WindDirection, (float)_scene.WindSpeed); float cloudDx = wvx * scaledDt, cloudDy = wvy * scaledDt, cloudDz = wvz * scaledDt; + float effectiveConcentration = (float)_ammoSpec.EffectiveConcentration; for (int di = 0; di < _flyingDrones.Count; di++) { var drone = _flyingDrones[di]; for (int ci = 0; ci < _clouds.Count; ci++) { var cloud = _clouds[ci]; + if (cloud.Dispersion.CoreDensity < effectiveConcentration) continue; + // 快速排斥:检查无人机与云团中心的距离是否在 2×有效半径内 + float effR = cloud.Dispersion.EffectiveRadius; float ccx = cloud.Dispersion.Center.X, ccy = cloud.Dispersion.Center.Y, ccz = cloud.Dispersion.Center.Z; + float dx = drone.PosX - ccx, dy = drone.PosY - ccy, dz = drone.PosZ - ccz; + float distSq = dx * dx + dy * dy + dz * dz; + if (distSq > effR * effR * 4) continue; // 距离 > 2R,不可能穿云 float inCloudDistance = DamageAssessment.PathInSphere( drone.PrevX - (ccx - cloudDx), drone.PrevY - (ccy - cloudDy), drone.PrevZ - (ccz - cloudDz), drone.PosX - ccx, drone.PosY - ccy, drone.PosZ - ccz, - 0f, 0f, 0f, - cloud.Dispersion.EffectiveRadius); - if (inCloudDistance > 0 && cloud.Dispersion.CoreDensity >= (float)_ammoSpec.EffectiveConcentration) + 0f, 0f, 0f, effR); + if (inCloudDistance > 0) { float exposureIncrement = inCloudDistance / (drone.TypicalSpeed / 3.6f); drone.ExposureTime += exposureIncrement; diff --git a/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.dll b/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.dll index f183442..e63c440 100644 Binary files a/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.dll and b/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.dll differ diff --git a/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.pdb b/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.pdb index 77b957c..b9d8a70 100644 Binary files a/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.pdb and b/src/Unity/Assets/Plugins/CounterDrone.Core/CounterDrone.Core.pdb differ