跳轉到內容

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,但不會傳遞給子二維形狀。
片段 類似於切片,但在多邊形的片段上新增點,而不會改變多邊形的形狀。
華夏公益教科書