9f2536498b
P0 实现(11/11 完成,0 stub 残留): - mesh: QEM 简化、Laplacian 平滑、质量评估、修复、3D 布尔 - spatial: Octree、KD-Tree、R-Tree 完整实现 - collision: GJK 距离+EPA 穿透深度、SAT、Tri-Tri 相交 - boolean: Vatti 2D 布尔扫描线算法 - core: 3D 凸包 QuickHull - spatial/BVH: 最近命中查询(AABB slab + Möller-Trumbore) 文档新增: - 05-核心竞争力与差异化功能(14 项独有功能) - SRS 扩展到 16 类 FR、100+ 条目 - 杀手功能:约束求解器/SDF隐式建模/可微分几何/惰性管线/Python绑定
326 lines
13 KiB
Markdown
326 lines
13 KiB
Markdown
# 需求规格说明书(v1.0 完整版)
|
||
|
||
## 目录
|
||
|
||
1. [引言](#1-引言)
|
||
2. [功能需求](#2-功能需求)
|
||
- FR-01 基本几何类型
|
||
- FR-02 几何变换
|
||
- FR-03 曲线建模
|
||
- FR-04 曲面建模
|
||
- FR-05 网格处理
|
||
- FR-06 布尔运算
|
||
- FR-07 空间索引
|
||
- FR-08 碰撞检测
|
||
- FR-09 几何计算
|
||
- FR-10 公差与精度
|
||
- FR-11 B-Rep 实体建模
|
||
- FR-12 离散化与重建
|
||
- FR-13 数据交换
|
||
- FR-14 高级算法
|
||
3. [非功能需求](#3-非功能需求)
|
||
4. [版本规划](#4-版本规划)
|
||
|
||
---
|
||
|
||
## 1. 引言
|
||
|
||
### 1.1 目的
|
||
|
||
本文档定义 ViewDesignEngine 几何算法引擎的完整功能需求与非功能需求,覆盖 v0.1.0 到 v2.0.0 的全部规划。
|
||
|
||
### 1.2 范围
|
||
|
||
对标 CGAL + OCCT + Manifold + Clipper2 + libigl 五个引擎的核心功能交集,提供从基础几何运算到工业级 B-Rep 建模的全栈几何计算能力。
|
||
|
||
### 1.3 对标基线
|
||
|
||
> 前置阅读:[市场调研与竞品分析](01-市场调研与竞品分析.md) | [功能差距分析](04-功能差距分析.md)
|
||
|
||
| 竞品 | 对标方向 | 差距项数 |
|
||
|------|---------|---------|
|
||
| Clipper2 | 2D 布尔精度与速度 | 2 |
|
||
| Manifold | 3D 网格布尔速度与鲁棒性 | 2 |
|
||
| libigl | 网格处理完整度 | 5 |
|
||
| OCCT | B-Rep 建模能力 | 7 |
|
||
| CGAL | 算法广度 | 8 |
|
||
|
||
### 1.4 术语
|
||
|
||
| 术语 | 定义 |
|
||
|------|------|
|
||
| CSG | 构造实体几何(Constructive Solid Geometry) |
|
||
| NURBS | 非均匀有理 B 样条 |
|
||
| BVH | 包围体层次结构 |
|
||
| GJK/EPA | GJK 碰撞检测 + EPA 穿透深度 |
|
||
| QEM | 二次误差度量(网格简化) |
|
||
| B-Rep | 边界表示法 |
|
||
| CDT | 约束 Delaunay 三角剖分 |
|
||
| Vatti | Vatti 扫描线算法(2D 布尔黄金标准) |
|
||
|
||
---
|
||
|
||
## 2. 功能需求
|
||
|
||
> 标记说明:✅ 已实现 🔨 实现中 📋 已规划 🔜 远期目标
|
||
|
||
### FR-01:基本几何类型
|
||
|
||
| 编号 | 需求 | 对标 | 状态 |
|
||
|------|------|------|------|
|
||
| FR-01.1 | Point2D / Point3D | CGAL Kernel | ✅ |
|
||
| FR-01.2 | Vector2D / Vector3D(点积/叉积/归一化) | CGAL Kernel | ✅ |
|
||
| FR-01.3 | Line / Ray / Segment | CGAL Kernel | ✅ |
|
||
| FR-01.4 | Plane(法向量 + 有符号距离) | CGAL Kernel | ✅ |
|
||
| FR-01.5 | Triangle(面积/法向量/重心坐标/点包含) | CGAL Kernel | ✅ |
|
||
| FR-01.6 | Polygon2D(面积/点包含/CCW 判断) | CGAL Kernel | ✅ |
|
||
| FR-01.7 | AABB(轴对齐包围盒) | CGAL Kernel | ✅ |
|
||
| FR-01.8 | OBB(定向包围盒) | CGAL Optimal Bounding Box | 🔜 P4 |
|
||
|
||
### FR-02:几何变换
|
||
|
||
| 编号 | 需求 | 对标 | 状态 |
|
||
|------|------|------|------|
|
||
| FR-02.1 | 平移/旋转/缩放(3D) | CGAL Kernel | ✅ |
|
||
| FR-02.2 | 4×4 齐次变换矩阵 | Eigen | ✅ |
|
||
| FR-02.3 | 组合变换链 | CGAL | ✅ |
|
||
| FR-02.4 | 反射/镜像变换 | CGAL | 📋 P1 |
|
||
|
||
### FR-03:曲线建模
|
||
|
||
| 编号 | 需求 | 对标 | 状态 |
|
||
|------|------|------|------|
|
||
| FR-03.1 | Bezier 曲线(任意阶) | CGAL | ✅ |
|
||
| FR-03.2 | B-Spline 曲线 | CGAL | ✅ |
|
||
| FR-03.3 | NURBS 曲线(Cox-de Boor 求值) | CGAL NURBS | ✅ |
|
||
| FR-03.4 | 曲线一阶/二阶导数 | CGAL | 🔨 部分实现 |
|
||
| FR-03.5 | 曲线分割与拼接 | CGAL | 📋 P2 |
|
||
| FR-03.6 | 曲线升阶 | CGAL | 📋 P2 |
|
||
| FR-03.7 | 曲线弧长参数化 | CGAL | 📋 P2 |
|
||
| FR-03.8 | 曲线-曲线求交 | CGAL | 📋 P2 |
|
||
| FR-03.9 | 曲线投影(点到曲线最近点) | CGAL | 📋 P2 |
|
||
|
||
### FR-04:曲面建模
|
||
|
||
| 编号 | 需求 | 对标 | 状态 |
|
||
|------|------|------|------|
|
||
| FR-04.1 | Bezier 曲面 | CGAL | ✅ |
|
||
| FR-04.2 | B-Spline 曲面 | CGAL | ✅ |
|
||
| FR-04.3 | NURBS 曲面(张量积) | CGAL / OCCT | 🔨 部分实现 |
|
||
| FR-04.4 | 曲面求值与求导 | CGAL | 🔨 |
|
||
| FR-04.5 | 曲面法向量计算 | CGAL | ✅ |
|
||
| FR-04.6 | 曲面离散化(三角网格化) | CGAL | ✅ |
|
||
| FR-04.7 | 曲面修剪(Trimmed Surface) | OCCT | 📋 P2 |
|
||
| FR-04.8 | 曲面-曲面求交 | OCCT | 📋 P2 |
|
||
| FR-04.9 | 直纹面(Ruled Surface) | OCCT | 📋 P2 |
|
||
| FR-04.10 | 旋转面(Surface of Revolution) | OCCT | 📋 P2 |
|
||
|
||
### FR-05:网格处理
|
||
|
||
| 编号 | 需求 | 对标 | 状态 |
|
||
|------|------|------|------|
|
||
| FR-05.1 | 半边数据结构(Half-Edge) | CGAL Polyhedron | ✅ |
|
||
| FR-05.2 | Delaunay 三角剖分 2D(Bowyer-Watson) | CGAL 2D Triangulation | ✅ |
|
||
| FR-05.3 | 约束 Delaunay 三角剖分 2D(CDT) | CGAL / Triangle | 📋 P1 |
|
||
| FR-05.4 | 3D Delaunay 四面体剖分 | CGAL 3D Triangulation | 📋 P1 |
|
||
| FR-05.5 | **网格简化(QEM)** | CGAL / libigl | 🔨 P0 |
|
||
| FR-05.6 | **网格平滑(Laplacian / Taubin)** | libigl | 🔨 P0 |
|
||
| FR-05.7 | **网格质量评估** | CGAL | 🔨 P0 |
|
||
| FR-05.8 | **网格修复(水密化/孔洞填充/去除非流形)** | Manifold / CGAL | 🔨 P0 |
|
||
| FR-05.9 | 网格细分(Loop / Catmull-Clark) | libigl | 📋 P2 |
|
||
| FR-05.10 | 网格重网格化(Isotropic Remeshing) | CGAL | 📋 P2 |
|
||
| FR-05.11 | 网格参数化(Tutte / LSCM) | libigl | 📋 P2 |
|
||
| FR-05.12 | 测地线距离 | libigl / CGAL | 📋 P1 |
|
||
| FR-05.13 | 离散曲率(高斯曲率/平均曲率) | libigl | 📋 P1 |
|
||
| FR-05.14 | 网格法向量(面/顶点/角) | CGAL | ✅ |
|
||
|
||
### FR-06:布尔运算
|
||
|
||
| 编号 | 需求 | 对标 | 状态 |
|
||
|------|------|------|------|
|
||
| FR-06.1 | **2D 多边形布尔(Vatti 算法)** | Clipper2 | 🔨 P0 |
|
||
| FR-06.2 | 2D 多边形偏移(膨胀/腐蚀) | Clipper2 | 📋 P1 |
|
||
| FR-06.3 | **3D 网格布尔(并/交/差)** | Manifold / CGAL | 🔨 P0 |
|
||
| FR-06.4 | B-Rep 实体布尔 | OCCT | 📋 P2 |
|
||
| FR-06.5 | Nef 多面体精确布尔 | CGAL | 🔜 P4 |
|
||
|
||
### FR-07:空间索引
|
||
|
||
| 编号 | 需求 | 对标 | 状态 |
|
||
|------|------|------|------|
|
||
| FR-07.1 | BVH(SAH 构建 + 射线/范围/KNN 查询) | CGAL AABB Tree | 🔨 基础版 |
|
||
| FR-07.2 | **BVH 最近命中查询** | CGAL | 🔨 P0 |
|
||
| FR-07.3 | Octree(点云/网格) | CGAL | 🔨 P0 |
|
||
| FR-07.4 | KD-Tree(KNN/范围查询) | CGAL | 🔨 P0 |
|
||
| FR-07.5 | R-Tree(空间对象索引) | GEOS / CGAL | 🔨 P1 |
|
||
| FR-07.6 | 空间索引抽象接口 | — | ✅ |
|
||
|
||
### FR-08:碰撞检测
|
||
|
||
| 编号 | 需求 | 对标 | 状态 |
|
||
|------|------|------|------|
|
||
| FR-08.1 | GJK 相交判断 | — | ✅ |
|
||
| FR-08.2 | **GJK 最小距离计算** | — | 🔨 P0 |
|
||
| FR-08.3 | **EPA 穿透深度(碰撞点+法向量+深度)** | — | 🔨 P0 |
|
||
| FR-08.4 | SAT 多面体碰撞 | — | 🔨 P1 |
|
||
| FR-08.5 | 射线-三角形相交(Möller-Trumbore) | — | ✅ |
|
||
| FR-08.6 | 射线-网格相交(利用 BVH) | — | 📋 P1 |
|
||
| FR-08.7 | 三角形-三角形相交 | — | 🔨 P1 |
|
||
| FR-08.8 | AABB-AABB / OBB-OBB 相交 | — | 📋 P1 |
|
||
| FR-08.9 | 连续碰撞检测(CCD) | — | 📋 P2 |
|
||
|
||
### FR-09:几何计算
|
||
|
||
| 编号 | 需求 | 对标 | 状态 |
|
||
|------|------|------|------|
|
||
| FR-09.1 | 距离计算(点-点/线/面/三角形/线段) | CGAL | ✅ |
|
||
| FR-09.2 | 最近点查询 | CGAL | ✅ |
|
||
| FR-09.3 | 2D 凸包(Graham Scan) | CGAL | ✅ |
|
||
| FR-09.4 | **3D 凸包(QuickHull)** | CGAL | 🔨 P0 |
|
||
| FR-09.5 | 2D Voronoi 图 | CGAL | 📋 P1 |
|
||
| FR-09.6 | 3D Voronoi 图 | CGAL | 📋 P2 |
|
||
| FR-09.7 | 面积计算(多边形/曲面) | CGAL | ✅ |
|
||
| FR-09.8 | 体积计算(多面体) | CGAL | 📋 P1 |
|
||
| FR-09.9 | 主成分分析(PCA) | CGAL | 📋 P2 |
|
||
|
||
### FR-10:公差与精度
|
||
|
||
| 编号 | 需求 | 对标 | 状态 |
|
||
|------|------|------|------|
|
||
| FR-10.1 | 可配置全局/局部公差 | CGAL | ✅ |
|
||
| FR-10.2 | 精确谓词(orient_2d/3d, in_circle) | CGAL Exact | ✅ 基础版 |
|
||
| FR-10.3 | Shewchuk 自适应精度完整实现 | CGAL | 🔨 简化版 |
|
||
| FR-10.4 | 几何吸附(snapping) | — | 📋 P1 |
|
||
|
||
### FR-11:B-Rep 实体建模
|
||
|
||
| 编号 | 需求 | 对标 | 状态 |
|
||
|------|------|------|------|
|
||
| FR-11.1 | B-Rep 数据结构(体/壳/面/环/边/顶点) | OCCT | 📋 P2 |
|
||
| FR-11.2 | 拉伸体(Extrude) | OCCT | 📋 P2 |
|
||
| FR-11.3 | 旋转体(Revolve) | OCCT | 📋 P2 |
|
||
| FR-11.4 | 扫掠体(Sweep) | OCCT | 📋 P2 |
|
||
| FR-11.5 | 放样体(Loft) | OCCT | 📋 P2 |
|
||
| FR-11.6 | 倒角(Fillet / Chamfer) | OCCT | 📋 P2 |
|
||
| FR-11.7 | 抽壳(Shell / Hollow) | OCCT | 📋 P2 |
|
||
| FR-11.8 | 曲面偏移(Offset) | OCCT | 📋 P2 |
|
||
| FR-11.9 | 基本体生成(盒/球/柱/锥/环) | OCCT | 📋 P2 |
|
||
|
||
### FR-12:离散化与重建
|
||
|
||
| 编号 | 需求 | 对标 | 状态 |
|
||
|------|------|------|------|
|
||
| FR-12.1 | Marching Cubes(等值面提取) | libigl | 📋 P1 |
|
||
| FR-12.2 | 体素化(网格→体素 / 体素→网格) | libigl | 📋 P1 |
|
||
| FR-12.3 | Alpha Shapes(点云→网格) | CGAL | 📋 P2 |
|
||
| FR-12.4 | 曲面重建(Poisson 重建) | CGAL | 📋 P2 |
|
||
|
||
### FR-13:数据交换
|
||
|
||
| 编号 | 需求 | 对标 | 状态 |
|
||
|------|------|------|------|
|
||
| FR-13.1 | OBJ 读写 | CGAL / libigl | ✅ |
|
||
| FR-13.2 | STL 读写(文本+二进制) | CGAL | ✅ |
|
||
| FR-13.3 | PLY 读写 | libigl | 📋 P3 |
|
||
| FR-13.4 | OFF 读写 | CGAL | 📋 P3 |
|
||
| FR-13.5 | STEP 导入/导出 | OCCT | 🔜 P3 |
|
||
| FR-13.6 | IGES 导入/导出 | OCCT | 🔜 P3 |
|
||
| FR-13.7 | glTF 导出 | OCCT | 📋 P3 |
|
||
|
||
### FR-14:高级算法
|
||
|
||
| 编号 | 需求 | 对标 | 状态 |
|
||
|------|------|------|------|
|
||
| FR-14.1 | Nef 多面体(精确布尔) | CGAL | 🔜 P4 |
|
||
| FR-14.2 | 点云配准(ICP) | CGAL / PCL | 🔜 P4 |
|
||
| FR-14.3 | 最优包围盒(OBB 最小体积) | CGAL | 🔜 P4 |
|
||
|
||
---
|
||
|
||
## 3. 非功能需求
|
||
|
||
### NFR-01:性能
|
||
|
||
| 指标 | 输入规模 | 目标 | 对标 |
|
||
|------|---------|------|------|
|
||
| 2D 布尔(Vatti) | 10⁴ 顶点 | ≤ 0.1s | Clipper2 |
|
||
| 3D 网格布尔 | 10⁵ 三角面 | ≤ 1s | Manifold |
|
||
| 网格简化 | 10⁵→10⁴ 面 | ≤ 2s | CGAL |
|
||
| BVH 射线查询 | 10⁶ 面 | ≤ 0.1ms/次 | CGAL |
|
||
| Delaunay 2D | 10⁶ 点 | ≤ 10s | CGAL |
|
||
| 3D Delaunay | 10⁵ 点 | ≤ 5s | CGAL |
|
||
| GJK 碰撞 | 凸体 | ≤ 30 次迭代 | — |
|
||
|
||
### NFR-02:可靠性
|
||
|
||
- 核心算法单元测试覆盖率 ≥ 90%
|
||
- 2D/3D 布尔运算通过标准测试集
|
||
- 所有公开 API 有边界条件测试
|
||
|
||
### NFR-03:可移植性
|
||
|
||
- Linux GCC 9+ / Clang 12+
|
||
- Windows MSVC 2019+
|
||
- macOS Clang 12+
|
||
|
||
### NFR-04:可扩展性
|
||
|
||
- 模块化架构,仅 Eigen 一个必需依赖
|
||
- 空间索引后端可替换
|
||
- C API 支持跨语言绑定
|
||
|
||
### NFR-05:许可证
|
||
|
||
- Apache 2.0,商业友好
|
||
|
||
---
|
||
|
||
## 4. 版本规划
|
||
|
||
| 版本 | 包含功能 | 优先级覆盖 |
|
||
|------|---------|-----------|
|
||
| **v0.1.0** | 基础几何 + 曲线曲面 + 基础网格 + 基础 BVH + GJK | ✅ 已完成 |
|
||
| **v0.3.0** | P0 全部 11 项(Vatti/网格布尔/QEM/3D凸包/Octree等) | P0 |
|
||
| **v0.5.0** | P1 全部 12 项(Voronoi/3DDelaunay/MarchingCubes/曲率等) | P1 |
|
||
| **v1.0.0** | P2 全部 10 项(B-Rep/倒角/抽壳/扫掠/放样/参数化等) | P2 |
|
||
| **v1.5.0** | P3 全部 5 项(STEP/IGES/PLY/glTF 等) | P3 |
|
||
| **v2.0.0** | P4 全部 3 项(Nef/ICP/OBB) | P4 |
|
||
|
||

|
||
|
||
```
|
||
现在 追上Clipper2 追上Manifold 追上OCCT 追上CGAL高级
|
||
+Manifold +libigl 建模层 功能
|
||
```
|
||
|
||
### FR-15:差异化功能(VDE 独有/首创)
|
||
|
||
> 竞品分析详见:[核心竞争力与差异化功能](05-核心竞争力与差异化功能.md)
|
||
|
||
| 编号 | 需求 | 竞品状态 | 状态 |
|
||
|------|------|---------|------|
|
||
| FR-15.1 | **2D 草图约束求解器**(几何约束图 + 牛顿迭代) | ❌ 仅商业 CAD 有(DCM/PTC),开源为零 | 🔜 P4 |
|
||
| FR-15.2 | **SDF 隐式建模**(基本体/布尔/变形/光滑混合→网格) | ❌ 无 | 🔜 P3 |
|
||
| FR-15.3 | **可微分几何**(距离/碰撞/布尔对参数的梯度) | ❌ 无 | 🔜 P4 |
|
||
| FR-15.4 | **惰性求值几何管线**(计算图+缓存+并行) | ❌ 无此架构 | 🔜 P2 |
|
||
| FR-15.5 | **Python 原生绑定**(pybind11,pip install 即用) | 🔸 CGAL 有笨重 SWIG 绑定 | 🔜 P1 |
|
||
| FR-15.6 | **二进制序列化格式**(版本化、比 OBJ 快 10x) | ❌ 全部依赖文本格式 | 🔜 P1 |
|
||
| FR-15.7 | **内置性能分析/基准框架** | ❌ 无 | 🔜 P1 |
|
||
| FR-15.8 | **WebAssembly 编译目标** | 🔸 Manifold 支持 | 🔜 P2 |
|
||
| FR-15.9 | **自动 LOD 链生成** | 🔸 libigl 有简化无自动链 | 🔜 P2 |
|
||
| FR-15.10 | **增量计算框架**(脏标记/缓存/最小重算) | 🔸 OCCT OCAF 有但笨重 | 🔜 P2 |
|
||
| FR-15.11 | **GPU 加速 BVH 遍历**(CUDA/Vulkan 后端) | ❌ 无开源引擎支持 | 🔜 P3 |
|
||
| FR-15.12 | **实时碰撞检测模式**(持续监测+回调) | ❌ 全部为查询式 | 🔜 P3 |
|
||
| FR-15.13 | **几何操作宏录制/回放** | ❌ 无 | 🔜 P3 |
|
||
|
||
### FR-16:Python API(等效 C++ 功能)
|
||
|
||
> Python 绑定不是简单的 wrapper——需要为 Python 用户设计 Pythonic API。
|
||
|
||
| 编号 | 需求 | 状态 |
|
||
|------|------|------|
|
||
| FR-16.1 | `vde.Point`, `vde.Vector`, `vde.Mesh` 等 Python 类 | 🔜 P1 |
|
||
| FR-16.2 | numpy 数组互操作(零拷贝) | 🔜 P1 |
|
||
| FR-16.3 | Jupyter Notebook 内联可视化 | 🔜 P1 |
|
||
| FR-16.4 | 与 trimesh / open3d 互转 | 🔜 P2 |
|