跳轉到內容

OpenSCAD 使用者手冊/使用二維子系統

來自華夏公益教科書,開放世界開放書籍

所有二維基本圖形都可以使用三維變換進行變換。它們通常用作三維擠出的部分。雖然它們無限薄,但以 1 個單位的厚度渲染。

注意:嘗試使用 difference() 從三維物件中減去會導致最終渲染中出現意外結果。

正方形

[編輯 | 編輯原始碼]

在第一象限建立正方形或矩形。當 center 為真時,正方形以原點為中心。如果按此處顯示的順序給出,引數名稱是可選的。

square(size = [x, y], center = true/false);
square(size =  x    , center = true/false);
引數:
大小
單個值,兩邊都具有該長度的正方形
2 值陣列 [x,y],尺寸為 x 和 y 的矩形
中心
false(預設),第 1 象限(正),一個角在 (0,0)
true,正方形以 (0,0) 為中心
default values:  square();   yields:  square(size = [1, 1], center = false);
示例:

10x10 square

equivalent scripts for this example
 square(size = 10);
 square(10);
 square([10,10]);
 .
 square(10,false);
 square([10,10],false);
 square([10,10],center=false);
 square(size = [10, 10], center = false);
 square(center = false,size = [10, 10] );

OpenScad square 20x10

equivalent scripts for this example
 square([20,10],true);
 a=[20,10];square(a,true);

在原點建立圓形。除 r 外,所有引數必須命名。

circle(r=radius | d=diameter);
引數
r : 圓形半徑。r 名稱是唯一可選的圓形引數。
圓形解析度基於大小,使用 $fa 或 $fs。
對於一個小的,高解析度的圓形,您可以建立一個大圓形,然後將其縮小,或者您可以設定 $fn 或其他特殊變數。注意:這些示例超過了 3D 印表機的解析度以及顯示屏的解析度。
scale([1/100, 1/100, 1/100]) circle(200); // create a high resolution circle with a radius of 2.
circle(2, $fn=50);                        // Another way.
d  : 圓形直徑(僅在 2014.03 之後的版本中可用)。
$fa : 每個片段的最小角度(以度為單位)。
$fs : 每個片段的最小圓周長度。
$fn : 360 度中的固定片段數。3 或更大的值會覆蓋 $fa 和 $fs。
如果使用它們,$fa、$fs 和 $fn 必須是命名引數。點選此處瞭解更多詳情,.
defaults:  circle(); yields:  circle($fn = 0, $fa = 12, $fs = 2, r = 1);

circle for user manual description

此示例的等效指令碼

 circle(10);
 circle(r=10);
 circle(d=20);
 circle(d=2+9*2);

可以透過使用 scale()resize() 使 x 和 y 尺寸不相等來從圓形建立橢圓。參見 OpenSCAD 使用者手冊/變換

Ellipse from circle Ellipse from circle top view

equivalent scripts for this example
 resize([30,10])circle(d=20);
 scale([1.5,.5])circle(d=20);

規則多邊形

[編輯 | 編輯原始碼]

可以透過使用 circle() 並將 $fn 設定為邊數來建立 3 個或更多邊的規則多邊形。以下兩段程式碼等效。

 circle(r=1, $fn=4);
 module regular_polygon(order = 4, r=1){
     angles=[ for (i = [0:order-1]) i*(360/order) ];
     coords=[ for (th=angles) [r*cos(th), r*sin(th)] ];
     polygon(coords);
 }
 regular_polygon();

這些結果是以下形狀,其中多邊形內接於圓形,所有邊(和角)相等。一個角指向正 x 方向。對於不規則形狀,請參見下面的多邊形基本圖形。

script for these examples
 translate([-42,  0]){circle(20,$fn=3);%circle(20,$fn=90);}
 translate([  0,  0]) circle(20,$fn=4);
 translate([ 42,  0]) circle(20,$fn=5);
 translate([-42,-42]) circle(20,$fn=6);
 translate([  0,-42]) circle(20,$fn=8);
 translate([ 42,-42]) circle(20,$fn=12);
 
 color("black"){
     translate([-42,  0,1])text("3",7,,center);
     translate([  0,  0,1])text("4",7,,center);
     translate([ 42,  0,1])text("5",7,,center);
     translate([-42,-42,1])text("6",7,,center);
     translate([  0,-42,1])text("8",7,,center);
     translate([ 42,-42,1])text("12",7,,center);
 }

多邊形

[編輯 | 編輯原始碼]

polygon() 函式從 x、y 座標列表中建立多邊形形狀。多邊形是最強大的二維物件。它可以建立圓形和正方形所能建立的任何東西,以及更多。這包括具有凹邊和凸邊的不規則形狀。此外,它可以在該形狀內放置孔洞。

polygon(points = [ [x, y], ... ], paths = [ [p1, p2, p3..], ...], convexity = N);
引數
多邊形的 x、y 點列表。 : 2 元素向量組成的向量。
注意:點從 0 到 n-1 索引。
路徑
預設
如果未指定路徑,則所有點都按列出的順序使用。
單個向量
遍歷點的順序。使用 0 到 n-1 的索引。可能以不同的順序使用,並使用列出的所有點或部分點。
多個向量
建立主要和次要形狀。次要形狀從主要形狀中減去(如 difference())。次要形狀可能完全或部分位於主要形狀內。
透過從指定的最後一點返回到第一點來建立封閉形狀。
凸度
"內向"曲線的整數,即透過多邊形的任意直線預期的路徑交叉。見下文。
defaults:   polygon();  yields:  polygon(points = undef, paths = undef, convexity = 1);

無孔洞

[編輯 | 編輯原始碼]

equivalent scripts for this example
 polygon(points=[[0,0],[100,0],[130,50],[30,50]]);
 polygon([[0,0],[100,0],[130,50],[30,50]], paths=[[0,1,2,3]]);
 polygon([[0,0],[100,0],[130,50],[30,50]],[[3,2,1,0]]);
 polygon([[0,0],[100,0],[130,50],[30,50]],[[1,0,3,2]]);
    
 a=[[0,0],[100,0],[130,50],[30,50]];
 b=[[3,0,1,2]];
 polygon(a);
 polygon(a,b);
 polygon(a,[[2,3,0,1,2]]);

一個孔洞

[編輯 | 編輯原始碼]

equivalent scripts for this example
 polygon(points=[[0,0],[100,0],[0,100],[10,10],[80,10],[10,80]], paths=[[0,1,2],[3,4,5]],convexity=10);

 triangle_points =[[0,0],[100,0],[0,100],[10,10],[80,10],[10,80]];
 triangle_paths =[[0,1,2],[3,4,5]];
 polygon(triangle_points,triangle_paths,10);

第 1 個路徑向量 [0,1,2] 選擇點 [0,0],[100,0],[0,100] 用於主要形狀。第 2 個路徑向量 [3,4,5] 選擇點 [10,10],[80,10],[10,80] 用於次要形狀。次要形狀從主要形狀中減去(想想 difference())。由於次要形狀完全位於主要形狀內,它會留下一個有孔洞的形狀。

多個孔洞

[編輯 | 編輯原始碼]

[注意: 需要版本 2015.03] (用於使用 concat())


      //example polygon with multiple holes
a0 = [[0,0],[100,0],[130,50],[30,50]];     // main
b0 = [1,0,3,2];
a1 = [[20,20],[40,20],[30,30]];            // hole 1
b1 = [4,5,6];
a2 = [[50,20],[60,20],[40,30]];            // hole 2
b2 = [7,8,9];
a3 = [[65,10],[80,10],[80,40],[65,40]];    // hole 3
b3 = [10,11,12,13];
a4 = [[98,10],[115,40],[85,40],[85,10]];   // hole 4
b4 = [14,15,16,17];
a  = concat (a0,a1,a2,a3,a4);
b  = [b0,b1,b2,b3,b4];
polygon(a,b);
      //alternate 
polygon(a,[b0,b1,b2,b3,b4]);

從多邊形擠出三維形狀

[編輯 | 編輯原始碼]

   translate([0,-20,10]) {
       rotate([90,180,90]) {
           linear_extrude(50) {
               polygon(
                   points = [
                      //x,y
                       /*
                                  O  .
                       */
                       [-2.8,0],
                       /*
                                O__X  .
                       */
                       [-7.8,0],
                       /*
                              O
                               \
                                X__X  .
                       */
                       [-15.3633,10.30],
                       /*
                              X_______._____O
                               \         
                                X__X  .
                       */
                       [15.3633,10.30],
                       /*
                              X_______._______X
                               \             /
                                X__X  .     O
                       */
                       [7.8,0],
                       /*
                              X_______._______X
                               \             /
                                X__X  .  O__X
                       */
                       [2.8,0],
                       /*
                           X__________.__________X
                            \                   /
                             \              O  /
                              \            /  /
                               \          /  /
                                X__X  .  X__X
                       */
                       [5.48858,5.3],
                       /*
                           X__________.__________X
                            \                   /
                             \   O__________X  /
                              \            /  /
                               \          /  /
                                X__X  .  X__X
                       */
                       [-5.48858,5.3],
                                   ]
                               );
                           }
       }
   }

凸度引數指定與物件相交的射線可能穿透的最大正面(背面)數。此引數僅在 OpenCSG 預覽模式下正確顯示物件時需要,對多面體渲染沒有影響。

此影像顯示了一個凸度為 2 的二維形狀,因為以紅色指示的射線與二維形狀的交叉從外到內(或從內到外)最多 2 次。三維形狀的凸度將以類似的方式確定。將其設定為 10 應該適用於大多數情況。

import_dxf

[編輯 | 編輯原始碼]

[已棄用: import_dxf() 將在未來的版本中刪除。使用 import() 代替。]

讀取 DXF 檔案並建立一個 2D 形狀。

示例

linear_extrude(height = 5, center = true, convexity = 10)
		import_dxf(file = "example009.dxf", layer = "plate");

text 模組使用本地系統安裝的字型或單獨提供的字型檔案建立文字作為 2D 幾何物件。

[注意: 需要版本 2015.03]

引數

text
字串。要生成的文字。
大小
十進位制。生成的文字的升高(高於基線的距離)大約為給定值。預設值為 10。不同的字型會有所不同,可能無法完全填充指定的大小,通常會略微小一些。在公制系統中,大小為 25.4(英制 1 英寸)對應於 100pt ⇒ 12pt 字號將為 12×0.254 用於公制轉換或 0.12 用於英制。
font
字串。要使用的字型的名稱。這不是字型檔案的名字,而是邏輯字型名稱(由 fontconfig 庫內部處理)。這也可以包括樣式引數,見下文。可以使用字型列表對話方塊(幫助 -> 字型列表)獲取已安裝字型的列表和樣式。
halign
字串。文字的水平對齊方式。可能的取值是 "left"、"center" 和 "right"。預設值為 "left"。
valign
字串。文字的垂直對齊方式。可能的取值是 "top"、"center"、"baseline" 和 "bottom"。預設值為 "baseline"。
spacing
十進位制。增加/減少字元間距的因子。預設值 1 導致字型具有正常間距,給出大於 1 的值會導致字母間距更大。
direction
字串。文字流向。可能的取值是 "ltr"(從左到右)、"rtl"(從右到左)、"ttb"(從上到下)和 "btt"(從下到上)。預設值為 "ltr"。
language
字串。文字的語言(例如 "en"、"ar"、"ch")。預設值為 "en"。
script
字串。文字的文字(例如 "latin"、"arabic"、"hani")。預設值為 "latin"。
$fn
用於細分 freetype 提供的曲線路徑段

示例

示例 1: 結果。
text("OpenSCAD");



注意

為了允許指定特定的 Unicode 字元,您可以在字串中使用以下轉義程式碼指定它們;

  • \x03    - 十六進位制字元值(僅支援從017f的十六進位制值)
  • \u0123  - 使用 4 個十六進位制數字的 Unicode 字元(注意:小寫\u)
  • \U012345- 使用 6 個十六進位制數字的 Unicode 字元(注意:大寫\U)

空字元 (NUL) 對映到空格字元 (SP)。

 assert(version() == [2019, 5, 0]);
 assert(ord(" ") == 32);
 assert(ord("\x00") == 32);
 assert(ord("\u0000") == 32);
 assert(ord("\U000000") == 32);

示例

t="\u20AC10 \u263A"; // 10 euro and a smilie

使用字型和樣式

[編輯 | 編輯原始碼]

字型由其邏輯字型名稱指定;此外,可以新增樣式引數來選擇特定的字型樣式,如 "粗體" 或 "斜體",例如

font="Liberation Sans:style=Bold Italic"

字型列表對話方塊(在幫助 > 字型列表中可用)顯示每個可用字型的字型名稱和字型樣式。為了參考,對話方塊還會顯示字型檔案的路徑。您可以將字型列表中的字型拖放到編輯器視窗中以在 text() 語句中使用。

OpenSCAD 字型列表對話方塊

OpenSCAD 包含 Liberation MonoLiberation SansLiberation Serif 字型。因此,由於字型通常因平臺型別而異,因此使用這些包含的字型很可能在平臺之間可移植。

對於常見/休閒文字使用,出於這個原因,建議指定這些字型之一。Liberation Sans 是預設字型,以鼓勵這樣做。


除了已安裝的字型(對於 Windows,僅以管理員身份安裝的所有使用者的字型),還可以新增特定於專案的字型檔案。支援的字型檔案格式為 TrueType 字型 (*.ttf) 和 OpenType 字型 (*.otf)。這些檔案需要使用 use<> 註冊。

 use <ttf/paratype-serif/PTF55F.ttf>

註冊後,字型將列在字型列表對話方塊中,因此如果不知道字型的邏輯名稱,可以在註冊後查詢。

OpenSCAD 使用 fontconfig 來查詢和管理字型,因此可以使用命令列上的 fontconfig 工具以類似於 GUI 對話方塊的格式列出系統配置的字型。

$ fc-list -f "%-60{{%{family[0]}%{:style[0]=}}}%{file}\n" | sort

...
Liberation Mono:style=Bold Italic /usr/share/fonts/truetype/liberation2/LiberationMono-BoldItalic.ttf
Liberation Mono:style=Bold        /usr/share/fonts/truetype/liberation2/LiberationMono-Bold.ttf
Liberation Mono:style=Italic      /usr/share/fonts/truetype/liberation2/LiberationMono-Italic.ttf
Liberation Mono:style=Regular     /usr/share/fonts/truetype/liberation2/LiberationMono-Regular.ttf
...

在 Windows 下,字型儲存在 Windows 登錄檔中。要獲取包含字型檔名的檔案,請使用以下命令

reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" /s > List_Fonts_Windows.txt


示例

示例 2: 結果。
 square(10);
 
 translate([15, 15]) {
   text("OpenSCAD", font = "Liberation Sans");
 }
 
 translate([15, 0]) {
   text("OpenSCAD", font = "Liberation Sans:style=Bold Italic");
 }


垂直對齊

[編輯 | 編輯原始碼]
top
文字與給定 Y 座標處邊界框的頂部對齊。
中心
文字與給定 Y 座標處邊界框的中心對齊。
baseline
文字與給定 Y 座標處字型基線對齊。這是預設值。
bottom
文字與給定 Y 座標處邊界框的底部對齊。
OpenSCAD 垂直文字對齊
 text = "Align";
 font = "Liberation Sans";
 
 valign = [
   [  0, "top"],
   [ 40, "center"],
   [ 75, "baseline"],
   [110, "bottom"]
 ];
 
 for (a = valign) {
   translate([10, 120 - a[0], 0]) {
     color("red") cube([135, 1, 0.1]);
     color("blue") cube([1, 20, 0.1]);
     linear_extrude(height = 0.5) {
       text(text = str(text,"_",a[1]), font = font, size = 20, valign = a[1]);
     }
   }
 }


多行文字不支援 `text()`,但將每行大小 × .72 平移將導致 1em 的行間距(em= 字型的正文高度或磅值)。可以新增 20%(× 1.2)。

水平對齊

[編輯 | 編輯原始碼]
left
文字與給定 X 座標處邊界框的左側對齊。這是預設值。
中心
文字與給定 X 座標處邊界框的中心對齊。
right
文字與給定 X 座標處邊界框的右側對齊。
OpenSCAD 水平文字對齊
 text = "Align";
 font = "Liberation Sans";
 
 halign = [
   [10, "left"],
   [50, "center"],
   [90, "right"]
 ];
 
 for (a = halign) {
   translate([140, a[0], 0]) {
     color("red") cube([115, 2,0.1]);
     color("blue") cube([2, 20,0.1]);
     linear_extrude(height = 0.5) {
       text(text = str(text,"_",a[1]), font = font, size = 20, halign = a[1]);
     }
   }
 }


3D 文字

[編輯 | 編輯原始碼]

文字可以透過使用 linear_extrude 函式從二維物件變為三維物件。

//3d Text Example
linear_extrude(4)
    text("Text");
3D 文字示例

使用 projection() 函式,您可以從 3D 模型建立 2d 圖紙,並將其匯出為 dxf 格式。它透過將 3D 模型投影到 (x,y) 平面(z 為 0)來工作。如果 cut=true,則僅考慮 z=0 的點(有效地切割物件),如果 cut=false預設值),則也考慮平面之上和之下的點(建立適當的投影)。

示例:考慮隨 OpenSCAD 提供的 example002.scad。

然後,您可以進行“切割”投影,它將為您提供 z=0 的 x-y 平面的“切片”。

projection(cut = true) example002();

您還可以進行“普通”投影,這將為物件在 xy 平面上的“陰影”。

projection(cut = false) example002();

另一個示例

您也可以使用投影來獲取物件的“側檢視”。讓我們以 example002 為例,將其向上移動到 X-Y 平面之外,然後旋轉它

translate([0,0,25]) rotate([90,0,0]) example002();

現在,我們可以使用 projection() 獲取側檢視

projection() translate([0,0,25]) rotate([90,0,0]) example002();

連結

擠壓 是使用固定橫截面輪廓建立物體的過程。OpenSCAD 提供兩個命令來從二維形狀建立三維實體:linear_extrude() 和 rotate_extrude()。線性擠壓類似於將橡皮泥透過帶有特定形狀模具的壓機擠壓。

linear_extrude() 的工作原理類似於橡皮泥擠壓機

旋轉擠壓類似於車削 或在陶輪 上“拋制”碗的過程。

rotate_extrude() 模擬拋制容器

兩種擠壓方法都作用於位於 XY 平面的(可能分離的)二維形狀。雖然作用於二維形狀和三維實體的變換可以將形狀移出 XY 平面,但在執行擠壓時,最終結果並不直觀。實際發生的是,任何三維座標(Z 座標)中的資訊都會被任何二維形狀忽略,這個過程相當於在執行擠壓之前對任何二維形狀執行隱式projection()。建議對嚴格保留在 XY 平面的形狀執行擠壓。

linear_extrude

[edit | edit source]

線性擠壓是一個操作,它以二維物件作為輸入,生成三維物件作為結果。

擠壓遵循 **V** 向量,該向量預設為 **Z** 軸,為了指定自定義值,需要版本 > 2021.01。

在 OpenSCAD 中,擠壓始終在二維物件的 xy 平面投影(陰影)上執行;因此,如果您在擠壓之前旋轉或對二維物件應用其他變換,它的陰影形狀將被擠壓。

雖然擠壓沿著 **V** 向量是線性的,但有一個扭曲引數可用,它會導致物件在向上擠壓時圍繞 **V** 向量旋轉。這可以用來圍繞其中心旋轉物件,就像螺旋柱一樣,或者產生圍繞 **V** 向量的螺旋擠壓,就像豬尾巴一樣。

還包括一個縮放參數,以便可以擴充套件或收縮物件在擠壓範圍內的尺寸,從而使擠壓向內或向外擴充套件。

用法

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

由於向後相容性問題,您必須使用引數名稱。

height 必須為正。

v 是一個三維向量,它必須指向正 Z 方向 [注意: 需要版本 開發快照]

$fn 是可選的,它指定 linear_extrude 的解析度(數字越大,"平滑度"越高,但需要更多計算時間)。

如果對非平凡的二維形狀擠壓失敗,請嘗試設定凸度引數(預設值不是 10,但 10 是一個 "好" 的值,可以嘗試)。有關解釋,請參見下面的內容。

扭曲

[edit | edit source]

扭曲是形狀擠壓的度數。設定引數 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);

中心

[edit | edit source]

它類似於圓柱體的引數 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);

網格細化

[edit | edit source]

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);

縮放

[edit | edit source]

在擠壓的高度上,根據此值縮放二維形狀。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 一起使用

[edit | edit source]

此函式的常見用法是匯入二維 svg

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

rotate_extrude

[edit | edit source]

旋轉擠壓使二維形狀圍繞 Z 軸旋轉,形成具有旋轉對稱性的實體。理解此操作的一種方法是想象一個放置在 XY 平面上的陶輪,其旋轉軸指向 +Z 方向。然後將要製作的物體放置在這個虛擬陶輪上(可能延伸到 XY 平面下方,指向 -Z 方向)。要製作的物體是物體在 XY 平面上的橫截面(僅保留右側,X >= 0)。這就是將作為子元素饋送到 rotate_extrude() 以生成此實體的二維形狀。請注意,物體最初位於 XY 平面,但傾斜向上(圍繞 X 軸旋轉 +90 度)以擠壓。

由於二維形狀由 OpenSCAD 在 XY 平面渲染,因此理解此操作的另一種方法如下:使二維形狀圍繞 Y 軸旋轉以形成實體。生成的實體放置的位置使其旋轉軸位於 Z 軸上。

就像 linear_extrude 一樣,擠壓始終在二維多邊形到 XY 平面的投影上執行。應用於二維多邊形的 rotate、translate 等變換會修改二維多邊形到 XY 平面的投影,因此也會修改最終三維物體的外觀。

  • 二維多邊形的 Z 方向平移對結果沒有影響(因為投影也不受影響)。
  • X 方向平移會增加最終物體的直徑。
  • Y 方向平移會導致最終物體在 Z 方向上發生偏移。
  • 圍繞 X 軸或 Y 軸旋轉會扭曲最終物體的橫截面,因為到 XY 平面的投影也會被扭曲。

不要混淆,因為 OpenSCAD 會在 Z 方向上渲染二維多邊形,並具有一定的高度,所以二維物件(及其高度)似乎對 XY 平面具有更大的投影。但是,對於到 XY 平面的投影以及隨後的擠壓,僅使用沒有高度的底座多邊形。

它不能用來產生螺旋或螺紋。(這些可以透過 linear_extrude() 使用扭曲引數來完成。)

二維形狀**必須**完全位於 Y 軸的右側(建議)或左側。更準確地說,形狀的**每個**頂點都必須滿足 x >= 0 或 x <= 0。如果形狀跨越 X 軸,控制檯視窗中會出現警告,並且 rotate_extrude() 將被忽略。如果二維形狀接觸 Y 軸,即 x=0,則**必須**是一條接觸的直線,而不是一個點,因為一個點會導致一個厚度為零的三維物體,這是無效的,會導致 CGAL 錯誤。對於 2016.xxxx 之前的 OpenSCAD 版本,如果形狀位於負軸上,則生成的面的方向是內向的,這可能會導致意外效果。

用法

[edit | edit source]
rotate_extrude(angle = 360, convexity = 2) {...}
右手定則

由於向後相容性問題,您必須使用引數名稱。

convexity : 如果對非平凡的二維形狀擠壓失敗,請嘗試設定凸度引數(預設值不是 10,但 10 是一個 "好" 的值,可以嘗試)。有關解釋,請參見下面的內容。
angle [注意: 需要版本 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);

網格細化

[編輯 | 編輯原始碼]

增加組成 2D 形狀的片段數量可以提高網格質量,但渲染時間會更長。

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);

使用引數角度(在 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]] );

有關多邊形的更多資訊,請參見:2D 基本圖形:多邊形

拉伸引數說明

[編輯 | 編輯原始碼]

所有拉伸模式的拉伸引數

[編輯 | 編輯原始碼]
凸度 整數。凸度引數指定與物件相交的射線可能穿透的最大正面(或背面)數量。此引數僅在使用標準 Goldfeather 演算法時,在 OpenCSG 預覽模式下正確顯示物件時才需要,對多面體渲染(網格生成)沒有影響。


基本圖形的凸度是在單個位置上的基本圖形的最大正面(或背面)數量。例如,球體的凸度為 1,圓環的凸度為 2。


此影像顯示了一個凸度為 2 的 2D 形狀,因為以紅色指示的射線最多與 2D 形狀相交 4 次(2 個正面和 2 個背面)。3D 形狀的凸度將以類似的方式確定。將其設定為 10 對大多數情況都適用。一般情況下,只設置高數字可能會導致預覽渲染速度變慢。

僅用於線性拉伸的拉伸引數

[編輯 | 編輯原始碼]
高度 拉伸高度
中心 如果為真,則在拉伸後將實體居中
扭曲 拉伸扭曲角度(度)
縮放 在拉伸高度上,按此值縮放 2D 形狀。
切片 類似於特殊變數 $fn,但不會傳遞給子 2D 形狀。
類似於切片,但在多邊形的段上新增點,而不會改變多邊形的形狀。

使用 import() 和拉伸模組,可以將從 DXF 檔案中讀取的 2D 物件轉換為 3D 物件。另請參見2D 到 3D 拉伸

線性拉伸

[編輯 | 編輯原始碼]

從 DXF 檔案匯入的 2D 物件的線性拉伸示例。

linear_extrude(height = fanwidth, center = true, convexity = 10)
   import (file = "example009.dxf", layer = "fan_top");

旋轉拉伸

[編輯 | 編輯原始碼]

從 DXF 檔案匯入的 2D 物件的旋轉拉伸示例。

rotate_extrude(convexity = 10)
   import (file = "example009.dxf", layer = "fan_side", origin = fan_side_center);

讓 Inkscape 正常工作

[編輯 | 編輯原始碼]

Inkscape 是一個開源繪圖程式。有關將 2d DXF 圖紙從 Inkscape 傳輸到 OpenSCAD 的教程,請參見此處

上一個

[編輯 | 編輯原始碼]

CSG 匯出

下一個

[編輯 | 編輯原始碼]

其他 2D 格式

華夏公益教科書