You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:14:55