Work in progress

The content of this page was not yet updated for Godot 4.2 and may be outdated. If you know how to improve this page or you can confirm that it's up to date, feel free to open a pull request.

使用 CSG 設計關卡原型

CSG stands for Constructive Solid Geometry, and is a tool to combine basic shapes or custom meshes to create more complex shapes. In 3D modeling software, CSG is mostly known as "Boolean Operators".

CSG 在 Godot 中的目的是將其用於關卡原型設計。該技術允許使用者通過組合像素來建立最常見形狀的簡單版本。可以使用反轉像素建立室內環境。

備註

Godot中的CSG節點主要用於原型設計. 沒有內建的對UV貼圖或編輯3D多邊形的支援(儘管擠出的2D多邊形可以用CSGPolygon節點來使用).

如果你正在為一個專案尋找一個簡單易用的關卡設計工具, 你可能會想使用 Qodot 來代替. 它可以讓你使用 TrenchBroom 設計關卡, 並在Godot中匯入它們.

../../_images/csg.gif

也參考

除了這份說明文件,你可能也會想看看 Godot Demo 專案

序言

與 Godot 的其他功能一樣,CSG 以節點的形式存在。這些是 CSG 節點:

../../_images/csg_nodes.png ../../_images/csg_mesh.png

CSG 工具功能

每個 CSG 節點都支援 3 種布耳運算:

  • **並集(Union):**合併兩個像素的幾何體,刪除交叉的幾何體。

  • **交集(Intersection):**只保留相交的幾何體,其餘的被刪除。

  • **差集(Subtraction):**從第一種形狀中減去第二種形狀,留下一個凹陷的形狀。

../../_images/csg_operation_menu.png ../../_images/csg_operation.png

CSGPolygon

CSGPolygon 節點以下列方式沿著以 2D(X、Y 座標)繪製的多邊形擠出:

  • **Depth:**(深度)擠出一定量。

  • **Spin:**(旋轉)圍繞原點旋轉時擠出。

  • 路徑(Path): 沿路徑節點擠出. 此操作通常稱為放樣.

../../_images/csg_poly_mode.png ../../_images/csg_poly.png

備註

Path 模式需要一個 Path 節點來運作。在 Path 節點中繪製路徑,CSGPolygon 中的多邊形將沿給定路徑擠出。

自訂網格

Any mesh can be used for CSGMesh3D; the mesh can be modeled in other software and imported into Godot. Multiple materials are supported. There are some restrictions for geometry:

  • 它必須被關閉,

  • 它不能自我相交,

  • 它不能包含內部面,

  • 每條邊都必須連接到另外兩個面.

../../_images/csg_custom_mesh.png

CSGCombiner3D

CSGCombiner 節點是一個用於組織的空形狀, 它只會合並子節點.

處理順序

每個CSG節點將首先按樹連續處理其子節點及其操作: 並集, 交集或減法, 並將它們逐一應用於自身.

備註

為了保證性能, 確保CSG幾何體保持相對簡單, 因為複雜的網格可能需要一段時間來處理. 如果將物件新增在一起(如桌子和房間物件), 請將它們建立為單獨的CSG樹. 強制在一棵樹中新增太多物件最終會影響性能. 僅在實際需要的地方使用二進位操作.

原型設計

我們將對房間進行原型設計以練習使用CSG工具.

小訣竅

在**正交**視角下工作,在組合 CSG 形狀時可以得到更好的視圖。

我們的關卡將包含以下物件:

  • 一個房間,

  • 一張床,

  • 一盞燈,

  • 一張桌子,

  • 一個書架.

使用Spatial節點作為根節點建立場景.

小訣竅

環境的預設光照在某些角度不能提供清晰的陰影。使用 3D 視圖功能表中的**顯示重複繪製**改變顯示模式,或者新增一個 DirectionalLight 節點來幫助你清楚看到。

../../_images/csg_overdraw.png

建立一個 CSGBox 並將其命名為 room,啟用 **Invert Faces**(反轉面)並改變你的房間的大小。

../../_images/csg_room.png ../../_images/csg_room_invert.png

接下來, 建立一個CSGCombiner並將其命名為 desk .

桌子有一個表面和四條腿:

  • Union 模式下為曲面建立1個CSGBox子節點, 並調整大小.

  • Union 模式下為腿部建立4個CSGBox子節點並調整大小.

調整它們的擺放位置, 就像一張辦公桌.

../../_images/csg_desk.png

備註

CSG 組合內的 CSG 節點只會在組合內處理它們的操作。因此,CSGCombiner(CSG 組合器)是用來組織 CSG 節點的。

建立一個CSGCombiner, 並將其命名為 bed .

我們的床由三部群組成: 床, 床墊和枕頭. 建立一個CSGBox並調整床的尺寸. 再建立一個CSGBox, 並調整床墊的尺寸.

../../_images/csg_bed_mat.png

我們將建立另一個名為 pillow 的CSGCombiner作為 bed 的子節點. 場景樹應如下所示:

../../_images/csg_bed_tree.png

我們將在 Union 模式下組合 3 個 CSGSphere 節點,形成一個枕頭。縮放球體的 Y 軸並啟用 **Smooth Faces**(平滑面)。

../../_images/csg_pillow_smooth.png

選擇 pillow 節點,並將模式切換到 Subtraction;組合後的球體將在床墊上開一個洞。

../../_images/csg_pillow_hole.png

試著將 pillow 節點重設你代到根 Spatial 節點;這個洞會消失。

備註

這是為了說明CSG處理順序的效果. 由於根節點不是CSG節點, 所以CSGCombiner節點是操作的結束;這顯示了使用CSGCombiner來組織CSG場景.

觀察效果後, 撤銷重新選擇父節點. 您搭建的床應如下所示:

../../_images/csg_bed.png

建立一個CSGCombiner, 並將其命名為 lamp .

一盞燈由3部群組成: 支架, 燈杆和燈罩. 建立一個CSGCylinder, 啟用 Cone 選項並將其作為支架. 再建立一個CSGCylinder, 並調整尺寸, 將其作為燈杆使用.

../../_images/csg_lamp_pole_stand.png

我們將使用 CSGPolygon 來製作燈罩。使用 Spin 模式,在**前視圖**(小鍵盤 1)下繪製一個`梯形 <https://zh.wikipedia.org/wiki/%E6%A2%AF%E5%BD%A2>`_,這個形狀將圍繞原點擠出,形成燈罩。

../../_images/csg_lamp_spin.png ../../_images/csg_lamp_polygon.png ../../_images/csg_lamp_extrude.png

調整3個部分的位置, 使其看起來像一盞燈.

../../_images/csg_lamp.png

建立一個CSGCombiner, 並將其命名為 bookshelf .

我們將為書架使用3個CSGBox節點. 建立一個CSGBox並調整其大小, 這將是書架的尺寸.

../../_images/csg_shelf_big.png

複製 CSGBox 並縮短每個軸的尺寸,並將模式改為 **Subtraction**(減去)。

../../_images/csg_shelf_subtract.png ../../_images/csg_shelf_subtract_menu.png

你幾乎已經建立了一個架子. 再建立一個CSGBox, 把架子分成兩層.

../../_images/csg_shelf.png

根據您的喜好將您的傢俱放在房間裡, 您的場景應該是這樣的:

../../_images/csg_room_result.png

你已經成功地用Godot中的CSG工具製作了一個房間關卡的原型.CSG工具可以用於設計各種型別的關卡, 如迷宮或城市;在設計遊戲時探究它的局限性.

使用原型紋理

Godot的 doc_spatial_material 支援*triplanar mapping*, 它可以用來自動將紋理應用到任意物件上, 而不會發生變形. 這在使用CSG時很方便, 因為Godot還不支援在CSG節點上編輯UV貼圖. 三面貼圖的速度相對較慢, 這通常限制了它的使用, 比如地形等有機表面. 不過, 在原型設計時, 還是可以用它來快速將紋理應用到基於CSG的關卡上. (CSG: 建構實體幾何(Constructive Solid Geometry)的簡寫).

備註

如果你需要一些原型的圖片,Kenney做了一套 CC0授權的原型圖片.

Godot 沒有使用限制

  • 將其作為材質覆蓋應用到CSGCombiner節點上(在屬性面板中的 Geometry > Material Override ). 這將自動影響它的子節點, 但能改變單個子節點的材質.

  • 將材質應用於單個節點( 材質 在(屬性)屬性面板中). 這樣, 每個CSG節點都可以有自己的外觀. 減去CSG節點將把它們的材質應用到 "digging" 到的節點上.

要將三平面貼圖應用到 CSG 節點,請選中它,轉到“屬性面板”,按一下 Material Override**(材質覆蓋)旁的 **[空] 字樣(如果是單獨的 CSG 節點則為 Material)。選擇**新建 SpatialMaterial**。點擊剛建立出來的材質圖示來進行編輯。展開 Albedo 部分,為 Texture 屬性載入一張紋理。現在再展開 Uv1 部分,勾選 Triplanar。可以用上面的 ScaleOffset 屬性來調整紋理在各個方向上的縮放和偏移量。Scale 屬性越大,紋理重複得越多。

小訣竅

您可以複製一個 SpatialMaterial, 以便在 CSG 節點中重複使用它. 要做到這一點, 在(屬性)屬性面板中點擊材質屬性旁邊的下拉箭頭, 然後選擇 複製 . 要貼上它, 請選擇您要應用該材質的節點, 按一下其材質屬性旁邊的下拉箭頭, 然後選擇 貼上 .

匯出陣列

It can be useful to block out a level using CSG, then export it as a 3d model, to import into 3D modeling software. You can do this by selecting Scene > Export As... > glTF 2.0 Scene.

../../_images/export_as_gltf.webp