支持了3D障碍物投影

This commit is contained in:
tian 2025-10-10 11:03:38 +08:00
parent 3cc840b183
commit 59ecebebc4

View File

@ -1294,31 +1294,78 @@ namespace NavisworksTransport.PathPlanning
LogManager.Info($"[高性能障碍物处理] 阶段4完成: 生成 {gridUpdates.Count} 个网格更新操作,耗时: {gridCalcElapsed:F1}ms");
LogManager.Info($"[精确高度检查] 检查了 {totalCheckedItems} 个几何体,过滤掉 {filteredItems} 个高度范围外的几何体,保留 {heightCheckedItems.Count} 个");
// 阶段5网格状态更新单线程写入
LogManager.Info("[高性能障碍物处理] 阶段5: 单线程网格状态更新");
// 阶段5网格状态更新单线程写入3D高度检查
LogManager.Info("[高性能障碍物处理] 阶段5: 单线程网格状态更新3D高度检查");
var updateStart = DateTime.Now;
var updatedCells = 0;
var obstacleItems = 0;
var layersRemoved = 0;
var cellsFullyBlocked = 0;
var cellsWithLayers = 0;
var totalLayersChecked = 0;
foreach (var update in gridUpdates)
{
var cell = gridMap.Cells[update.X, update.Y];
// 只更新通道网格,跳过已是障碍物的网格
if (cell.CellType == CategoryAttributeManager.LogisticsElementType. && cell.IsInChannel)
{
// 标记为障碍物
cell.IsWalkable = false;
cell.CellType = CategoryAttributeManager.LogisticsElementType.;
cell.Cost = double.MaxValue;
cell.IsInChannel = false;
cell.RelatedModelItem = update.Item;
// 多层架构障碍物不需要PassableHeight
// var groundHeight = cell.WorldPosition.Z;
// cell.PassableHeight = new HeightInterval(...)
var bbox = update.BoundingBox;
// 统计有多少网格有高度层
if (cell.HeightLayers != null && cell.HeightLayers.Count > 0)
{
cellsWithLayers++;
totalLayersChecked += cell.HeightLayers.Count;
}
// 3D高度检查只移除与障碍物高度重叠的层
var remainingLayers = new List<HeightLayer>();
foreach (var layer in cell.HeightLayers)
{
// 计算该层的高度范围
double layerMinZ = layer.Z;
double layerMaxZ = layer.Z + layer.PassableHeight.GetSpan();
// 障碍物的高度范围
double obstacleMinZ = bbox.Min.Z;
double obstacleMaxZ = bbox.Max.Z;
// 检查是否重叠
bool overlaps = !(obstacleMaxZ <= layerMinZ || obstacleMinZ > layerMaxZ);
if (!overlaps)
{
// 不重叠,保留该层
remainingLayers.Add(layer);
}
else
{
// 重叠,移除该层
layersRemoved++;
LogManager.Debug($"[3D高度检查] 网格({update.X},{update.Y}) 层Z={layer.Z:F2}, 高度范围=[{layerMinZ:F2},{layerMaxZ:F2}], 障碍物范围=[{obstacleMinZ:F2},{obstacleMaxZ:F2}], 重叠=移除");
}
}
// 更新网格的高度层列表
cell.HeightLayers = remainingLayers;
// 如果所有层都被移除,标记整个网格为障碍物
if (remainingLayers.Count == 0)
{
cell.IsWalkable = false;
cell.CellType = CategoryAttributeManager.LogisticsElementType.;
cell.Cost = double.MaxValue;
cell.IsInChannel = false;
cell.RelatedModelItem = update.Item;
cellsFullyBlocked++;
}
// 如果还有层保留,网格仍然可通行(只是少了某些层)
// 保持 IsWalkable = true路径规划时会基于剩余层进行
gridMap.Cells[update.X, update.Y] = cell;
updatedCells++;
}
@ -1327,6 +1374,8 @@ namespace NavisworksTransport.PathPlanning
obstacleItems = gridUpdates.GroupBy(u => u.Item).Count();
var updateElapsed = (DateTime.Now - updateStart).TotalMilliseconds;
LogManager.Info($"[高性能障碍物处理] 阶段5完成: 更新 {updatedCells} 个网格单元,涉及 {obstacleItems} 个障碍物项,耗时: {updateElapsed:F1}ms");
LogManager.Info($"[3D高度检查] 有层的网格: {cellsWithLayers}, 检查的总层数: {totalLayersChecked}, 移除了 {layersRemoved} 个高度层");
LogManager.Info($"[3D高度检查] {cellsFullyBlocked} 个网格被完全阻挡,{updatedCells - cellsFullyBlocked} 个网格保留了部分层");
// 输出总体统计
var totalElapsed = (DateTime.Now - startTime).TotalMilliseconds;