跳到內容

OpenSCAD 教程/第 1 章

來自華夏公益教科書

關於 OpenSCAD 的一些話

[編輯 | 編輯原始碼]

OpenSCAD 用於透過構造實體幾何的藝術來製作 3D 模型。它打開了創造力的世界,其中基本操作就像我們的積木。

讓我們塑造一些樂趣。

開始使用本教程

[編輯 | 編輯原始碼]

本教程將成為你值得信賴的指南。我們將探索示例,並揭開 OpenSCAD 的秘密。在本教程結束時,你將擁有工具來逐行打造自己獨特的 3D 模型。

每一步,你都會獲得信心和專業知識,磨練自己作為影像創造者的技能。你會將程式碼融入你的設計中,創造錯綜複雜的結構,並將你的設計理念變為現實。

在本教程中,我們將成為你的伴侶,提供指導,幫助你釋放 OpenSCAD 的全部潛力。

你將探索、學習和創造。

使用者介面

[編輯 | 編輯原始碼]

啟動 OpenSCAD 後,視窗應該類似於下面的影像。

視窗分為三列。

  1. 在左側列中,可以看到內建的文字編輯器,真正的魔法在這裡展開。當您輸入鍵盤命令時,您可以看到程式碼轉換為藝術的轉變。
  2. 在中間列中,顯示的 3D 檢視是您的設計創作栩栩如生的地方。底部是操作順序控制檯,始終準備著伸出援助之手。它揭示了錯誤的奧秘,並引導你走向精通。它是你值得信賴的指導伴侶。
  3. 請注意右側列,即 GUI 定製器。它為使用者提供了一個簡便的工具欄,這是一個圖形介面,用於調整和調整模型的引數。

建立你的第一個物體

[編輯 | 編輯原始碼]

你的第一個物體將是一個完美的立方體,邊長為 10。為了建立它,你需要在文字編輯器中輸入以下程式碼,然後點選參考軸下方操作欄上的預覽(第一個)圖示。

程式碼

a_small_cube.scad

cube(10);

從一開始,您應該學習一些關於 OpenSCAD 指令碼語言的基本概念,尤其是如果您沒有程式設計背景。單詞“cube”是 OpenSCAD 指令碼語言的一部分,用於命令 OpenSCAD 建立一個立方體。'cube' 命令後跟一對圓括號,其中定義了引數大小為 10。任何命令可能需要的引數定義始終在命令詞之後的一對匹配的圓括號內完成。最後一個括號後的分號表示該語句的結束,並幫助 OpenSCAD 解析您在文字編輯器中輸入的指令碼。由於分號用於指示每個語句的結束,因此您可以透過插入空格來隨意格式化程式碼。

練習
嘗試在單詞“cube”和第一個括號之間新增一些空格,然後點選(選擇)“預覽”選項。您的立方體建立了嗎?您是否收到任何錯誤訊息?嘗試在不同位置新增一些額外的空格,然後再次點選“預覽”,看看在控制檯中出現錯誤訊息之前,您可以做些什麼。如果在單詞“cube”的“cu”和“be”之間新增空格並點選“預覽”會發生什麼?如果您刪除分號會發生什麼?

你在上一段中讀了三次“點選預覽”。當你點選“預覽”時,OpenSCAD 會解析你的指令碼並建立相應的模型。每次對指令碼進行更改(例如,新增空格)或稍後新增其他語句時,都需要點選“預覽”以檢視這些更改的效果。

練習
嘗試將立方體的大小更改為 20,看看會發生什麼。您是否記得點選“預覽”以檢視您的更改生效?

建立一個略微不同的立方體

[編輯 | 編輯原始碼]

立方體不必完美(等距)。立方體可以(是立方體)具有不同的邊長。使用以下語句來建立一個邊長分別為 25、35 和 55 的立方體(立方體)。

程式碼

a_different_cube.scad

cube([25,35,55]);


您應該注意的第一件事是,與之前的立方體相比,這個立方體相當大。事實上,它大到無法容納在視窗中。為了解決這個問題,您可以將滑鼠懸停在視窗上並向外滾動,直到您看到整個立方體。您始終可以透過將滑鼠懸停在視窗上並使用滾輪來放大和縮小。或者,您可以使用視窗下方操作欄中的放大(第四個)和縮小(第五個)圖示。您可以讓 OpenSCAD 自動選擇一個方便的縮放級別,方法是使用同一操作欄中的檢視所有(第三個)圖示。

練習
嘗試將滑鼠懸停在視窗上並使用滾輪來放大和縮小。嘗試使用相應的圖示來放大和縮小。讓 OpenSCAD 為您選擇一個縮放級別。

除了放大和縮小之外,您還可以移動和旋轉模型的檢視。為此,您需要將滑鼠懸停在視窗上,並在按住滑鼠右鍵的同時拖動以移動,或在按住滑鼠左鍵的同時拖動以旋轉。您可以使用視窗下方操作欄中的重置檢視(第六個)圖示來重置檢視。

練習
嘗試將滑鼠懸停在視窗上,並在按住滑鼠右鍵或左鍵的同時拖動以移動或旋轉模型的檢視。看看在您需要重置檢視之前,您可以玩弄多長時間。

您應該注意的第二件事是,為了建立一個具有不同邊長的立方體,您需要在括號內定義一對括號,並在其中包含三個值。一對括號用於表示一組值。向量的值需要用逗號分隔,並對應於立方體沿 X、Y 和 Z 軸的邊長。當使用向量作為輸入引數使用 cube 命令時,OpenSCAD 將建立一個具有不同邊長的立方體,這些邊長對應於向量的值。請記住,您之前使用 cube 命令透過定義引數 size 的值來建立一個完美的立方體。大多數 OpenSCAD 命令可以使用不同的引數,甚至可以使用更多、更少或沒有引數來實現不同的結果。

練習
嘗試使用沒有任何引數的 cube 命令。會發生什麼?使用 cube 命令建立一個邊長分別為 50、5 和 10 的立方體。使用 cube 命令建立一個邊長為 17.25 的完美立方體。

您應該注意到,每個立方體都在第一個八分圓上建立。您可以定義一個名為 center 的額外引數並將其設定為 true,以使立方體以原點為中心。完整的語句如下。

程式碼

a_centered_cube_with_different_side_lengths.scad

cube([20,30,50],center=true);

請注意,當在括號內定義多個引數時,它們需要用逗號分隔。

練習
嘗試建立一個完美的立方體或一個具有不同邊長的立方體。使用適當的附加輸入引數使該立方體以原點為中心。如果您願意,可以在分隔兩個引數的逗號前後新增一些空格。

新增更多物體和平移物體

[編輯 | 編輯原始碼]

構造實體幾何方法使用一些基本物件以及一些方法來變換和組合這些物件以建立更復雜的模型。您之前示例中一直在使用的立方體就是這樣一個基本物件。基本物件也稱為基本體,在 OpenSCAD 指令碼語言中可以直接使用。例如,汽車不是 OpenSCAD 基本體,因為指令碼語言中沒有相應的關鍵字。這是完全合理的,因為 OpenSCAD 是一組建模工具,而不是預定義模型的庫。使用提供的工具,您可以將提供的基本體組合起來建立您自己的汽車。為此,您需要知道如何在模型中新增多個物件。

首先建立一個邊長分別為 60、20 和 10 的立方體,並使其居中於原點。

程式碼
cube([60,20,10],center=true);

為了在模型中新增第二個立方體,請在文字編輯器的下一行中輸入相同的語句,但將邊長更改為 30、20 和 10。

程式碼

a_smaller_cube_covered_by_a_bigger_cube.scad

cube([60,20,10],center=true);
cube([30,20,10],center=true);

您應該看不到模型有任何變化,因為第二個立方體在任何方向上都不大於第一個立方體,並且目前完全被第一個立方體覆蓋。透過以下方式修改第二個語句,您可以將第二個立方體平移,使其部分位於第一個立方體的頂部。

程式碼

two_cubes.scad

cube([60,20,10],center=true);
translate([0,0,5])
    cube([30,20,10],center=true);

您透過使用 "translate" 命令實現了這一點,"translate" 命令是可用的變換之一。 "translate" 命令以及其餘的變換本身不會建立任何物件。它們更像是應用於現有物件,以特定方式修改它們。 "translate" 命令可用於將物件移動到空間中的任何點。 "translate" 命令的輸入引數是一個包含三個值的向量。每個值指示物件將在 X、Y 和 Z 軸上移動的單位數。您應該注意,"translate" 命令後面沒有分號。緊隨 "translate" 命令之後的是要平移的物件的定義。分號在末尾新增,以指示語句的完成。

練習
嘗試更改 "translate" 命令的輸入引數,以便將立方體沿 X 軸平移 5 個單位,沿 Z 軸平移 10 個單位。如果您想以不同的方式格式化此語句,請嘗試新增一些空格。嘗試在 "translate" 命令之後新增分號。
程式碼

two_cubes_barely_touching.scad

cube([60,20,10],center=true);
translate([0,0,10])
    cube([30,20,10],center=true);

在上面的示例中,第二個立方體正好位於第一個立方體的頂部。應避免這種情況,因為 OpenSCAD 不清楚這兩個立方體是否構成一個物件。透過始終保持對應物件之間大約 0.001 - 0.002 的小重疊,可以輕鬆解決此問題。一種方法是將沿 Z 軸的平移量從 10 個單位減少到 9.999 個單位。

程式碼

two_cubes_with_small_overlap.scad

cube([60,20,10],center=true);
translate([0,0,9.999])
    cube([30,20,10],center=true);

另一種更明確的方法是從指令碼中的對應值中減去 0.001 個單位。

程式碼

two_cubes_with_explicit_small_overlap.scad

cube([60,20,10],center=true);
translate([0,0,10 - 0.001])
    cube([30,20,10],center=true);

還有一種方法。為了不從頂部丟失 0.001,我們可以新增一個第三個立方體,其尺寸與較小的立方體相同,高度為 0.002 ([30, 20, 0.002])。第三個立方體將填補空隙。

程式碼

third_cube_close_small_gap.scad

cube([60,20,10],center=true);
translate([0,0,10])
    cube([30,20,10],center=true);
translate([0,0,5 - 0.001])
    cube([30,20,0.002],center=true);

這是您將在整個教程中遇到的情況。當兩個物件正好接觸時,您應始終透過減去或新增 0.001 個單位的公差來確保它們之間存在小重疊。

圓柱基本體和旋轉物件

[edit | edit source]

您剛剛建立的模型看起來像是車身,空氣動力學效能很差。沒關係。在接下來的章節中,您將使汽車看起來更有趣、更具空氣動力學。現在,您將使用圓柱基本體和旋轉變換在汽車上新增車輪和車軸。您可以透過新增第三個語句(包含 cylinder 命令)來建立一個車輪。您需要定義兩個輸入引數,h 和 r。第一個是圓柱體的高度,第二個是其半徑。

程式碼

a_cylinder_covered_by_cubes.scad

cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
cylinder(h=3,r=8);

您應該注意到,圓柱體被其他物件隱藏。您可以使用 "translate" 命令,將圓柱體沿 Y 軸負方向平移 20 個單位,使其可見。

程式碼

two_cubes_and_a_cylinder.scad

cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
translate([0,-20,0])
    cylinder(h=3,r=8);

車輪現在可見,但是如果車輪沒有正確放置,您的汽車將無法行駛。您可以使用 "rotate" 命令使車輪直立。為此,您需要將其繞 X 軸旋轉 90 度。

程式碼

two_cubes_and_a_rotated_cylinder.scad

cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
rotate([90,0,0])
    translate([0,-20,0])
    cylinder(h=3,r=8);

您應該注意到的第一件事是 "rotate" 和 "translate" 命令之間沒有分號。您應該已經熟悉此概念。分號只在語句的末尾新增。您可以按類似方式新增任意多個變換命令,但不能在它們之間包含分號。

您應該注意到的第二件事是 "rotate" 命令有一個輸入引數,這是一個包含三個值的向量。與 "translate" 命令完全類似,每個值都指示物件繞 X、Y 和 Z 軸旋轉多少度。

您應該注意到的第三件事是,車輪是直立的,但由於它繞 x 軸旋轉,因此已移至汽車下方。發生這種情況是因為該物件在旋轉之前已從原點移開。在模型中放置物件的最佳做法是首先將它們旋轉,然後將它們平移到所需位置。請注意,OpenSCAD 生成物件,然後應用物件的變換,從緊靠物件定義之前的變換開始,然後向後工作。因此,為了旋轉物件,然後透過平移移動它,請在程式碼中首先指定平移,然後指定旋轉,最後指定物件定義。

練習
嘗試先旋轉車輪,然後平移車輪,方法是更改 "rotate" 和 "translate" 命令的順序。
程式碼

two_cubes_and_a_rotated_and_translated_cylinder.scad

cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
translate([0,-20,0])
    rotate([90,0,0])
    cylinder(h=3,r=8);

它看起來比車輪上一個位置好多了。

練習
嘗試修改 "translate" 命令的輸入引數,使此車輪成為汽車的前左輪。
程式碼

car_body_and_front_left_wheel.scad

cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
translate([-20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8);

練習
嘗試透過複製最後一個語句並僅更改一個值的符號來新增汽車的前右輪。
程式碼

car_body_and_misaligned_front_wheels.scad

cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
translate([-20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8);
translate([-20,15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8);

您應該注意到,車輪的位置不對稱。發生這種情況是因為圓柱體不是在原點居中建立的。

練習
嘗試在 "cylinder" 命令中新增一個額外的輸入引數,以指示 OpenSCAD 在首次建立時兩個車輪都應在原點居中。您的車輪位置現在對稱了嗎?
程式碼

car_body_and_aligned_front_wheels.scad

cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
translate([-20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([-20,15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);

完成您的第一個模型

[edit | edit source]
練習
嘗試使用您學到的知識將後部缺失的車輪新增到汽車上。嘗試在前後車輪之間新增一個連線車軸。
程式碼

completed_car.scad

cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
translate([-20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([-20,15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([20,15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([-20,0,0])
    rotate([90,0,0])
    cylinder(h=30,r=2,center=true);
translate([20,0,0])
    rotate([90,0,0])
    cylinder(h=30,r=2,center=true);

您應該注意到,在上面的模型中,車軸和車輪之間存在重疊,等於車輪厚度的一半。如果模型以車輪和車軸正好接觸的方式建立,則需要確保它們之間存在小重疊,就像汽車車身中的兩個立方體那樣。

到目前為止,您可能一直在煩惱車輪的解析度。到目前為止,您一直在使用 OpenSCAD 的預設解析度設定。OpenSCAD 語言中有特殊的命令,允許您完全控制模型的解析度。提高模型的解析度還將增加每次更新設計時所需的渲染時間。因此,建議您在構建模型時保持預設解析度設定,只有在完成設計後才提高解析度。由於汽車示例已完成,您可以透過在指令碼中新增以下兩個語句來提高解析度。

程式碼
$fa = 1;
$fs = 0.4;

嘗試在汽車指令碼的開頭新增上述兩個語句。您是否注意到車輪解析度有任何變化?

程式碼

completed_car_higher_resolution.scad

$fa = 1;
$fs = 0.4;
cube([60,20,10],center=true);
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
translate([-20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([-20,15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([20,15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
translate([-20,0,0])
    rotate([90,0,0])
    cylinder(h=30,r=2,center=true);
translate([20,0,0])
    rotate([90,0,0])
    cylinder(h=30,r=2,center=true);

實際上,$fa 和 $fs 是特殊的變數,它們根據分配給它們的值來確定模型的解析度。它們的確切功能將在後面解釋,您現在不必擔心。您只需要記住,您可以在任何指令碼中新增這兩個語句,以實現普遍適用於 3D 列印的解析度。這兩個語句將在整個教程中的所有示例中使用,以獲得視覺效果更佳的渲染效果。

在與朋友分享指令碼之前,最好新增一些註釋以幫助他們理解您的指令碼。您可以在一行開頭使用雙斜槓來寫入任何您喜歡的內容,而不會影響您的模型。使用雙斜槓,OpenSCAD 會知道後面不是指令碼語言的一部分,並簡單地忽略它。

練習
嘗試在每個語句的上面新增一個註釋,以讓您的朋友知道您的模型的哪一部分是用每個語句建立的。
解決方案程式碼

completed_car_commented.scad

$fa = 1;
$fs = 0.4;
// Car body base
cube([60,20,10],center=true);
// Car body top
translate([5,0,10 - 0.001])
    cube([30,20,10],center=true);
// Front left wheel
translate([-20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
// Front right wheel
translate([-20,15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
// Rear left wheel
translate([20,-15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
// Rear right wheel
translate([20,15,0])
    rotate([90,0,0])
    cylinder(h=3,r=8,center=true);
// Front axle
translate([-20,0,0])
    rotate([90,0,0])
    cylinder(h=30,r=2,center=true);
// Rear axle
translate([20,0,0])
    rotate([90,0,0])
    cylinder(h=30,r=2,center=true);

現在可以儲存您的模型了。點選編輯器上方操作欄上的儲存(第三個)圖示,將指令碼儲存為 *.scad 檔案。在建立新模型時,請記住及早儲存,然後經常儲存,以避免意外丟失工作。

如果您想 3D 列印您的汽車,可以將其匯出為 STL 檔案。您應首先點選視窗下方操作欄上的渲染(第二個)圖示,以生成模型的 STL 資料。然後,您應點選編輯器上方操作欄上的匯出為 STL 圖示,以儲存模型的 STL 檔案。

建立第二個模型

[edit | edit source]
練習
嘗試使用您學到的所有知識來建立一個新的簡單模型。它可以是房子、飛機或任何您喜歡的物品。不要擔心讓您的模型看起來完美,只需嘗試使用您的新技能!在接下來的章節中,您將繼續學習更多建立很棒模型的技術。
華夏公益教科書