OpenSCAD 教程/第 8 章
到目前為止,您一直在建立許多模型並定製您的汽車設計,同時發展了紮實的引數化建模技能,並探索了 OpenSCAD 的不同功能。考慮到您建立的每個模型都只使用了三個基本體:球體、立方體和圓柱體,這真是令人印象深刻。透過將這些基本體與變換命令組合起來,您可以建立大量模型,但仍然有一些模型無法僅透過使用這些基本體來建立。以下輪轂設計就是一個這樣的例子。
上面的輪轂設計需要建立一個看起來像甜甜圈的物體。
這個甜甜圈形狀的物體無法使用球體、立方體和圓柱體基本體建立。相反,它需要使用 2D 基本體和一個新的命令,該命令可以從 2D 輪廓建立 3D 形狀。具體來說,甜甜圈可以透過首先使用圓形基本體定義一個圓形 2D 輪廓,然後使用 rotate_extrude 命令旋轉擠出這個輪廓來建立。
|
circular_profile.scad $fa = 1;
$fs = 0.4;
wheel_radius = 12;
tyre_diameter = 6;
translate([wheel_radius - tyre_diameter/2, 0])
circle(d=tyre_diameter);
|
|
extruded_donut.scad $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);
}
|
您應該注意您建立的 2D 輪廓的一些事項。在這種情況下,2D 輪廓是使用圓形命令建立的,直徑設定為等於 tyre_diameter 變數。之所以這樣做是因為甜甜圈形狀的物體將對應於車輪的輪胎。稍後,您可能會發現其他 2D 基本體,如正方形命令。
您計劃擠出的任何 2D 輪廓都應該在 X-Y 平面上建立,通常是在 X 為正的區域內。在數學上定義,2D 輪廓通常位於 X ≥ 0 和 Z = 0 的地方。此外,2D 輪廓始終沒有厚度。這意味著 2D 輪廓永遠不會直接用作模型的一部分,而是與 rotate_extrude 和 linear_extrude 命令結合使用來定義 3D 物件。
您也應該注意 rotate_extrude 命令的使用的一些事項。rotate extrude 命令用於建立 3D 物件,並且始終需要一個 2D 輪廓作為輸入。建立所需 2D 輪廓的命令需要放在跟隨 rotate_extrude 命令的一對花括號內。透過 rotate_extrude 命令建立的 3D 物件是圍繞 Y 軸旋轉 2D 輪廓的結果。然後將生成的 3D 物件放置在其旋轉軸位於 Z 軸上的地方。這種怪癖最初可能需要一些時間才能適應,因此逐一檢視該過程可能會有所幫助。
首先,rotate_extrude 命令接受 2D 輪廓作為輸入。
然後它建立一個 3D 物件,它是圍繞 Y 軸旋轉提供的 2D 輪廓的結果。
最後,它像圍繞 X 軸旋轉 90 度一樣放置 3D 模型。結果是,模型旋轉的 Y 軸向上旋轉以與 Z 軸對齊。
rotate_extrude 命令有一個名為 angle 的輸入引數。angle 引數用於定義 2D 輪廓圍繞 Y 軸旋轉多少度。在這種情況下,angle 引數設定為 360 度,對應於一個完整的圓圈。
將 angle 引數設定為 60 度將建立以下模型。
而將其設定為 270 度將建立以下模型。等等。
| 透過定義缺失的圓柱體物件來完成新的輪轂設計。圓柱體的高度應等於 wheel_width 變數的值,而圓柱體的半徑應等於 wheel_radius - tyre_diameter/2。圓柱體應以原點為中心。 |
|
rounded_wheel_horizontal.scad $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);
|
| 為了使這個輪轂與前幾章的模型相容,請圍繞 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 命令建立。 |
…
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 命令,因此使用圓柱體命令建立它是最簡單也是最直接的方法。
現在是將您新學到的知識付諸實踐,為小型機器人汽車專案建立輪輞的時候了。
| 擴充套件 rounded_simple_wheel 模組,使輪轂設計在其輪轂上有一個孔,可以用來將其安裝在軸上。為此,您需要使用 difference 命令從現有模型中減去一個圓柱體。孔的直徑應等於一個名為 axle_diameter 的新模組輸入引數。此引數的預設值應為 3 個單位。透過定義圓柱體高度的方式,您應該確保圓柱體始終比輪轂的寬度略長,以避免使用 difference 命令時出現任何錯誤。儲存修改後的模組後,您應該使用它來建立一個輪轂版本,其 wheel_radius、wheel_width、tire_diameter 和 axle_diameter 分別為 20、6、4 和 5 個單位。 |
|
robot_wheel.scad …
module rounded_simple_wheel(wheel_radius=12, wheel_width=4, tyre_diameter=6, axle_diameter=3) {
difference() {
// wheel
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]);
}
}
// axle hole
rotate([90,0,0])
cylinder(h=wheel_width+1,r=axle_diameter/2,center=true);
}
}
…
|
… rounded_simple_wheel(wheel_radius=20, wheel_width=6, tyre_diameter=4, axle_diameter=5); … |
這個輪轂設計對於小型機器人汽車應用來說看起來很合適,但您可以做一些事情來增加機器人的牽引力。與其 3D 列印整個輪轂,不如只 3D 列印輪輞,然後新增一個 O 型圈或橡皮筋作為輪胎以獲得更大的牽引力。最終的輪轂將看起來像下面的影像,其中 O 型圈或橡皮筋由藍色表示。
在這種情況下,您必須 3D 列印的相應輪輞如下所示。
以 rounded_simple_wheel 模組為指導,建立一個名為 robot_rim 的新模組。robot_rim 模組應具有與 rounded_simple_wheel 模組相同的輸入引數。在 robot_rim 模組中新增所有必要的命令,以便它建立上面的輪輞設計。您可以透過兩種方式做到這一點。
|
- 第一種方法
|
robot_rim_from_profile_difference.scad …
module rounded_simple_wheel(wheel_radius=12, wheel_width=4, tyre_diameter=6, axle_diameter=3) {
rotate([90,0,0])difference() {
// resulting rim
rotate_extrude(angle=360) {
difference() {
// cylindrical rim profile
translate([0,-wheel_width/2])
square([wheel_radius-tyre_diameter/2,wheel_width]);
// tire profile
translate([wheel_radius-tyre_diameter/2,0])
circle(d=tyre_diameter);
}
}
// axle hole
cylinder(h=wheel_width+1,r=axle_diameter/2,center=true);
}
}
…
|
- 第二種方法
|
robot_rim_from_3d_object_difference.scad …
module rounded_simple_wheel(wheel_radius=12, wheel_width=4, tyre_diameter=6, axle_diameter=3) {
rotate([90,0,0])
difference() {
// cylindrical rim
cylinder(h=wheel_width,r=wheel_radius-tyre_diameter/2,center=true);
// tire
rotate_extrude(angle=360) {
translate([wheel_radius-tyre_diameter/2,0])
circle(d=tyre_diameter);
}
// axle hole
cylinder(h=wheel_width+1,r=axle_diameter/2,center=true);
}
}
…
|
通常,在設計新零件時考慮用於建立物件的製造過程會有所幫助。通常,這種考慮會促進適合當前製造方法的設計,但它也可以指導您的建模過程。
例如,考慮這樣一種情況:您沒有使用 3D 列印等增材製造來製造這個機器人輪轂,而是使用了車床或銑床等減材製造。在這種情況下,您可能會選擇第二種方法,因為它更接近地複製了當前的製造過程,並且可以更好地估計最終的製造過程可能需要多少步驟。
如前所述,OpenSCAD 還有另一個命令可以用來從提供的 2D 輪廓建立 3D 物件。這個命令是 linear_extrude。與 rotate_extrude 命令相比,linear_extrude 透過沿著 Z 軸擴充套件位於 XY 平面上的 2D 輪廓來建立 3D 物件。與 rotate_extrude 命令類似,當您想要建立的 3D 物件無法透過組合可用的 3D 基本體直接建立時,可以使用 linear_extrude。以下是一個例子。
|
extruded_ellipse.scad $fa = 1;
$fs = 0.4;
linear_extrude(height=50)
scale([2,1,1])
circle(d=10);
|
上面的物件是一個管子,它具有以下輪廓。
|
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 命令之後的一對花括號內。height 引數用於定義 2D 輪廓將沿 Z 軸擠出多少個單位。預設情況下,2D 輪廓沿著 Z 軸的正方向擠出,擠出的單位數量等於分配給 height 引數的值。
透過傳遞一個名為 center 的額外引數,並將其設定為 true,2D 輪廓將沿著 Z 軸的兩個方向擠出。生成的物體的總長度仍然等於 height 引數。
|
centered_extrusion.scad …
linear_extrude(height=50,center=true)
scale([2,1,1])
circle(d=10);
…
|
還可以使用一個名為 twist 的額外引數,以指定角度圍繞 Z 軸扭曲生成的 3D 物件。
|
extrusion_with_twist.scad …
linear_extrude(height=50,center=true,twist=120)
scale([2,1,1])
circle(d=10);
…
|
最後,還可以使用另一個名為 scale 的引數,以指定的縮放因子縮放生成的 3D 物件的一端。
|
extrusion_with_twist_and_scale.scad …
linear_extrude(height=50,center=true,twist=120,scale=1.5)
scale([2,1,1])
circle(d=10);
…
|
現在應該很清楚,rotate_extrude 和 linear_extrude 命令如何讓您能夠建立無法透過直接組合可用 3D 基本體建立的物件。您可以使用這些命令來建立更抽象和藝術的設計,但讓我們看看如何使用 linear_extrude 命令來建立一個新的車身。
| 使用與上面示例類似的 linear_extrude 命令來建立以下車身。您應該建立一個名為 extruded_car_body 的新模組。該模組應該具有 length、rear_height、rear_width 和 scaling_factor 輸入引數。這些引數的預設值分別為 80、20、25 和 0.5 個單位。模組的 length 和 scaling_factor 引數將用於呼叫 linear_extrude 命令,以設定其 height 和 scale 引數的值。提供的 2D 輪廓應該是一個圓形,根據 rear_height 和 rear_width 引數調整大小。 |
|
extruded_car_body.scad 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);
}
|
| 透過新增一個名為 rounded 的布林輸入引數來擴充套件前面的模組。該引數的預設值為 false。如果將 rounded 引數設定為 true,則應在車身的前後建立兩個額外的物體,以使車身變得圓滑,如下面的影像所示。這兩個物體是球體,已經調整大小和縮放。嘗試找出一種合適的方式來調整球體的尺寸和縮放比例,以達到與下面的影像類似的效果。 |
|
rounded_extruded_car_body.scad …
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);
}
}
…
|
| 將新的圓形車身用於您喜歡的任何汽車設計。 |
如前所述,rotate_extrude 和 linear_extrude 命令也可以用來建立更抽象的物體。當提供的 2D 輪廓使用可用的圓形和方形 2D 基本體建立,並且當 linear_extrude 命令的 twist 和 scale 引數沒有使用時,生成的 3D 物件也可以直接使用可用的 3D 基本體建立。這些命令真正強大的地方在於能夠建立任何不是圓形和方形組合的 2D 輪廓,而是任意形狀。這種能力可以透過使用 polygon 2D 基本體來實現,您將在下一章學習這種基本體。