You need to enable JavaScript to run this app. 如何用pythonocc-core计算点与形状距离及实现Adaptively Sampled Distance Fields
优惠活动
大模型
产品
解决方案
定价
更多

如何用pythonocc-core计算点与形状距离及实现Adaptively Sampled Distance Fields

点与形状距离计算的pythonocc实现

简便实现方案

你可以直接调用OpenCascade封装好的BRepExtrema_DistShapeShape接口实现,无需额外自定义复杂逻辑,核心实现逻辑如下:

from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeVertex
from OCC.Core.BRepExtrema import BRepExtrema_DistShapeShape
from OCC.Core.gp import gp_Pnt

def point_shape_distance(point: gp_Pnt, shape) -> float:
    # 将待计算点转换为拓扑顶点对象
    vertex = BRepBuilderAPI_MakeVertex(point).Vertex()
    # 初始化距离计算实例
    dist_calc = BRepExtrema_DistShapeShape(vertex, shape)
    if dist_calc.IsDone():
        # 返回无符号最小距离
        return dist_calc.Value()
    raise RuntimeError("距离计算失败,可检查输入形状是否合法")

如果需要适配更多场景的带符号距离(可判断点在实体内部/外部),可以结合BRepClass3d_SolidClassifier做内外判断,扩展实现如下:

from OCC.Core.BRepClass3d import BRepClass3d_SolidClassifier
from OCC.Core.TopAbs import TopAbs_IN

def signed_point_shape_distance(point: gp_Pnt, solid) -> float:
    dist = point_shape_distance(point, solid)
    # 初始化实体分类器判断点的位置
    classifier = BRepClass3d_SolidClassifier(solid)
    classifier.Perform(point, 1e-6)
    # 点在实体内部时距离取负
    if classifier.State() == TopAbs_IN:
        return -dist
    return dist
自适应采样距离场(ASDF)开发适配思路

ASDF场景需要高频调用点到形状距离计算接口,可参考以下思路做性能优化:

  • 预构建目标形状的BVH(包围盒层次树),每次距离查询前先通过BVH做粗过滤,仅对和查询点包围盒相交的面片做精确距离计算,可将大规模查询的效率提升数倍
  • 对相邻采样点的距离结果做插值复用,当采样密度高于设定阈值时,无需对每个点都做完整的精确距离计算,插值结果可满足精度要求
  • 可以根据ASDF的自适应采样特性,在曲率变化大的区域使用精确距离计算,平坦区域使用粗粒度的插值结果,平衡计算精度和效率
  • 若你处理的是网格模型,可以优先用三角面片的点到三角面距离计算接口替代全形状遍历,计算开销更低

内容的提问来源于stack exchange,提问作者lanhao945

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 19:27:03