惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

美团技术团队
P
Privacy International News Feed
P
Proofpoint News Feed
Security Archives - TechRepublic
Security Archives - TechRepublic
C
CXSECURITY Database RSS Feed - CXSecurity.com
Know Your Adversary
Know Your Adversary
Security Latest
Security Latest
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Attack and Defense Labs
Attack and Defense Labs
NISL@THU
NISL@THU
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
GbyAI
GbyAI
N
News and Events Feed by Topic
N
News | PayPal Newsroom
Y
Y Combinator Blog
C
CERT Recently Published Vulnerability Notes
N
Netflix TechBlog - Medium
S
Security Affairs
Spread Privacy
Spread Privacy
罗磊的独立博客
腾讯CDC
MyScale Blog
MyScale Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
L
LINUX DO - 热门话题
The Cloudflare Blog
L
LangChain Blog
博客园_首页
H
Hacker News: Front Page
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
SecWiki News
SecWiki News
A
Arctic Wolf
爱范儿
爱范儿
Google Online Security Blog
Google Online Security Blog
T
Threat Research - Cisco Blogs
Hacker News - Newest:
Hacker News - Newest: "LLM"
有赞技术团队
有赞技术团队
The GitHub Blog
The GitHub Blog
Cyberwarzone
Cyberwarzone
博客园 - 叶小钗
V
Visual Studio Blog
V
V2EX
T
Tailwind CSS Blog
Project Zero
Project Zero
T
The Blog of Author Tim Ferriss
F
Fortinet All Blogs
MongoDB | Blog
MongoDB | Blog
D
Docker

博客园 - 我才是银古

第16章:常见问题、排错与最佳实践 第15章:扩展生态、MCAD 与外部集成 第12章:实战案例:机械结构与 3D 打印零件 第14章:构建、测试、调试与贡献流程 第13章:OpenSCAD 源码架构与核心执行流程 第11章:预览、渲染、网格精度与性能优化 第09章:列表推导、递归与算法建模 第08章:参数化零件库与复用设计 第10章:导入导出、命令行与自动化 第07章:二维图形、拉伸、旋转与投影 第05章:基础几何、坐标系与变换 第04章:参数、变量、函数、模块与作用域 OpenSCAD 教程目录 第03章:OpenSCAD 语言基础 第02章:安装、环境配置与开发工作流 第01章:OpenSCAD 项目全景与学习路线 第02章:源码获取、编译与开发环境配置 第01章:OCCT项目全景与学习路线 第18章:二次开发实战与综合案例 第17章:与 Qt VTK Python pythonOCC 生态集成 第18章:综合实战案例 第17章:数据交换与协同 第16章:源码架构与二次开发 第15章:插件与自定义工作台开发 第14章:Python脚本宏与自动化 第13章:FEM仿真分析 第12章:CAM数控加工 第11章:SurfaceMesh与逆向工程 第10章:Draft二维绘图与BIM建筑 第09章:工程图TechDraw 第07章:参数化表达式与Spreadsheet 第08章:装配设计Assembly 第06章:Part工作台与几何内核 第05章:PartDesign实体特征建模 第04章:草图Sketcher约束建模 第02章:安装版本与工作环境配置 第03章:界面工作台与基础操作 第01章:项目全景与学习路线 第十二章:插件开发、研究功能与最佳实践 第十章:定时任务与自动化(Cron) 第七章:技能、记忆与自学习闭环 第八章:MCP 集成与上下文文件 第六章:工具系统与终端后端 第五章:模型供应商与配置体系 Hermes Agent 教程目录 第十一章:语音、视觉、浏览器与子代理协作 第四章:CLI/TUI 与会话管理 第十二章:学习路线、实战方案与最佳实践 第十一章:源码结构、开发调试与插件开发 第十章:自动化、远程访问、日志与排障 第九章:Control UI、节点、Canvas 与语音能力 第七章:工具、技能、插件与能力扩展 第八章:安全模型、访问控制与沙箱实践 第六章:Agent 工作区、会话与多智能体路由 第五章:多通道消息接入与聊天平台配置 第四章:配置体系、模型接入与认证管理 第三章:Gateway 架构、协议与运行机制 第二章:安装、环境准备与快速上手 第一章:OpenClaw 项目概览与核心定位 oh-my-openagent 教程目录 09-命令模型回退与配置参考 10-实战案例最佳实践与故障排除 05-工作模式-Ultrawork-Prometheus-Atlas 08-Hooks与MCP系统 06-Category与Skill系统 07-核心工具链 04-智能体全景详解 03-安装与环境配置 02-整体架构与多模型编排机制 01-项目简介与核心理念 01-项目概览与学习路线 02-安装部署与工具适配 03-Skill机制与using-superpowers 05-TDD系统化调试与完成前验证 04-需求澄清方案设计与计划编写 07-并行智能体子智能体与Git-Worktree 第六章:代码审查、反馈处理与分支收尾 08-中国特色Skills与本土团队落地 09-MCP构建工作流执行与自定义Skill 第23章:FreeCAD-Python-API Clipper2 C# 源码解读教程 第19章:PolyTree 多边形树结构 第20章:实际应用与最佳实践 第18章:Minkowski 和与差 第17章:RectClip 矩形裁剪优化 第16章:ClipperOffset 偏移类详解 第15章:填充规则详解 第14章:布尔运算执行流程 第13章:ClipperD 浮点裁剪类 第11章:OutRec 与 OutPt 输出结构 第9章:Active 活动边结构 第10章:Vertex 顶点与 LocalMinima 局部极小值 第12章:Clipper64 裁剪类详解 第7章:高精度运算与128位整数 第8章:ClipperBase 基类详解 第5章:枚举类型与常量定义 第6章:InternalClipper 内部工具类 第2章:核心数据结构 - Point64、PointD 第3章:路径与多边形表示 - Path64、PathD、Paths64、PathsD 第4章:矩形边界 - Rect64、RectD
第06章:CSG 布尔建模方法
我才是银古 · 2026-05-06 · via 博客园 - 我才是银古

第06章:CSG 布尔建模方法

1. CSG 思维

CSG 是 Constructive Solid Geometry,即构造实体几何。OpenSCAD 的建模核心就是把基本体通过并集、差集、交集和变换组合为复杂实体。理解 CSG 的关键是把模型拆成“材料”和“刀具”:哪些体表示保留材料,哪些体表示切除空间,哪些体用于限制范围。

2. union 并集

union 合并多个对象:

union() {
    cube([40, 20, 5], center = true);
    translate([0, 0, 10]) cylinder(h = 20, d = 12, center = true);
}

许多情况下,多个顶层对象会隐式并列显示,但显式写 union() 能让结构更清晰,尤其是在差集或交集中作为一个整体使用时。

3. difference 差集

difference 用第一个子对象减去后续所有子对象:

difference() {
    cube([50, 30, 10], center = true);
    cylinder(h = 12, d = 8, center = true);
}

差集是机械建模中最常用的操作,用于孔、槽、腔体、倒角、避让和装配空间。

注意事项:

  • 切除体要比被切对象略大,避免共面。
  • 孔的圆柱应贯穿实体,而不是刚好等高。
  • 差集对象过多会增加渲染时间,可分组优化。
  • 切除体可用 # 高亮检查位置。

4. intersection 交集

intersection 只保留多个对象重叠区域:

intersection() {
    sphere(20);
    cube([30, 30, 10], center = true);
}

交集适合裁剪曲面、限制复杂对象范围、制作圆顶切片、生成特定包络内的结构。

5. 组合布尔的结构化写法

复杂模型应分模块写布尔逻辑:

module body() {
    cube([80, 40, 10], center = true);
}

module holes() {
    for (x = [-25, 25])
        translate([x, 0, 0]) cylinder(h = 12, d = 5, center = true);
}

module part() {
    difference() {
        body();
        holes();
    }
}

part();

这种写法比把所有语句堆在一个 difference 里更容易维护。

6. 避免共面问题

布尔运算中,两个面完全重合可能导致预览闪烁、渲染警告或导出异常。常见解决方式是添加微小余量:

epsilon = 0.01;

difference() {
    cube([40, 20, 5], center = true);
    translate([0, 0, 0]) cylinder(h = 5 + 2*epsilon, d = 8, center = true);
}

不要滥用过大的余量,否则会改变设计尺寸。epsilon 应只用于布尔稳定性,不应成为修补错误设计的工具。

7. 可制造性约束

CSG 只保证几何组合,不保证可制造。设计零件时还需考虑:

  • 3D 打印最小壁厚。
  • 螺丝孔预留间隙。
  • 嵌件热熔孔径。
  • 卡扣变形空间。
  • FDM 桥接长度和支撑方向。
  • SLA 排液孔和空腔厚度。
  • CNC 刀具半径导致的内角限制。

例如,FDM 打印 M3 通孔不应简单设置 d = 3.0,通常需要根据机器、材料和后处理使用 3.2 到 3.5 mm 左右的孔径。

8. 用差集制作盒体

module open_box(size = [80, 50, 25], wall = 2) {
    difference() {
        cube(size, center = true);
        translate([0, 0, wall])
            cube([size[0]-2*wall, size[1]-2*wall, size[2]], center = true);
    }
}

open_box();

盒体看似简单,但工程细节很多:底部厚度、侧壁厚度、圆角、盖子配合、螺丝柱、筋板、倒角、开孔、文字标识都应拆分成独立模块。

9. 用 hull 制作圆角板

module rounded_plate(size = [60, 30, 4], r = 5) {
    hull() {
        for (x = [-size[0]/2+r, size[0]/2-r])
            for (y = [-size[1]/2+r, size[1]/2-r])
                translate([x, y, 0]) cylinder(h = size[2], r = r, center = true);
    }
}

rounded_plate();

这种方式比 minkowski 更快,适合二维平面圆角板。

10. 布尔建模检查清单

  • 模型是否由清晰的主体、切除、参考三类对象组成?
  • 切除体是否略微超出被切对象?
  • 是否避免了重合面和零厚度?
  • 是否把重复孔位封装为模块或循环?
  • 是否把复杂布尔分阶段组织,便于定位问题?
  • F6 渲染是否有非流形、自交或空对象警告?
  • 导出后是否在切片软件或网格检查工具中确认闭合?