Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
使用 CSG 設計關卡原型
CSG 是 Constructive Solid Geometry (建構實體幾何)的縮寫,是一種將基本形狀或自訂網格組合起來以建立更複雜形狀的工具。在三維建模軟體中,CSG 多被稱為“布林運算子”。
CSG 在 Godot 中的目的是將其用於關卡原型設計。該技術允許使用者通過組合像素來建立最常見形狀的簡單版本。可以使用反轉像素建立室內環境。
備註
Godot 中的 CSG 節點主要用於快速原型開發。沒有內建支援 UV 貼圖或編輯 3D 多邊形 (雖然擠壓的 2D 多邊形可以與 CSGPolygon3D 節點一起使用)。
如果您正在尋找針對專案易於使用的關卡設計工具,您可能想改用 FuncGodot 或 Cyclops Level Builder 。
也參考
您可以透過 建構式實體幾何範例專案 查看如何使用 CSG 節點來建構各種形狀 (例如樓梯或道路)。
序言
與 Godot 的其他功能一樣,CSG 以節點的形式存在。這些是 CSG 節點:
CSG 工具功能
每個 CSG 節點都支援 3 種布耳運算:
並集(Union): 合併兩個像素的幾何體,刪除交叉的幾何體。
交集(Intersection): 只保留相交的幾何體,其餘的被刪除。
差集(Subtraction): 從第一種形狀中減去第二種形狀,留下一個凹陷的形狀。
CSGPolygon
CSGPolygon3D 節點以下列方式沿著以 2D(X、Y 座標)繪製的多邊形擠出:
Depth: (深度)擠出一定量。
Spin: (旋轉)圍繞原點旋轉時擠出。
路徑: 沿著 Path 節點擠出。這個操作通常稱為掃掠。
備註
Path 模式必須搭配 Path3D 節點使用。在 Path 節點中繪製路徑,CSGPolygon3D 中的多邊形就會沿著指定路徑擠出。
自訂網格
自訂網格只要是 流形 的,就可以用於 CSGMesh3D。網格可以在其他軟體中建模並匯入到 Godot。支援多個材質。
要將一個網格用於 CSG 網格,必須符合以下條件:
被關閉
讓每個邊僅連接到兩個面
必須有體積
而建議避免:
負體積
自相交
內部面
Godot 使用 manifold 函式庫 來實作 CSG 網格。Godot 所採用的「流形(manifold)」技術定義如下,部分內容來自該函式庫的`manifold 定義 <https://github.com/elalish/manifold/wiki/Manifold-Library#manifoldness-definition>`__:
每個三角形的每一條邊必須與另一個三角形的邊共用相同的兩個頂點(以索引計),且這兩條邊的起點與終點必須對調。從 Godot 引擎的流形網格外部觀看時,三角形頂點必須呈順時針排列。
用 Blender 修正現有網格使其成為流形
如果你有一個現有的網格不是流形(manifold),你可以使用 Blender 將其修正為流形。
在 Blender 中,請安裝並啟用 3D Print Toolbox 擴充套件。
選取你想要修正為流形的網格。點擊側邊欄的箭頭以展開選單:
在 3D Print 分頁下的 Clean Up 區塊,點擊 Make Manifold 按鈕:
此時該網格應該已成為流形,可以作為自訂網格使用。
CSGCombiner3D
CSGCombiner3D 節點是一個用於組織的空形狀, 它只會合並子節點.
處理順序
每個CSG節點將首先按樹連續處理其子節點及其操作: 並集, 交集或減法, 並將它們逐一應用於自身.
備註
為了保證性能, 確保CSG幾何體保持相對簡單, 因為複雜的網格可能需要一段時間來處理. 如果將物件新增在一起(如桌子和房間物件), 請將它們建立為單獨的CSG樹. 強制在一棵樹中新增太多物件最終會影響性能. 僅在實際需要的地方使用二進位操作.
原型設計
我們將對房間進行原型設計以練習使用CSG工具.
小訣竅
在**正交**視角下工作,在組合 CSG 形狀時可以得到更好的視圖。
我們的關卡將包含以下物件:
一個房間,
一張床,
一盞燈,
一張桌子,
一個書架.
使用Spatial節點作為根節點建立場景.
小訣竅
環境的預設光照在某些角度不能提供清晰的陰影。使用 3D 視圖功能表中的**顯示重複繪製**改變顯示模式,或者新增一個 DirectionalLight 節點來幫助你清楚看到。
建立一個 CSGBox 並將其命名為 room ,啟用 Invert Faces (反轉面)並改變你的房間的大小。
接下來, 建立一個CSGCombiner並將其命名為 desk .
桌子有一個表面和四條腿:
在 Union 模式下為曲面建立1個CSGBox子節點, 並調整大小.
在 Union 模式下為腿部建立4個CSGBox子節點並調整大小.
調整它們的擺放位置, 就像一張辦公桌.
備註
CSG 組合內的 CSG 節點只會在組合內處理它們的操作。因此,CSGCombiner(CSG 組合器)是用來組織 CSG 節點的。
建立一個CSGCombiner, 並將其命名為 bed .
我們的床由三部群組成: 床, 床墊和枕頭. 建立一個CSGBox並調整床的尺寸. 再建立一個CSGBox, 並調整床墊的尺寸.
我們將建立另一個名為 pillow 的CSGCombiner作為 bed 的子節點. 場景樹應如下所示:
我們將在 Union 模式下組合 3 個 CSGSphere 節點,形成一個枕頭。縮放球體的 Y 軸並啟用 Smooth Faces (平滑面)。
選擇 pillow 節點,並將模式切換到 Subtraction;組合後的球體將在床墊上開一個洞。
試著將 pillow 節點重設你代到根 Spatial 節點;這個洞會消失。
備註
這是為了說明CSG處理順序的效果. 由於根節點不是CSG節點, 所以CSGCombiner節點是操作的結束;這顯示了使用CSGCombiner來組織CSG場景.
觀察效果後, 撤銷重新選擇父節點. 您搭建的床應如下所示:
建立一個CSGCombiner, 並將其命名為 lamp .
一盞燈由3部群組成: 支架, 燈杆和燈罩. 建立一個CSGCylinder, 啟用 Cone 選項並將其作為支架. 再建立一個CSGCylinder, 並調整尺寸, 將其作為燈杆使用.
我們將使用一個 CSGPolygon3D 作為燈罩。使用 CSGPolygon3D 的 旋轉 模式,並在前視圖 (數字鍵盤 1) 中繪製一個 梯形 ;這個形狀將會繞著原點擠出並形成燈罩。
調整3個部分的位置, 使其看起來像一盞燈.
建立一個CSGCombiner, 並將其命名為 bookshelf .
我們將為書架使用3個CSGBox節點. 建立一個CSGBox並調整其大小, 這將是書架的尺寸.
複製 CSGBox 並縮短每個軸的尺寸,並將模式改為 Subtraction (減去)。
你幾乎已經建立了一個架子. 再建立一個CSGBox, 把架子分成兩層.
根據您的喜好將您的傢俱放在房間裡, 您的場景應該是這樣的:
你已經成功地用Godot中的CSG工具製作了一個房間關卡的原型.CSG工具可以用於設計各種型別的關卡, 如迷宮或城市;在設計遊戲時探究它的局限性.
使用原型紋理
Godot 的 標準 3D 材質與 ORM 3D 材質 支援 三平面貼圖,這可用於自動套用貼圖到任意物件上而不失真。這在使用 CSG 時很方便,因為 Godot 尚未支援在 CSG 節點上編輯 UV 貼圖。三平面貼圖相對較慢,這通常將其使用限制在有機表面,例如地形。不過,在原型設計時,它可用於快速套用貼圖到基於 CSG 的關卡上。
備註
如果你需要一些原型用的貼圖,Kenney 製作了一套 CC0 授權的原型貼圖。
有兩種方式可以將材質套用到 CSG 節點:
將其作為材質覆蓋應用到CSGCombiner節點上(在屬性檢視器中的 Geometry > Material Override ). 這將自動影響它的子節點, 但能改變單個子節點的材質.
將材質應用於單個節點( 材質 在(屬性)屬性檢視器中). 這樣, 每個CSG節點都可以有自己的外觀. 減去CSG節點將把它們的材質應用到 "digging" 到的節點上.
要將三平面貼圖(Triplanar Mapping)應用到 CSG 節點,請選取該節點,打開屬性檢查器,點擊 Material Override**(或個別 CSG 節點的 **Material)旁的 [empty],選擇 New StandardMaterial3D。點擊新建立的材質圖示來編輯,展開 Albedo 區段並將貼圖載入 Texture 屬性;接著展開 Uv1 區段並勾選 Triplanar。你可以透過上方的 Scale 和 Offset**屬性調整貼圖在各軸的縮放與偏移。**Scale 數值越大,貼圖重複次數越高。
小訣竅
你可以複製一個 StandardMaterial3D 來重複用於多個 CSG 節點。操作方式是在「屬性檢查器」中點擊材質屬性旁的下拉箭頭,選擇 複製。要貼上時,選取目標節點,再點擊其材質屬性旁的下拉箭頭,選擇 貼上。
轉換為 MeshInstance3D
自 Godot 4.4 起,你可以將 CSG 節點及其子節點轉換為 MeshInstance3D 節點。
這有幾個好處:
可以燒錄光照貼圖,因為 MeshInstance3D 支援產生 UV2。
可以燒錄遮蔽剔除,因為遮蔽剔除只針對 MeshInstance3D 進行運算。
載入速度更快,因為場景載入時不需重新建立 CSG 網格。
若在其他 CSG 節點中使用該網格,變更節點轉換時效能更佳。
要將 CSG 節點轉換成 MeshInstance3D 節點,請選取該節點,然後在工具列中點選 CSG > 烘焙網格實體。MeshInstance3D 節點會以同層級的方式產生。請注意,被烘焙的 CSG 節點**不會**自動隱藏,因此請記得手動隱藏,以避免其幾何體與新建立的 MeshInstance3D 重疊。
你也可以透過 CSG > 烘焙碰撞形狀 來產生三角網格碰撞體。產生的 CollisionShape3D 節點必須作為 StaticBody3D 或 AnimatableBody3D 的子節點才會生效。
小訣竅
請記得保留原本的 CSG 節點於場景樹中,以便日後需要時能修改幾何形狀。若需變更幾何,將 MeshInstance3D 節點刪除,並將 CSG 節點重新顯示即可編輯。
匯出陣列
你可以先用 CSG 搭建關卡,再將其匯出為 3D 模型,以便匯入 3D 建模軟體。請選擇 場景 > 匯出為... > glTF 2.0 場景 來進行匯出。