Godot用Geometry.merge_polygons_2d()合并多边形实现邻接共边无内轮廓
问题描述
遍历Polygon2D数组单独提取轮廓传入绘制脚本的实现,会在邻接多边形的公共边界处重复绘制线条。需要基于现有逻辑调用Geometry.merge_polygons_2d()完成多边形合并,消除公共边的多余轮廓。
改造方案
主逻辑修改(_ready函数)
核心调整为在全局坐标系下依次合并所有待处理多边形,合并操作会自动移除内部邻接公共边,仅保留整体外边界,再统一转换到轮廓绘制节点的本地坐标系传入:
func _ready(): var provs = [$Polygon2D4,$Polygon2D,$Polygon2D3] var outline_drawer = $outline_drawer outline_drawer.color = Color(0.06,0.71,0.74) / Color(2,2,2) var merged_polys_global := [] for poly_node in provs: # 转全局坐标 var points_global = poly_node.global_transform.xform(poly_node.polygon) # 第一个多边形直接初始化合并队列 if merged_polys_global.is_empty(): merged_polys_global.append(points_global) continue # 后续多边形依次和已有合并结果做并集运算 var temp_merge_result := [] for existing_poly in merged_polys_global: temp_merge_result.append_array(Geometry.merge_polygons_2d(existing_poly, points_global)) merged_polys_global = temp_merge_result # 合并结果转绘制节点本地坐标 var outlines_local := [] var global_to_local: Transform2D = outline_drawer.global_transform.affine_inverse() for outline_global in merged_polys_global: outlines_local.append(global_to_local.xform(outline_global)) outline_drawer.outlines = outlines_local
轮廓绘制脚本
原有轮廓绘制脚本无需任何改动,合并后的轮廓集合已剔除所有内部公共边,原有逐段画线逻辑可直接渲染出正确的无冗余外轮廓。
注意事项
- 所有待合并Polygon2D的多边形顶点需满足:绕序统一(同为顺时针/逆时针)、无自交、邻接边顶点坐标完全重合,否则会出现合并失败、轮廓缺失问题
- 若合并后出现意外空洞,一般是多边形绕序不一致导致,统一所有多边形点的绕序即可修复
- 若邻接多边形存在像素级坐标缝隙,合并后仍会保留缝隙处线条,需调整顶点坐标保证完全对齐
内容的提问来源于stack exchange,提问作者Sig
相关产品推荐
相关产品推荐

