一、XZ 截面边线倾角 θ 与水平阶差 Δx
在竖直切片平面(XZ 平面)内,定义零件外表面截面边线与竖直轴 +Z 的夹角为悬垂角 θ(θ = 0° 表示竖直壁,此时上下层完全对齐;θ → 90° 表示趋于水平悬空桥接)。当试片在 XZ 平面内绕 Y 轴倾斜摆放角 α 时,原本倾角为 θ_0 的斜面边线,其相对成形平台 +Z 轴的有效悬垂角为 θ_eff = |θ_0 - α|。
每向上递增一层(高度增加 h),新一层外轮廓中心线相对于下一层中心线向悬空侧水平外移的阶差为 Δx = h · tan(θ_eff)。以线宽 w 度量上下两道的中心对齐程度,带符号名义余量比可写为 1 - Δx / w(当 Δx < w 时为正的投影搭接比例;当 Δx ≥ w 时投影搭接为 0,Δx - w 即为上下两道外缘之间的水平脱空步进间隙)。若指定某一参考搭接比例 τ ∈ (0, 1)(例如取 τ = 0.50 作对比基线),可反解出该参考线对应的边线角 θ_ref = arctan((1 - τ) · w / h):
python3 -c "import math
w, tau = 0.48, 0.50
for h in (0.10, 0.16, 0.20, 0.28):
theta_ref = math.degrees(math.atan(((1.0 - tau) * w) / h))
dx_60 = h * math.tan(math.radians(60))
margin_60 = (1.0 - dx_60 / w) * 100.0
print(f'h={h:.2f}mm, w={w:.2f}mm -> tau=50%参考角: {theta_ref:.1f}deg, 60deg边线阶差 dx={dx_60:.3f}mm, 带符号余量比={margin_60:.1f}%')"
| 层高 h (mm) | 线宽 w (mm) | h / w 比值 | τ = 50% 对应几何参考角 | θ = 60° 时水平阶差 Δx 与投影搭接说明 |
|---|---|---|---|---|
0.10 |
0.48 |
0.21 |
67.4° |
Δx = 0.173 mm,投影搭接比 63.9%(高于 50% 参考线)。 |
0.16 |
0.48 |
0.33 |
56.3° |
Δx = 0.277 mm,投影搭接比 42.3%(低于 50% 参考线)。 |
0.20 |
0.45 |
0.44 |
48.4° |
Δx = 0.346 mm,投影搭接比 23.0%(外周大半截面悬空)。 |
0.28 |
0.45 |
0.62 |
38.8° |
Δx = 0.485 mm > w,投影搭接为 0%(带符号余量 -7.8%,水平脱空步进间隙 0.035 mm)。 |
模型边界声明:上表中的投影搭接比纯属二维横截面几何指标,并非「免支撑保证线」。真实悬垂表面是否发生卷翘(Curling)或塌陷,还受切片壁序(先打内壁可为外壁提供同层侧面粘结)、风扇冷却速率、打印速度与拐角曲率共同影响。
二、水平水滴通孔(Teardrop Hole)的右手系坐标变换
当零件包含水平圆孔时,圆孔顶部收口处的截面切线相对于 +Z 轴的夹角会从 45° 连续趋近于 90°。工程上常在 CAD 示例中将圆孔上半部沿切线延伸为顶角 90°(两侧边线相对 +Z 夹角各为 45°)的水滴形尖拱。
在 OpenSCAD 右手坐标系中,若二维水滴截面的尖顶构建在局部二维平面的 +x 轴上(顶点坐标为 (r·√2, 0)),随后调用 linear_extrude(center=true) 沿局部 +z 双向对称拉伸成柱体,要使该通孔沿全局 X 轴贯穿且尖顶严格朝向全局 +Z(打印生长方向顶部),绕 Y 轴旋转 -90° 的右手系坐标变换满足 x' = -z, z' = x(即原局部挤出轴 +z 指向全局 -X,因柱体设 center=true 故沿 X 轴对称贯穿;原局部 +x 尖顶严格转至全局 +Z。若误写为 +90°,变换为 x' = z, z' = -x,局部 +x 尖顶将被翻到 -Z 底部):
module teardrop_hole_x(r=3.1, length=22) {
// 局部 2D 尖顶位于 +x=(r*sqrt(2), 0);绕 Y 轴旋转 -90 度 (x' = -z, z' = x):
// 局部挤出轴 +z 指向全局 -X (center=true 双向对称贯穿 X),局部 +x 尖顶转至全局 +Z
rotate([0, -90, 0])
linear_extrude(height=length, center=true)
hull() {
circle(r=r, $fn=48);
translate([r * sqrt(2) / 2, 0, 0]) rotate([0, 0, 45]) square([r, r], center=true);
}
}
difference() {
cube([20, 14, 16], center=true);
teardrop_hole_x(r=3.1, length=22);
}