跳转到内容

OpenSCAD 用户手册/2D 到 3D 挤出

来自 Wikibooks,开放世界的开放书籍

挤出 是使用固定横截面轮廓创建物体的过程。OpenSCAD 提供了两个命令来从 2D 形状创建 3D 实体:linear_extrude() 和 rotate_extrude()。线性挤出类似于将橡皮泥通过带有特定形状模具的压机。

linear_extrude() 就像一个橡皮泥挤出压机

旋转挤出类似于车削 或在陶轮上“抛制”碗的过程。

rotate_extrude() 模拟抛制容器

两种挤出方法都作用于位于 X-Y 平面的(可能是不连贯的)2D 形状。虽然作用于 2D 形状和 3D 实体的变换可以将形状移出 X-Y 平面,但在执行挤出时,最终结果并不直观。实际上发生的是,任何第三个坐标(Z 坐标)中的信息都被 2D 形状忽略,此过程相当于在执行挤出之前对任何 2D 形状执行隐式投影()。建议对严格位于 X-Y 平面的形状执行挤出。

linear_extrude

[编辑 | 编辑源代码]

线性挤出是一种操作,它以 2D 对象作为输入并生成 3D 对象作为结果。

挤出遵循V向量,默认为Z轴,如果要指定自定义值,则需要 2021.01 版以上。

在 OpenSCAD 中,挤出始终在 2d 对象 xy 平面的投影(阴影)上执行;因此,如果您在挤出之前旋转或对 2d 对象应用其他变换,则其阴影形状就是被挤出的形状。

尽管挤出沿V向量是线性的,但有一个扭曲参数可用,它会导致对象在向上挤出的过程中围绕V向量旋转。这可以用于围绕其中心旋转对象,就像螺旋柱一样,或者围绕V向量产生螺旋挤出,就像猪尾巴一样。

还包括一个缩放参数,以便可以在挤出的整个范围内扩展或收缩对象,从而允许挤出向内或向外扩散。

linear_extrude(height = 5, v = [0, 0, 1], center = true, convexity = 10, twist = -fanrot, slices = 20, scale = 1.0, $fn = 16) {...}

由于向后兼容性问题,您必须使用参数名称。

height 必须为正数。

v 是一个 3D 向量,必须指向正 Z 方向[注意: 需要版本开发快照]

$fn 是可选的,并指定 linear_extrude 的分辨率(数字越高,“平滑度”越高,但需要更多计算时间)。

如果对于非平凡的 2D 形状,挤出失败,请尝试设置 convexity 参数(默认值不是 10,但 10 是一个“好”值)。请参阅下面的说明。

扭曲是形状挤出的角度数。将参数 twist 设置为 360 会挤出整整一圈。扭曲方向遵循左手定则。

twist = 0

0° 扭曲

linear_extrude(height = 10, center = true, convexity = 10, twist = 0)
translate([2, 0, 0])
circle(r = 1);

twist = -100

-100° 扭曲

linear_extrude(height = 10, center = true, convexity = 10, twist = -100)
translate([2, 0, 0])
circle(r = 1);

twist = 100

100° 扭曲

linear_extrude(height = 10, center = true, convexity = 10, twist = 100)
translate([2, 0, 0])
circle(r = 1);

twist = -500

-500° 扭曲

linear_extrude(height = 10, center = true, convexity = 10, twist = -500)
translate([2, 0, 0])
circle(r = 1);

它类似于圆柱体的 center 参数。如果center为 false,则线性挤出 Z 范围为 0 到 height;如果为 true,则范围为 -height/2 到 height/2。


center = true

center = true

linear_extrude(height = 10, center = true, convexity = 10, twist = -500)
translate([2, 0, 0])
circle(r = 1);


center = false

center = false

linear_extrude(height = 10, center = false, convexity = 10, twist = -500)
translate([2, 0, 0])
circle(r = 1);

网格细化

[编辑 | 编辑源代码]

slices 参数定义挤出 Z 轴上中间点的数量。它的默认值会随着 twist 值的增加而增加。显式设置 slices 可能会提高输出细化。此外,segments 参数会向挤出的多边形添加顶点(点),从而产生更平滑的扭曲几何体。Segments 需要是多边形片段的倍数才能生效(对于 circle($fn=3),6 或 9 等;对于 square(),8、12 等)。

slices = 100

linear_extrude(height = 10, center = false, convexity = 10, twist = 360, slices = 100)
translate([2, 0, 0])
circle(r = 1);

特殊变量 $fn、$fs 和 $fa 也可以用于改进输出。如果未定义 slices,则其值将取自定义的 $fn 值。

$fn = 100

linear_extrude(height = 10, center = false, convexity = 10, twist = 360, $fn = 100)
translate([2, 0, 0])
circle(r = 1);

按此值缩放 2D 形状,以覆盖挤出的高度。Scale 可以是标量或向量

 linear_extrude(height = 10, center = true, convexity = 10, scale=3)
 translate([2, 0, 0])
 circle(r = 1);

OpenScad linear_extrude scale example

 linear_extrude(height = 10, center = true, convexity = 10, scale=[1,5], $fn=100)
 translate([2, 0, 0])
 circle(r = 1);

OpenScad linear_extrude scale example2

请注意,如果 scale 是向量,则生成的侧壁可能是非平面的。使用twist=0slices参数来避免不对称

 linear_extrude(height=10, scale=[1,0.1], slices=20, twist=0)
 polygon(points=[[0,0],[20,10],[20,-10]]);

与导入的 SVG 一起使用

[编辑 | 编辑源代码]

此函数的常见用法是导入 2D svg

 linear_extrude(height = 10, center = true)
 import("knight.svg");

rotate_extrude

[编辑 | 编辑源代码]

旋转挤出将 2D 形状围绕 Z 轴旋转以形成具有旋转对称性的实体。思考此操作的一种方法是想象一个放置在 X-Y 平面上并其旋转轴指向 +Z 的陶轮。然后将要制作的对象放在这个虚拟的陶轮上(可能延伸到 X-Y 平面的下方,朝向 -Z)。要制作的对象是 X-Y 平面上对象横截面(仅保留右侧,X >= 0)。这就是将作为子元素馈送到 rotate_extrude() 以生成此实体的 2D 形状。请注意,对象最初位于 X-Y 平面上,但已倾斜向上(绕 X 轴旋转 +90 度)以进行挤出。

由于 OpenSCAD 在 X-Y 平面上渲染 2D 形状,因此思考此操作的另一种方法如下:将 2D 形状围绕 Y 轴旋转以形成实体。生成的实体被放置,使其旋转轴位于 Z 轴上。

就像 linear_extrude 一样,挤出始终在 2D 多边形到 XY 平面的投影上执行。在挤出之前应用于 2D 多边形的变换(如旋转、平移等)会修改 2D 多边形到 XY 平面的投影,因此也会修改最终 3D 对象的外观。

  • 2D 多边形的 Z 方向平移对结果没有影响(因为投影也不受影响)。
  • X 方向的平移会增加最终对象的直径。
  • Y 方向的平移会导致最终对象在 Z 方向上发生偏移。
  • 绕 X 或 Y 轴旋转会扭曲最终对象的横截面,因为到 XY 平面的投影也会被扭曲。

不要混淆,因为 OpenSCAD 以某个 Z 方向高度渲染 2D 多边形,因此 2D 对象(及其高度)似乎在 XY 平面上具有更大的投影。但是,对于到 XY 平面的投影以及随后的挤出,仅使用不带高度的基本多边形。

它不能用于生成螺旋线或螺纹。(可以使用linear_extrude() 并使用 twist 参数来完成这些操作。)

二维形状**必须**完全位于Y轴的右侧(推荐)或左侧。更准确地说,形状的**每个**顶点必须满足x >= 0或x <= 0。如果形状跨越X轴,控制台窗口中会显示警告,并且rotate_extrude()会被忽略。如果二维形状与Y轴相切,即x=0,则**必须**是一条线相切,而不是一个点,因为点会导致零厚度的三维物体,这是无效的,会导致CGAL错误。对于2016.xxxx之前的OpenSCAD版本,如果形状位于负轴,则生成的面的方向是内翻,这可能会导致不良影响。

rotate_extrude(angle = 360, convexity = 2) {...}
右手定则

由于向后兼容性问题,您必须使用参数名称。

**凸性** : 如果非平凡二维形状的挤出失败,请尝试设置convexity参数(默认值不是10,但10是一个“良好”的尝试值)。请参见下面的解释。
**角度** [注意: 需要版本2019.05] : 默认为360。指定要扫描的度数,从正X轴开始。扫描方向遵循右手定则,因此负角度顺时针扫描。
$fa : 每个片段的最小角度(以度为单位)。
$fs : 每个片段的最小周长。
$fn : 360度中**固定**的片段数量。3或更大的值会覆盖$fa和$fs
$fa、$fs和$fn必须是命名参数。点击此处了解更多详情

可以使用旋转挤出构建一个简单的环面。

rotate_extrude(convexity = 10)
translate([2, 0, 0])
circle(r = 1);

网格细化

[编辑 | 编辑源代码]

增加构成二维形状的片段数量可以提高网格质量,但渲染时间更长。

rotate_extrude(convexity = 10)
translate([2, 0, 0])
circle(r = 1, $fn = 100);

还可以增加挤出使用的片段数量。

rotate_extrude(convexity = 10, $fn = 100)
translate([2, 0, 0])
circle(r = 1, $fn = 100);

使用参数angle(使用OpenSCAD版本2016.xx),可以建模一个钩子。

OpenSCAD - 一个钩子
eps = 0.01;
translate([eps, 60, 0])
   rotate_extrude(angle=270, convexity=10)
       translate([40, 0]) circle(10);
rotate_extrude(angle=90, convexity=10)
   translate([20, 0]) circle(10);
translate([20, eps, 0])
   rotate([90, 0, 0]) cylinder(r=10, h=80+eps);

挤出多边形

[编辑 | 编辑源代码]

也可以对用户选择的点组成的多边形进行挤出。

这是一个简单的多边形及其200步旋转挤出。(注意它已旋转90度以显示旋转效果;rotate_extrude()需要它保持平坦)。

rotate([90,0,0])        polygon( points=[[0,0],[2,1],[1,2],[1,3],[3,4],[0,5]] );
rotate_extrude($fn=200) polygon( points=[[0,0],[2,1],[1,2],[1,3],[3,4],[0,5]] );

有关多边形的更多信息,请参见:二维基本图形:多边形

挤出参数描述

[编辑 | 编辑源代码]

所有挤出模式的挤出参数

[编辑 | 编辑源代码]
凸性 整数。convexity参数指定与对象相交的光线可能穿过的最大正面(或背面)数。此参数仅在使用标准Goldfeather算法时,用于在OpenCSG预览模式下正确显示对象,对多面体渲染(网格生成)没有影响。


基本图形的凸性是在单个位置的基本图形的最大正面(或背面)数。例如,球体的凸性为1,环面的凸性为2。


此图像显示了一个凸性为2的二维形状,因为红色指示的光线最多与二维形状相交4次(2个正面和2个背面)。三维形状的凸性将以类似的方式确定。将其设置为10应该适用于大多数情况。通常设置过高的数字可能会导致预览渲染速度变慢。

仅线性挤出的挤出参数

[编辑 | 编辑源代码]
高度 挤出高度
中心 如果为真,则在挤出后将实体居中
扭曲 挤出扭曲角度(度)
缩放 在挤出高度上按此值缩放二维形状。
切片 类似于特殊变量$fn,但不会传递给子二维形状。
片段 类似于切片,但在多边形的片段上添加点,而不会改变多边形的形状。
华夏公益教科书