ThreeJS获取几何体轮廓形状(仿Rhino 5的DupBorder功能)
嗨,我完全懂你的需求——就是要在Rhino里复刻DupBorder的功能,精准提取NURBS几何体的轮廓边界,用来做Extrude对吧?之前试的Mesh轮廓、凸包都不对,自己捣鼓顶点关联面的方法也卡壳了,我给你整理几个靠谱的实现思路:
一、直接调用Rhino原生命令(最省心的方案)
这是最直接的方式,完全和手动点DupBorder的效果一致,不需要自己处理复杂的边界逻辑:
- Python脚本示例:
import rhinoscriptsyntax as rs # 让用户选择要提取边界的曲面/多重曲面 target_obj = rs.GetObject("请选择要提取边界的几何体", rs.filter.surface | rs.filter.polysurface) if target_obj: # 执行原生DupBorder命令 rs.Command("_DupBorder")
- C#(RhinoCommon)示例:
using Rhino; using Rhino.Commands; using Rhino.Input.Custom; public class CustomDupBorder : Command { public override string EnglishName => "CustomDupBorder"; protected override Result RunCommand(RhinoDoc doc, RunMode mode) { var getObj = new GetObject(); getObj.SetCommandPrompt("选择要提取边界的曲面或多重曲面"); getObj.GeometryFilter = Rhino.DocObjects.ObjectType.Surface | Rhino.DocObjects.ObjectType.PolysrfFilter; getObj.Get(); if (getObj.CommandResult() != Result.Success) return getObj.CommandResult(); // 选中目标对象后执行原生命令 doc.Views.ActiveView.ActiveViewport.SetSelectedObjects(getObj.Objects()); RhinoApp.RunScript("_DupBorder", false); return Result.Success; } }
二、用RhinoCommon API手动提取边界(适合自定义逻辑)
如果需要更灵活的控制(比如只提取某部分边界、过滤内部洞的边界),可以用Brep相关API来精准筛选:
1. 单个曲面的边界提取
把曲面转成Brep,然后筛选出仅关联1个面的边缘(也就是边界边缘):
using Rhino.Geometry; // 假设已经获取到目标Surface对象 Surface targetSurface = ...; Brep brepFromSurface = Brep.CreateFromSurface(targetSurface); foreach (BrepEdge edge in brepFromSurface.Edges) { // Valence为1表示这个边缘只连接一个面,是边界 if (edge.Valence == 1) { Curve borderCurve = edge.EdgeCurve.DuplicateCurve(); // 将提取的曲线添加到文档 doc.Objects.AddCurve(borderCurve); } }
2. 多重曲面的边界提取
逻辑类似,遍历多重曲面的所有边缘,筛选Valence == 1的边缘就是外边界;如果要过滤内部洞的边界,可以额外判断面的Loop类型:
Brep targetPolysrf = ...; foreach (BrepFace face in targetPolysrf.Faces) { foreach (BrepLoop loop in face.Loops) { // 只提取外边界环 if (loop.LoopType == BrepLoopType.Outer) { foreach (BrepEdge edge in loop.Edges) { Curve borderCurve = edge.EdgeCurve.DuplicateCurve(); doc.Objects.AddCurve(borderCurve); } } } }
三、避坑提醒
- 别碰Mesh相关API:比如
Mesh.GetNakedEdges()是针对网格模型的,和NURBS几何体的精确边界逻辑完全不同,精度根本达不到要求。 - 凸包(ConvexHull)只适合粗略需求:它是几何体的最小外接凸形,和原模型的精准轮廓差异很大,完全不适合你的挤出场景。
- 自己判断顶点关联面的方法容易踩坑:边界顶点的关联面数量不一定是固定的(比如曲面角落的顶点可能关联多个面),还要处理曲线连续性、闭合边缘等问题,远不如Rhino内置的Brep边缘筛选靠谱。
内容的提问来源于stack exchange,提问作者Niels
相关产品推荐
相关产品推荐

