OpenSCAD 将2D形状挤压成3D对象

本页内容

从 2D 对象旋转拉伸为 3D 对象

到目前为止,已经创建了大量模型并定制了您的汽车设计,同时参数化建模了解了 OpenSCAD 的不同功能。到目前为止创建的每个模型都只使用三个基本的元素:球体、立方体和圆柱体,通过将这些基本的元素与转换命令相结合,可以创建大量模型,但仍有一些模型无法单独使用这些原语来创建。比如下面的车轮。

Rounded wheel.jpg

上面的轮子设计需要创建一个看起来像甜甜圈的对象。

Donut shaped object.jpg

无法使用球体、立方体和圆柱体基元创建此甜甜圈形状的对象。相反,它需要使用 2D 图元和一个可以从 2D 轮廓创建 3D 形状的新命令。具体来说,可以通过首先使用圆形基元定义圆形 2D 轮廓,然后使用 rotate_extrude 命令旋转拉伸该轮廓来创建甜甜圈。


示例

$fa = 1;
$fs = 0.4;
wheel_radius = 12;
tyre_diameter = 6;
rotate_extrude(angle=360) {
    translate([wheel_radius - tyre_diameter/2, 0])
        circle(d=tyre_diameter);
}

Extruded donut.jpg rotate_extrude让对象围绕z轴旋转了360度,并且轨迹形成了相应的对象。当然我们可以让其旋转270度得到下面的效果。

Extruded donut 270 degrees.jpg


rounded_wheel_horizontal.scad

通过定义缺少的圆柱体对象来完成新的车轮设计。圆柱体的高度应该等于一个wheel_width 变量的值,而圆柱体的半径应该等于wheel_radius - tyre_diameter/2。圆柱体应以原点为中心。

$fa = 1;
$fs = 0.4;
wheel_radius = 12;
wheel_width = 4;
tyre_diameter = 6;
rotate_extrude(angle=360) {
    translate([wheel_radius-tyre_diameter/2,0])
        circle(d=tyre_diameter);
}
cylinder(h=wheel_width, r=wheel_radius - tyre_diameter/2, center=true);

Rounded wheel horizontal.jpg


示例

为了使这个轮子与前面章节中的模型兼容,将它绕 X 轴旋转 90 度。将此车轮设计转换为名为 rounded_simple_wheel 的模块,并将其添加到您的 vehicle_parts.scad 脚本中以供以后使用。

…
module rounded_simple_wheel(wheel_radius=12, wheel_width=4, tyre_diameter=6) {
    rotate([90,0,0]) {
        rotate_extrude(angle=360) {
            translate([wheel_radius-tyre_diameter/2,0])
                circle(d=tyre_diameter);
        }
        cylinder(h=wheel_width, r=wheel_radius - tyre_diameter/2, center=true);
    }
}
…

上面的轮子是一个轴对称物体,这意味着它围绕一个轴呈现对称性。具体来说,对称轴是 2D 轮廓围绕其旋转以形成 3D 对象的轴。当对象为轴对称时,只要提供适当的 2D 轮廓,只需一个 rotate_extrude 命令即可创建它。上述车轮设计并非如此,因为中心部分添加了与旋转拉伸分开的圆柱命令。从上述模块中删除圆柱体命令,并在提供的 2D 轮廓上进行适当的添加,以便通过 rotate_extrude 命令创建整个车轮。

Complete profile.jpg


示例

…
translate([wheel_radius-tyre_diameter/2,0])
    circle(d=tyre_diameter);
translate([0,-wheel_width/2])
    square([wheel_radius-tyre_diameter/2,wheel_width]);
…

示例

…
module rounded_simple_wheel(wheel_radius=12, wheel_width=4, tyre_diameter=6) {
    rotate([90,0,0]) {
        rotate_extrude(angle=360) {
            translate([wheel_radius-tyre_diameter/2,0])
                circle(d=tyre_diameter);
            translate([0,-wheel_width/2])
                square([wheel_radius-tyre_diameter/2,wheel_width]);
        }
    }
}
…

记住轴对称对象可以完全由 rotate_extrude 命令创建。之前的车轮设计就是一个具体的例子。您是否决定通过提供整个对象的 2D 轮廓并使用单个 rotate_extrude 或仅对无法以任何其他方式创建的部分使用 rotate_extrude 命令来创建轴对称对象,取决于每种情况,并且是由你决定。例如,如果您想进一步模块化车轮设计并将它们分成可组合的轮胎和轮辋模块,您将不可避免地需要使用 rotate_extrude 命令创建圆环形状的轮胎。因为在这种情况下,轮辋将是一个单独的模块,其中已经不存在 rotate_extrude 命令,

从 2D 对象线性拉伸 3D 对象

如前所述,还有另一个 OpenSCAD 命令可用于从提供的 2D 轮廓创建 3D 对象。这是 linear_extrude 命令。与 rotate_extrude 命令相反,linear_extrude 通过沿 Z 轴延伸位于 XY 平面上的 2D 轮廓来创建 3D 对象。与 rotate_extrude 命令类似,当您要创建的 3D 对象无法通过组合可用的 3D 图元直接创建时,可以使用 linear_extrude。下面是一个这样的例子。

Extruded ellipse.jpg


extruded_ellipse.scad

$fa = 1;
$fs = 0.4;
linear_extrude(height=50)
    scale([2,1,1])
    circle(d=10);

Ellipse profile.jpg


ellipse_profile.scad

$fa = 1;
$fs = 0.4;
scale([2,1,1])
    circle(d=10);

关于使用 linear_extrude,您应该注意几点。linear_extrude 的语法类似于 rotate_extrude 命令的语法。创建将沿 Z 轴拉伸的 2D 轮廓的命令需要放置在 linear_extrude 命令之后的一对花括号内。参数高度用于定义沿 Z 轴拉伸 2D 轮廓的单位数。默认情况下,二维轮廓沿 Z 轴的正方向拉伸,其单位量等于指定给高度参数的值。

通过传递一个名为 center 的附加参数并将其设置为 true,2D 轮廓将沿 Z 轴的两个方向拉伸。结果对象的总长度仍将等于高度参数。


centered_extrusion.scad

…
linear_extrude(height=50,center=true)
    scale([2,1,1])
    circle(d=10);
…

Centered extrusion.jpg 一个名为 twist 的附加参数也可用于将生成的 3D 对象绕 Z 轴扭转指定角度。

extrusion_with_twist.scad

…
linear_extrude(height=50,center=true,twist=120)
    scale([2,1,1])
    circle(d=10);
…

Extrusion with twist.jpg 最后,另一个名为 scale 的参数可用于按指定的缩放因子缩放生成的 3D 的一端。可以试着做一个广州小蛮腰[1]


extrusion_with_twist_and_scale.scad

…
linear_extrude(height=50,center=true,twist=120,scale=1.5)
    scale([2,1,1])
    circle(d=10);
…

Extrusion with twist and scale.jpg 现在应该很清楚 rotate_extrude 和 linear_extrude 命令如何让您能够创建通过直接组合可用的 3D 图元无法实现的对象。您可以使用这些命令来创建更抽象和更艺术的设计,让我们看看如何使用 linear_extrude 命令来创建新的车身。


extruded_car_body.scad

使用类似于上述示例的 linear_extrude 命令来创建以下车身。您应该创建一个名为 extruded_car_body 的新模块。该模块应该有一个长度、后方高度、后方宽度和缩放因子输入参数。参数的默认值应分别为 80、20、25 和 0.5 个单位。模块的长度和比例因子参数将用于调用 linear_extrude 命令来设置其高度和比例参数的值。提供的 2D 轮廓应该是一个已根据 back_height 和 back_width 参数调整大小的圆。

module rounded_car_body(length=80, rear_height=20, rear_width=25, scaling_factor=0.5) {
rotate([0,-90,0])
    linear_extrude(height=length,center=true,scale=scaling_factor)
    resize([rear_height,rear_width])
    circle(d=rear_height);    
}

Extruded car body.jpg


示例

通过添加一个名为 rounded 的布尔输入参数来扩展上一个模块。该参数的默认值应为 false。如果 rounded 参数设置为 true,则应在主体的前部和后部创建两个额外的对象,以便如下图所示进行圆角处理。这两个对象是已调整大小和缩放的球体。尝试找出一种适当的方法来调整球体的大小和缩放,以获得类似于下图的结果。

…
module rounded_car_body(length=80, rear_height=20, rear_width=25, scaling_factor=0.5, rounded=false) {
    
    // center part
    rotate([0,-90,0])
        linear_extrude(height=length,center=true,scale=scaling_factor)
        resize([rear_height,rear_width])
        circle(d=rear_height);
    
    if (rounded) {
        // rear part
        translate([length/2,0,0])
            resize([rear_height,rear_width,rear_height])
            sphere(d=rear_height);
        
        // front part
        translate([-length/2,0,0])
            scale(scaling_factor)
            resize([rear_height,rear_width,rear_height])
            sphere(d=rear_height);
    }    
}
…


示例

在您喜欢的任何汽车设计中使用新的圆形车身。

Car with rounded extruded body.jpg 如前所述,rotate_extrude 和 linear_extrude 命令也可用于创建更抽象的对象。当使用可用的圆形和方形 2D 图元创建提供的 2D 轮廓时,并且不使用 linear_extrude 命令的扭曲和缩放参数时,也可以使用可用的 3D 基本体直接创建生成的 3D 对象。真正使这些命令的使用更加强大的是能够创建任何不是圆形和正方形组合而是任意形状的 2D 轮廓。通过使用您将在下一章中学习的多边形 2D 基本元素可以使用此功能。

此页面最后编辑于2022年9月26日 (星期一) 08:34。