494 lines
16 KiB
Markdown
494 lines
16 KiB
Markdown
# 导航网格插件
|
||
|
||
一个功能完整的3D导航网格系统插件,为EG引擎提供基于导航网格的寻路和路径规划功能。
|
||
|
||
## 功能特性
|
||
|
||
### 核心功能
|
||
- **导航网格生成**: 支持从3D场景自动生成导航网格
|
||
- **路径查找**: 基于A*算法的高效寻路
|
||
- **可视化编辑**: 直观的导航网格编辑界面
|
||
- **多边形管理**: 导航网格多边形的增删改查
|
||
- **路径可视化**: 实时显示寻路结果
|
||
|
||
### 寻路算法
|
||
- **A*算法**: 经典的启发式搜索算法
|
||
- **Dijkstra算法**: 保证最短路径的搜索算法
|
||
- **多种启发式函数**: 欀曼哈顿距离、欧几里得距离等
|
||
- **路径平滑**: 漏斗算法和简单平滑算法
|
||
- **多路点路径**: 支持经过多个路点的复杂路径规划
|
||
- **动态障碍物**: 运行时添加和移除障碍物
|
||
- **路径缓存**: 提高重复路径查找性能
|
||
|
||
### 编辑功能
|
||
- **可视化编辑**: 图形化界面编辑导航网格
|
||
- **多种工具**: 选择、添加、删除、绘制工具
|
||
- **属性调节**: 网格大小、代理尺寸等参数调节
|
||
- **撤销重做**: 编辑历史管理和操作回退
|
||
- **网格对齐**: 网格对齐功能提高编辑精度
|
||
- **自动连接**: 自动计算多边形连接关系
|
||
|
||
### 性能优化
|
||
- **空间哈希**: 加速多边形查找
|
||
- **对象复用**: 减少内存分配
|
||
- **批量处理**: 提高大量数据处理效率
|
||
- **LOD支持**: 多层次细节支持
|
||
|
||
### 高级特性
|
||
- **分层寻路**: 大场景高效寻路
|
||
- **路径复杂度分析**: 路径质量评估
|
||
- **备选路径**: 多条路径选择
|
||
- **路径验证**: 路径有效性检查
|
||
- **统计信息**: 详细的性能和使用统计
|
||
- **网格分析**: 质量分析和优化建议
|
||
- **网格优化**: 自动优化和简化功能
|
||
- **格式支持**: 多种文件格式导入导出
|
||
|
||
## 使用方法
|
||
|
||
### 快捷键操作
|
||
- **F1**: 切换导航网格编辑器显示
|
||
- **F2**: 切换导航网格可见性
|
||
- **F3**: 查找随机路径进行测试
|
||
- **F4**: 清除所有路径可视化
|
||
- **F5**: 从场景生成导航网格
|
||
- **F6**: 验证导航网格完整性
|
||
- **F7**: 优化导航网格
|
||
- **F8**: 显示统计信息
|
||
- **F9**: 分析导航网格质量
|
||
- **F10**: 导出分析报告
|
||
- **F11**: 简化导航网格
|
||
- **F12**: 检测瓶颈区域
|
||
|
||
### GUI界面操作
|
||
插件会在屏幕左上角创建控制面板,可以通过按钮直接操作导航网格功能。
|
||
|
||
### 编程接口
|
||
```python
|
||
# 获取插件实例
|
||
navmesh_plugin = world.plugin_manager.get_plugin("navigation_mesh")
|
||
|
||
# 生成导航网格
|
||
navmesh_plugin.generate_navmesh_from_scene()
|
||
|
||
# 从文件加载导航网格
|
||
navmesh_plugin.load_navmesh_from_file("path/to/navmesh.json")
|
||
|
||
# 保存导航网格到文件
|
||
navmesh_plugin.save_navmesh_to_file("path/to/navmesh.json")
|
||
|
||
# 查找路径
|
||
start_point = Point3(0, 0, 0)
|
||
end_point = Point3(10, 0, 10)
|
||
path = navmesh_plugin.find_path(start_point, end_point)
|
||
|
||
# 检查点是否可行走
|
||
is_walkable = navmesh_plugin.is_point_walkable(Point3(5, 0, 5))
|
||
|
||
# 获取最近的可行走点
|
||
closest_point = navmesh_plugin.get_closest_point(Point3(3, 2, 4))
|
||
|
||
# 添加动态障碍物
|
||
obstacle_id = navmesh_plugin.add_dynamic_obstacle(Point3(5, 0, 5), 1.0, 2.0)
|
||
|
||
# 移除动态障碍物
|
||
navmesh_plugin.remove_dynamic_obstacle(obstacle_id)
|
||
|
||
# 设置导航网格参数
|
||
navmesh_plugin.set_navmesh_settings({
|
||
'cell_size': 0.3,
|
||
'agent_height': 1.8,
|
||
'agent_radius': 0.4
|
||
})
|
||
|
||
# 设置寻路算法
|
||
navmesh_plugin.set_pathfinder_algorithm('astar') # 或 'dijkstra'
|
||
|
||
# 查找多路点路径
|
||
waypoints = [Point3(0, 0, 0), Point3(5, 0, 5), Point3(10, 0, 10)]
|
||
path = navmesh_plugin.find_path_with_waypoints(waypoints)
|
||
|
||
# 估算路径代价
|
||
cost = navmesh_plugin.estimate_path_cost(Point3(0, 0, 0), Point3(10, 0, 10))
|
||
|
||
# 验证路径有效性
|
||
is_valid = navmesh_plugin.validate_path(path)
|
||
|
||
# 分析路径复杂度
|
||
complexity = navmesh_plugin.get_path_complexity(path)
|
||
|
||
# 查找备选路径
|
||
alternative_paths = navmesh_plugin.find_alternative_paths(Point3(0, 0, 0), Point3(10, 0, 10), 3)
|
||
|
||
# 清空路径缓存
|
||
navmesh_plugin.clear_path_cache()
|
||
|
||
# 重新构建导航网格
|
||
navmesh_plugin.rebuild_navmesh()
|
||
|
||
# 启用空间哈希优化
|
||
navmesh_plugin.enable_spatial_hashing(True)
|
||
|
||
# 设置空间哈希网格大小
|
||
navmesh_plugin.set_spatial_hash_cell_size(5.0)
|
||
|
||
# 导出统计信息
|
||
navmesh_plugin.export_statistics("stats.json")
|
||
|
||
# 导入/导出设置
|
||
navmesh_plugin.import_settings("settings.json")
|
||
navmesh_plugin.export_settings("settings.json")
|
||
|
||
# 高级功能
|
||
# 分析网格质量
|
||
quality_report = navmesh_plugin.analyze_mesh_quality()
|
||
|
||
# 获取优化建议
|
||
suggestions = navmesh_plugin.suggest_optimizations()
|
||
|
||
# 检测瓶颈区域
|
||
bottlenecks = navmesh_plugin.detect_navigation_bottlenecks()
|
||
|
||
# 生成完整分析报告
|
||
report = navmesh_plugin.generate_analysis_report()
|
||
|
||
# 导出分析报告
|
||
navmesh_plugin.export_analysis_report("analysis_report.json")
|
||
|
||
# 获取网格复杂度评分
|
||
complexity_score = navmesh_plugin.get_mesh_complexity_score()
|
||
|
||
# 推荐网格简化策略
|
||
simplification_recommendation = navmesh_plugin.recommend_mesh_simplification()
|
||
|
||
# 合并相邻多边形
|
||
merged_count = navmesh_plugin.merge_adjacent_polygons()
|
||
|
||
# 简化多边形
|
||
simplified_count = navmesh_plugin.simplify_mesh_polygons()
|
||
|
||
# 移除小多边形
|
||
removed_count = navmesh_plugin.remove_small_mesh_polygons()
|
||
|
||
# 执行完整网格优化
|
||
optimization_result = navmesh_plugin.optimize_navigation_mesh('medium')
|
||
|
||
# 设置优化参数
|
||
navmesh_plugin.set_optimization_settings({
|
||
'merge_threshold': 0.5,
|
||
'simplify_threshold': 0.1,
|
||
'min_polygon_area': 0.01
|
||
})
|
||
|
||
# 获取优化参数
|
||
optimization_settings = navmesh_plugin.get_optimization_settings()
|
||
|
||
# 填补网格空隙
|
||
filled_gaps = navmesh_plugin.fill_mesh_gaps()
|
||
|
||
# 平滑边界
|
||
smoothed_edges = navmesh_plugin.smooth_mesh_boundaries()
|
||
|
||
# 平衡多边形大小
|
||
balanced_polygons = navmesh_plugin.balance_polygon_sizes()
|
||
|
||
# 序列化导航网格
|
||
serialized_data = navmesh_plugin.serialize_navigation_mesh()
|
||
|
||
# 反序列化导航网格
|
||
success = navmesh_plugin.deserialize_navigation_mesh(serialized_data)
|
||
|
||
# 保存导航网格(高级选项)
|
||
navmesh_plugin.save_navmesh_to_file_advanced("navmesh.json", compress=True, pretty_print=True)
|
||
|
||
# 加载导航网格(高级选项)
|
||
navmesh_plugin.load_navmesh_from_file_advanced("navmesh.json")
|
||
|
||
# 导出为标准格式
|
||
navmesh_plugin.export_to_standard_format("navmesh.obj", "obj")
|
||
|
||
# 从标准格式导入
|
||
navmesh_plugin.import_from_standard_format("navmesh.obj", "obj")
|
||
|
||
# 获取文件信息
|
||
file_info = navmesh_plugin.get_navmesh_file_info("navmesh.json")
|
||
|
||
# 批量分析多个网格文件
|
||
analysis_results = navmesh_plugin.batch_analyze_navmeshes(["navmesh1.json", "navmesh2.json"])
|
||
|
||
# 比较两个导航网格
|
||
comparison_result = navmesh_plugin.compare_navigation_meshes("navmesh1.json", "navmesh2.json")
|
||
|
||
# 验证网格文件
|
||
validation_result = navmesh_plugin.validate_navmesh_file("navmesh.json")
|
||
|
||
# 优化并保存网格
|
||
optimization_result = navmesh_plugin.optimize_and_save_navmesh("input.json", "output.json", "medium")
|
||
|
||
# 创建优化流水线
|
||
pipeline_result = navmesh_plugin.create_optimization_pipeline(['merge', 'simplify', 'remove_small'])
|
||
```
|
||
|
||
## 核心组件
|
||
|
||
### 导航网格管理器
|
||
负责导航网格的加载、生成、管理和查询。
|
||
|
||
主要功能:
|
||
- 多边形数据管理(添加、删除、修改)
|
||
- 点位置查询(最近点、可行走性检查)
|
||
- 空间查询优化(空间哈希)
|
||
- 可视化显示控制
|
||
- 动态障碍物管理
|
||
- 网格验证和优化
|
||
|
||
### 路径查找器
|
||
实现基于导航网格的多种寻路算法。
|
||
|
||
主要功能:
|
||
- A*、Dijkstra等多种寻路算法
|
||
- 路径平滑和优化
|
||
- 动态障碍物避让
|
||
- 路径缓存机制
|
||
- 性能统计和分析
|
||
- 备选路径生成
|
||
|
||
### 导航网格编辑器
|
||
提供可视化编辑导航网格的功能。
|
||
|
||
主要功能:
|
||
- 多种编辑工具(选择、添加、删除、绘制)
|
||
- 实时可视化反馈
|
||
- 编辑历史管理(撤销/重做)
|
||
- 参数调节界面
|
||
- 快捷键支持
|
||
- 网格对齐和辅助功能
|
||
|
||
### 导航网格工具集
|
||
提供导航网格的高级分析和优化功能。
|
||
|
||
主要功能:
|
||
- 网格质量分析
|
||
- 性能评估
|
||
- 优化建议
|
||
- 自动优化
|
||
- 格式转换
|
||
- 批量处理
|
||
|
||
## 数据结构
|
||
|
||
### 导航网格多边形
|
||
表示导航网格中的一个可行走区域,包含:
|
||
- 多边形顶点(任意数量)
|
||
- 相邻多边形信息
|
||
- 门户点(与邻居的连接点)
|
||
- 中心点计算
|
||
- 面积和边界框计算
|
||
- 点在多边形内判断
|
||
- 最近点计算
|
||
|
||
### 导航网格节点
|
||
用于寻路算法中的节点表示,包含:
|
||
- 多边形ID
|
||
- 位置信息
|
||
- 代价信息(g_cost, h_cost, f_cost)
|
||
- 父节点引用
|
||
- 门户点入口信息
|
||
|
||
### 寻路路径
|
||
表示计算出的路径,包含:
|
||
- 路径点列表
|
||
- 路径长度和复杂度
|
||
- 路径有效性验证
|
||
|
||
## 性能优化
|
||
|
||
### 算法优化
|
||
- **高效数据结构**: 使用优先队列优化寻路算法
|
||
- **启发式函数**: 智能的启发式代价计算
|
||
- **节点剪枝**: 避免重复节点计算
|
||
- **路径缓存**: 缓存常用路径提高查找速度
|
||
- **空间哈希**: 加速多边形空间查询
|
||
|
||
### 内存管理
|
||
- **对象池**: 减少对象创建和销毁开销
|
||
- **数据压缩**: 优化导航网格数据存储
|
||
- **批量处理**: 提高大量数据处理效率
|
||
|
||
### 渲染优化
|
||
- **LOD支持**: 根据距离调整显示细节
|
||
- **视锥剔除**: 只渲染可见区域
|
||
- **批处理**: 合并相似的渲染调用
|
||
|
||
## 扩展开发
|
||
|
||
### 添加新的寻路算法
|
||
1. 在[pathfinder.py](file:///home/hello/EG/plugins/user/navigation_mesh/tools/pathfinder.py)中实现新的算法类
|
||
2. 继承现有寻路器或创建新的寻路器类
|
||
3. 在插件主文件中集成新的算法
|
||
|
||
### 添加新的网格生成方法
|
||
1. 在[navmesh_manager.py](file:///home/hello/EG/plugins/user/navigation_mesh/core/navmesh_manager.py)中实现新的生成方法
|
||
2. 添加对应的GUI控制元素
|
||
3. 在编辑器中添加对应的生成选项
|
||
|
||
### 添加新的编辑工具
|
||
1. 在[navmesh_editor.py](file:///home/hello/EG/plugins/user/navigation_mesh/editor/navmesh_editor.py)中创建新的工具类
|
||
2. 继承NavMeshEditorTool基类
|
||
3. 实现工具的交互逻辑
|
||
4. 在编辑器中注册新工具
|
||
|
||
### 添加新的分析工具
|
||
1. 在[navmesh_analyzer.py](file:///home/hello/EG/plugins/user/navigation_mesh/tools/navmesh_analyzer.py)中实现新的分析功能
|
||
2. 在[navmesh_tools.py](file:///home/hello/EG/plugins/user/navigation_mesh/tools/navmesh_tools.py)中集成新工具
|
||
3. 在插件主文件中暴露新功能接口
|
||
|
||
## 故障排除
|
||
|
||
### 路径查找失败
|
||
1. 检查导航网格是否正确生成和加载
|
||
2. 确认起点和终点在可行走区域内
|
||
3. 检查多边形连接是否正确
|
||
4. 验证导航网格完整性(使用F6快捷键)
|
||
|
||
### 性能问题
|
||
1. 使用寻路统计功能分析性能瓶颈
|
||
2. 调整启发式权重优化搜索效率
|
||
3. 简化导航网格结构
|
||
4. 启用空间哈希优化
|
||
5. 调整最大搜索节点数限制
|
||
|
||
### 编辑器无法使用
|
||
1. 确认GUI系统是否正常工作
|
||
2. 检查快捷键是否被其他系统占用
|
||
3. 重新启用插件尝试
|
||
4. 检查是否有Python异常(查看控制台输出)
|
||
|
||
### 网格生成问题
|
||
1. 检查场景中是否有合适的几何体用于生成
|
||
2. 调整网格生成参数(网格大小、代理尺寸等)
|
||
3. 使用测试网格功能验证基本功能
|
||
|
||
### 文件操作问题
|
||
1. 检查文件路径是否正确
|
||
2. 确认文件权限是否足够
|
||
3. 验证文件格式是否支持
|
||
4. 检查磁盘空间是否充足
|
||
|
||
## API参考
|
||
|
||
### Plugin类主要方法
|
||
|
||
#### 初始化和控制
|
||
- `initialize()` - 初始化插件
|
||
- `enable()` - 启用插件
|
||
- `disable()` - 禁用插件
|
||
- `finalize()` - 清理插件资源
|
||
|
||
#### 导航网格操作
|
||
- `load_navmesh_from_file(filepath)` - 从文件加载导航网格
|
||
- `save_navmesh_to_file(filepath)` - 保存导航网格到文件
|
||
- `generate_navmesh_from_scene()` - 从场景生成导航网格
|
||
- `rebuild_navmesh()` - 重新构建导航网格
|
||
|
||
#### 路径查找
|
||
- `find_path(start_point, end_point)` - 查找两点间路径
|
||
- `find_path_with_waypoints(waypoints)` - 查找经过多个路点的路径
|
||
- `find_alternative_paths(start_point, end_point, count)` - 查找备选路径
|
||
|
||
#### 点查询
|
||
- `is_point_walkable(point)` - 检查点是否可行走
|
||
- `get_closest_point(point)` - 获取最近的可行走点
|
||
|
||
#### 动态障碍物
|
||
- `add_dynamic_obstacle(position, radius, height)` - 添加动态障碍物
|
||
- `remove_dynamic_obstacle(obstacle_id)` - 移除动态障碍物
|
||
|
||
#### 设置和配置
|
||
- `set_navmesh_settings(settings)` - 设置导航网格参数
|
||
- `get_navmesh_settings()` - 获取导航网格参数
|
||
- `set_pathfinder_algorithm(algorithm)` - 设置寻路算法
|
||
- `get_available_algorithms()` - 获取可用算法列表
|
||
- `set_pathfinder_settings(settings)` - 设置寻路参数
|
||
- `get_pathfinder_settings()` - 获取寻路参数
|
||
|
||
#### 性能和统计
|
||
- `show_stats()` - 显示统计信息
|
||
- `export_statistics(filepath)` - 导出统计信息
|
||
- `clear_path_cache()` - 清空路径缓存
|
||
|
||
#### 优化和验证
|
||
- `validate_navmesh()` - 验证导航网格
|
||
- `optimize_navmesh()` - 优化导航网格
|
||
- `enable_spatial_hashing(enabled)` - 启用/禁用空间哈希
|
||
- `set_spatial_hash_cell_size(size)` - 设置空间哈希网格大小
|
||
|
||
#### 高级分析功能
|
||
- `analyze_mesh_quality()` - 分析网格质量
|
||
- `suggest_optimizations()` - 提供优化建议
|
||
- `analyze_pathfinding_performance(sample_count)` - 分析寻路性能
|
||
- `detect_navigation_bottlenecks()` - 检测瓶颈区域
|
||
- `analyze_coverage()` - 分析覆盖情况
|
||
- `generate_analysis_report()` - 生成分析报告
|
||
- `export_analysis_report(filepath)` - 导出分析报告
|
||
- `get_mesh_complexity_score()` - 获取网格复杂度评分
|
||
- `recommend_mesh_simplification()` - 推荐网格简化策略
|
||
|
||
#### 网格优化功能
|
||
- `merge_adjacent_polygons()` - 合并相邻多边形
|
||
- `simplify_mesh_polygons()` - 简化多边形
|
||
- `remove_small_mesh_polygons()` - 移除小多边形
|
||
- `optimize_navigation_mesh(optimization_level)` - 优化导航网格
|
||
- `set_optimization_settings(settings)` - 设置优化参数
|
||
- `get_optimization_settings()` - 获取优化参数
|
||
- `fill_mesh_gaps()` - 填补网格空隙
|
||
- `smooth_mesh_boundaries()` - 平滑边界
|
||
- `balance_polygon_sizes()` - 平衡多边形大小
|
||
|
||
#### 序列化和文件操作
|
||
- `serialize_navigation_mesh()` - 序列化导航网格
|
||
- `deserialize_navigation_mesh(data_str)` - 反序列化导航网格
|
||
- `save_navmesh_to_file_advanced(filepath, compress, pretty_print)` - 保存网格(高级选项)
|
||
- `load_navmesh_from_file_advanced(filepath)` - 加载网格(高级选项)
|
||
- `export_to_standard_format(filepath, format_type)` - 导出为标准格式
|
||
- `import_from_standard_format(filepath, format_type)` - 从标准格式导入
|
||
- `get_navmesh_file_info(filepath)` - 获取文件信息
|
||
- `batch_analyze_navmeshes(filepaths)` - 批量分析网格
|
||
- `compare_navigation_meshes(navmesh1_path, navmesh2_path)` - 比较网格
|
||
- `validate_navmesh_file(filepath)` - 验证网格文件
|
||
- `optimize_and_save_navmesh(input_filepath, output_filepath, optimization_level)` - 优化并保存
|
||
- `create_optimization_pipeline(steps)` - 创建优化流水线
|
||
|
||
## 性能调优建议
|
||
|
||
### 寻路性能
|
||
1. 合理设置启发式权重(通常1.0为最佳)
|
||
2. 限制最大搜索节点数避免长时间搜索
|
||
3. 启用路径缓存减少重复计算
|
||
4. 使用适当的空间查询优化
|
||
|
||
### 内存使用
|
||
1. 及时清理不用的路径缓存
|
||
2. 控制导航网格复杂度
|
||
3. 合理设置空间哈希网格大小
|
||
|
||
### 渲染性能
|
||
1. 只在需要时显示导航网格
|
||
2. 使用LOD减少远处细节
|
||
3. 批量处理渲染调用
|
||
|
||
### 网格优化
|
||
1. 定期分析网格质量
|
||
2. 根据建议进行优化
|
||
3. 平衡网格精度和性能
|
||
4. 移除不必要的细节
|
||
|
||
## 版本信息
|
||
|
||
- 版本: 1.0.0
|
||
- 作者: EG Team
|
||
- 发布日期: 2024年
|
||
|
||
## 许可证
|
||
|
||
本插件遵循EG引擎许可证协议。 |