# PipeBuilder **Repository Path**: wtyhz/pipe-builder ## Basic Information - **Project Name**: PipeBuilder - **Description**: 根据二维矢量数据生成三维管网 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-06 - **Last Updated**: 2026-09-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: 管网, 3d, BIM, GIS ## README # pipe-builder 基于 [OpenSceneGraph (OSG)](https://openscenegraph.github.io/openscenegraph.io/) 的 C++ 管道/管件网格构建库。 通过**扫掠(Sweep)**与**放样(Loft)**两种挤出算法,将二维截面沿三维路径生成管道网格,内置平行传输 TBN 坐标系(最小旋转标架),有效避免管体沿路径扭转。适用于构建直管、弯头、变径管、异形过渡段等管道几何体。 ## 功能特性 - **扫掠挤出(SweepExtrude)**:单个截面沿路径扫掠生成管体 - **放样挤出(LoftExtrude)**:多个截面沿路径平滑过渡 - 截面点数自动统一化(插值到最大点数) - 样条线驱动的截面插值过渡 - 截面形状自动对齐、逆时针方向校正 - **平行传输 TBN 坐标系**:基于旋转最小化标架(Rotation Minimizing Frame),避免管体扭转 - **多种内置截面**:圆形、矩形(支持圆角)、任意多边形 - **多种样条线**:Catmull-Rom(向心/弦长/标准)、Hermite(支持 UE 风格 Arrive/Leave 切线) - **纹理与颜色**:支持纹理坐标生成(UV 缩放、交换)或顶点颜色模式 - **调试可视化**:路径线、截面线、TBN 坐标系可视化(仅 Debug 构建) ## 目录结构 ``` pipe-builder/ ├── include/ # 头文件 │ ├── extrude/ # 挤出算法 │ │ ├── Extrude.h # 挤出基类(TBN、网格构建通用逻辑) │ │ ├── SweepExtrude.h # 扫掠挤出 │ │ └── LoftExtrude.h # 放样挤出 │ ├── section/ # 截面 │ │ ├── SectionBase.h # 截面基类 │ │ ├── CircleSection.h # 圆形截面 │ │ ├── RectangleSection.h # 矩形截面 │ │ └── PolygonSection.h # 多边形截面 │ └── spline/ # 样条线 │ ├── Spline.h # 样条线基类 │ ├── CatmullRomSpline.h # Catmull-Rom 样条线 │ └── HermiteSpline.h # Hermite 样条线 ├── src/ # 实现文件(与 include 目录结构对应) ├── tests/ # 测试/示例程序 │ ├── loftExtrude/ # 放样示例(圆形→矩形过渡、螺旋路径、异形截面等) │ └── sweepExtrude/ # 扫掠示例(直管、弯头等) ├── assets/images/ # 示例纹理图片 ├── CMakeLists.txt ├── CMakeSettings.json # Visual Studio CMake 配置 └── vcpkg.json # Vcpkg 依赖清单 ``` ## 环境要求 | 项目 | 要求 | | -------- | ----------------------------------------------------------------------------- | | 语言标准 | C++11 | | 构建工具 | CMake >= 3.12 | | 包管理 | [Vcpkg](https://github.com/microsoft/vcpkg)(清单模式,根目录 `vcpkg.json`) | | 核心依赖 | OpenSceneGraph >= 3.6.5(启用`plugins`、`tools` 特性) | | 操作系统 | Windows / Linux | ## 构建指南 ### 前置准备 1. 安装 Vcpkg,并完成初始化: ```powershell git clone https://github.com/microsoft/vcpkg.git E:/SDK/vcpkg E:/SDK/vcpkg/bootstrap-vcpkg.bat ``` 2. 修改 [CMakeLists.txt](CMakeLists.txt) 中的工具链路径为本机实际的 Vcpkg 路径: ```cmake # Windows 默认路径(需要按实际修改) set(CMAKE_TOOLCHAIN_FILE E:/SDK/vcpkg/scripts/buildsystems/vcpkg.cmake) ``` > OSG 依赖由 Vcpkg 清单模式(`vcpkg.json`)自动安装,首次配置构建需要联网下载依赖。 ### Windows(Visual Studio) 使用 Visual Studio 直接打开项目文件夹(内置 CMake 支持),从配置下拉框选择 `x64-Debug` 或 `x64-Release`(见 `CMakeSettings.json`),随后生成并运行目标 `loftExtrude` / `sweepExtrude` 即可。 ### 命令行构建 ```powershell # 配置(工具链路径已在 CMakeLists.txt 中指定) cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug # 构建 cmake --build build ``` ### Linux 将 `CMakeLists.txt` 中 Linux 分支的 `CMAKE_TOOLCHAIN_FILE` 修改为实际 Vcpkg 路径(默认目标三元组为 `x64-linux-dynamic`),构建方式同上。 ### 输出说明 - 可执行文件按构建类型输出到项目根目录下的 `Debug/`、`Release/`、`RelWithDebInfo/`、`MinSizeRel/` - 库文件后缀:Debug `d`、Release 无后缀、RelWithDebInfo `_rel`、MinSizeRel `_min` - Windows 下构建后自动复制 `osgPlugins-3.6.5` 插件目录与 `jpeg62.dll` 到对应输出目录 ## 快速开始 ### 扫掠挤出:圆形截面沿样条路径成管 ```cpp #include #include #include "extrude/SweepExtrude.h" #include "section/CircleSection.h" #include "spline/CatmullRomSpline.h" #include "spline/HermiteSpline.h" int main() { // 1. 生成圆形截面(半径 1.0,32 段细分) CircleSection circle(1.0, 32); std::vector sectionPoints = circle.generatePoints(); // 2. 通过样条线定义路径并采样 CatmullRomSpline spline; spline.setControlPoints({ { 10, 0, 5 }, { 15, 5, 10 }, { 15, 15, 12 }, { 10, 20, 15 }, { 0, 25, 20 } }); const int sampleCount = 50; std::vector pathPoints; for (int i = 0; i < sampleCount; ++i) { pathPoints.push_back(spline.getPoint(static_cast(i) / (sampleCount - 1))); } // 3. 扫掠构建网格 SweepExtrude sweep; sweep.setSplineType(std::make_shared()); // 必须设置,否则 buildMesh 返回空 sweep.setPath(pathPoints); sweep.setSectionPoints(sectionPoints); sweep.setTextureScale(osg::Vec2d(10.0, 4.0)); // 一个纹理单位对应的物理尺寸 osg::ref_ptr geometry = sweep.buildMesh(); // 4. 显示 osg::ref_ptr geode = new osg::Geode; geode->addDrawable(geometry); osgViewer::Viewer viewer; viewer.setSceneData(geode); viewer.setUpViewInWindow(100, 100, 1280, 720); return viewer.run(); } ``` ### 放样挤出:圆形到矩形的平滑过渡 ```cpp #include "extrude/LoftExtrude.h" #include "section/CircleSection.h" #include "section/RectangleSection.h" #include "spline/CatmullRomSpline.h" LoftExtrude loft; loft.setPath({ {0,0,0}, {10,0,30} }); // 路径点 loft.setInterpolationParams(15); // 相邻截面间插值 15 个中间截面 loft.setSplineType(std::make_shared()); // 截面过渡所用样条线 // 创建截面并按顺序添加(截面与路径点一一对应) CircleSection circle(2.0, 16); RectangleSection rect(3.0, 1.5, 16); loft.addSection(circle.generatePoints()); loft.addSection(rect.generatePoints()); loft.setTextureScale(osg::Vec2d(8.0, 6.0)); osg::ref_ptr geometry = loft.buildMesh(); ``` > 完整的可运行示例请参考 [tests/loftExtrude/loft_extrude_test.cpp](tests/loftExtrude/loft_extrude_test.cpp) 与 [tests/sweepExtrude/sweep_extrude_test.cpp](tests/sweepExtrude/sweep_extrude_test.cpp)。示例程序使用相对路径读取纹理(`..\assets\images\*.jpg`),运行时请将工作目录设置为输出目录下的可执行文件所在位置。 ## 核心 API 概览 ### 挤出基类 Extrude(抽象) | 方法 | 说明 | | ----------------------------------------- | ---------------------------------------------------------------------------- | | `setPath` / `getPath` | 设置/获取路径点 | | `setSplineType` / `getSplineType` | 设置/获取样条线模板(**必需**,为空时 `buildMesh` 返回 `nullptr`) | | `setTextureScale` / `getTextureScale` | 纹理缩放:s 方向沿截面、t 方向沿路径 | | `setSwapUV` / `getSwapUV` | 交换 UV 方向 | | `setEnableVertexColor` / `setColor` | 顶点颜色模式(启用后不再生成纹理坐标) | | `setInterpolationParams` | 相邻截面间的插值段数 | | `buildMesh` | 生成`osg::Geometry` 网格 | ### 扫掠挤出 SweepExtrude | 方法 | 说明 | | ------------------------------------------- | -------------------------------------- | | `setSectionPoints` / `getOriginSection` | 设置/获取扫掠截面点集 | | `buildMesh` | 截面沿路径扫掠生成网格(含逆时针校正) | ### 放样挤出 LoftExtrude | 方法 | 说明 | | ----------------------------------- | -------------------------------------------------------------- | | `addSection` | 按顺序添加截面点集(与路径点一一对应) | | `getOriginSections` | 获取原始截面集合 | | `getAllPath` / `getAllSections` | 获取插值后的完整路径点与截面 | | `buildMesh` | 生成放样网格(截面统一化 → 形状对齐 → 样条插值 → 网格构建) | ### 截面 | 类 | 构造参数 | 说明 | | -------------------- | ----------------------------- | ---------------------------------------------- | | `CircleSection` | `(radius, segments)` | 圆形/圆弧截面,可设置起始角与结束角 | | `RectangleSection` | `(width, height, segments)` | 矩形截面,支持圆角(`setUseRoundedCorners`) | | `PolygonSection` | `(points, segments)` | 任意多边形截面,支持自定义顶点集 | 公共接口:`generatePoints`、`getArea`、`getPerimeter`、`getCenter`、`getBoundingBox`、`clone`、`isValid` 等。 ### 样条线 | 类 | 说明 | | -------------------- | ----------------------------------------------------------------------------------- | | `CatmullRomSpline` | 支持向心型(默认)/弦长型/标准三种类型,可配置闭合与张力 | | `HermiteSpline` | 支持自定义 key 与 Arrive/Leave 切线,`autoComputeTangents` 可自动生成 UE 风格切线 | ### 调试可视化(仅 Debug 构建可用) | 方法 | 说明 | | --------------------------- | ------------------------------------------- | | `buildPathLine` | 生成路径线段可视化 | | `buildPerPathSectionLine` | 生成每个路径点处的截面线可视化 | | `buildTBNFrames` | 生成 TBN 坐标系可视化(T 红 / B 绿 / N 蓝) | ## 运行示例 构建完成后运行 `loftExtrude` 或 `sweepExtrude` 可执行文件,将弹出 OSG 窗口展示对应示例: - **loftExtrude**:圆形→矩形过渡、矩形→圆形过渡、复杂路径多截面过渡、螺旋路径截面变化、异形多边形过渡、圆形渐缩等 - **sweepExtrude**:圆形直管、矩形方管、圆形弯头 ## 示例图片 ![示例图片 0](assets/examples/0.png) ![示例图片 1](assets/examples/1.png) ![示例图片 2](assets/examples/2.png) ![示例图片 3](assets/examples/3.png) ![示例图片 4](assets/examples/4.png) ## 许可证 本项目为个人开发者所有,未经书面授权禁止任何形式的使用、复制、修改、分发或出售。详情见 [LICENSE](LICENSE)。 授权联系:947643058@qq.com