支持了3D障碍物投影
This commit is contained in:
parent
3cc840b183
commit
59ecebebc4
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user