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 多被称为“布尔运算符”。
关卡原型设计是 Godot 中 CSG 的主要用途之一。该技术允许用户通过组合图元来创建最常见形状的简单版本。可以使用反转图元创建内部环境。
备注
Godot 中的 CSG 节点主要用于原型设计,没有内置对 UV 贴图或编辑 3D 多边形的支持(尽管可以在 CSGPolygon3D 节点中使用挤出的 2D 多边形)。
如果你在寻找易于使用的关卡设计工具,可以考虑使用 FuncGodot 或 Cyclops Level Builder。
参见
你可以通过 CSG 演示项目来学习如何使用 CSG 节点构建各种形状(例如楼梯或道路)。
CSG 节点简介
与 Godot 的其他功能一样,CSG 以节点的形式存在。这些是 CSG 节点:
CSG 工具功能
每个 CSG 节点都支持 3 种布尔运算:
Union:并集;合并两个图元的几何体,删除相交的几何体。
Intersection:交集;只保留相交的几何体,其余部分被删除。
Subtraction(差集):差集;从第一种形状中减去第二种形状,留下与其形状相同的凹陷。
CSGPolygon
CSGPolygon3D 节点通过下列方式沿着以 2D(X、Y 坐标)绘制的多边形挤出:
Depth:深度;向后挤出一定距离。
Spin:旋转;围绕原点旋转时挤出。
Path:路径;沿路径节点挤出。该操作通常称为放样。
备注
Path 模式必须提供一个 Path3D 节点才能工作。在 Path 节点中绘制路径,CSGPolygon3D 中的多边形将沿给定路径挤出。
自定义网格
只要是流形(manifold)的自定义网格都可以用于 CSGMesh3D。可以在其他软件中建模并导入 Godot。支持多种材质。
网格用作 CSG 网格需要满足以下条件:
闭合
每条边都只连接到两个面
有体积
并且建议避免:
负体积
自相交
内部面
Godot 使用 manifold 库来实现 CSG 网格。Godot 所使用的“流形(manifold)”的技术定义如下,改编自该库的“流形”定义:
每个三角形的每条边必须包含与另一条三角形边(在索引后)完全相同的两个顶点,并且这两条边的起始顶点和结束顶点必须互换位置。当从 Godot Engine 流形网格的外部观察时,三角形顶点必须按顺时针顺序排列。
使用 Blender 使现有网格成为流形
如果你有一个非流形的现有网格,可以使用 Blender 将其转换为流形网格。
在 Blender 中,安装并启用 3D Print Toolbox 插件。
选中需要转换为流形的网格。点击箭头展开侧边栏:
在 3D Print 选项卡中,Clean Up 下,点击 Make Manifold 按钮:
现在网格应该是流形的,可以作为自定义网格使用了。
CSGCombiner3D
CSGCombiner3D 节点是一个用于组织的空形状,它只会合并子节点。
处理顺序
每个 CSG 节点都将首先按照树顺序处理其子节点及其操作:并集、交集或差集,然后将它们逐一应用于自身。
备注
出于性能考虑,请确保 CSG 几何体保持相对简单,因为复杂的网格可能需要一段时间来处理。如果要将对象组合在一起(例如桌子和房间对象),请将它们创建为独立的 CSG 树。在单棵树中强制放入太多对象最终会影响性能。只在真正需要的地方使用布尔运算。
原型设计
我们将对房间进行原型设计以练习使用 CSG 工具。
小技巧
在正交投影下工作,可以在组合 CSG 形状时获得更好的视图。
我们的关卡将包含以下对象:
一个房间,
一张床,
一盏灯,
一张桌子,
一个书架。
创建一个以 Node3D 节点作为根节点的场景。
小技巧
环境的默认光照在某些角度无法提供清晰的阴影。使用 3D 视口菜单中的显示重复绘制更改显示模式,或者添加一个 DirectionalLight 节点来帮助你看清楚。
创建一个 CSGBox3D 并将其命名为 room,启用 Invert Faces(反转面)并改变房间的尺寸。
接下来,创建一个 CSGCombiner3D 并将其命名为 desk。
桌子有一个桌面和四条腿:
在 Union 模式下为桌面创建一个 CSGBox3D 子节点并调整尺寸。
在 Union 模式下为腿部创建四个 CSGBox3D 子节点并调整尺寸。
调整它们的摆放位置,使其看起来像一张桌子。
备注
CSGCombiner3D 内的 CSG 节点只会在组合器内处理它们的操作。因此,CSGCombiner3D 用于组织 CSG 节点。
创建一个 CSGCombiner3D,并将其命名为 bed。
我们的床由三部分组成:床架、床垫和枕头。创建一个 CSGBox3D 并调整床架的尺寸。再创建一个 CSGBox3D 并调整床垫的尺寸。
我们将创建另一个名为 pillow 的 CSGCombiner3D 作为 bed 的子节点。场景树应如下所示:
我们将在 Union 模式下组合 3 个 CSGSphere3D 节点,形成一个枕头。缩放球体的 Y 轴并启用 Smooth Faces(平滑面)。
选择 pillow 节点,并将模式切换到 Subtraction;组合后的球体将在床垫上挖出一个凹陷。
试着将 pillow 节点重新设置为根 Node3D 节点的子节点;凹陷会消失。
备注
这是为了说明 CSG 处理顺序的效果。由于根节点不是 CSG 节点,因此 CSGCombiner3D 节点成为操作的终点;这展示了 CSGCombiner3D 用来组织 CSG 场景的功能。
观察效果后,撤销重新设置父节点的操作。你搭建的床应该看起来像这样:
创建一个 CSGCombiner3D,并将其命名为 lamp。
一盏灯由三部分组成:灯座、灯杆和灯罩。创建一个 CSGCylinder3D,启用 Cone 选项并使其成为灯座。创建另一个 CSGCylinder3D 并调整尺寸,将其用作灯杆。
我们将使用 CSGPolygon3D 来制作灯罩。使用 CSGPolygon3D 的 Spin 模式,在前视图(小键盘 1)下绘制一个梯形,这个形状将围绕原点挤出,形成灯罩。
调整三个部分的位置,使其看起来像一盏灯。
创建一个 CSGCombiner3D,并将其命名为 bookshelf。
我们将为书架使用 3 个 CSGBox3D 节点。创建一个 CSGBox3D 并调整其大小,这将是书架的整体尺寸。
复制 CSGBox3D 并缩短每个轴的尺寸,然后将模式改为 Subtraction(减去)。
你几乎已经完成了一个架子。再创建一个 CSGBox3D,将架子分成两层。
根据你的喜好将家具摆放在房间里,你的场景应该看起来像这样:
你已经成功地使用 Godot 中的 CSG 工具制作了一个房间关卡的原型。CSG 工具可以用于设计各种类型的关卡,如迷宫或城市;在设计游戏时探索它的局限性。
使用原型纹理
Godot 的 标准 3D 材质与 ORM 3D 材质 支持 三平面映射,可用于自动将纹理应用到任意对象而不产生畸变。使用 CSG 时这很方便,因为 Godot 尚不支持在 CSG 节点上编辑 UV 贴图。三平面映射相对较慢,这通常限制其在地形等有机表面上的使用。尽管如此,在制作原型时,它仍可用于快速将纹理应用到基于 CSG 的关卡。
备注
如果你需要一些原型纹理,Kenney 制作了一套 CC0 许可的原型纹理。
有两种方法可以将材质应用到 CSG 节点:
将其作为材质覆盖应用到 CSGCombiner3D 节点上(在检查器中的 Geometry > Material Override)。这将自动影响它的子节点,但会使你无法在单个子节点上更改材质。
将材质应用于单个节点(检查器中的 Material)。这样,每个 CSG 节点都可以有自己的外观。减法的 CSG 节点会将它们的材质应用到它们“挖入”的节点上。
要将三平面映射应用到 CSG 节点,请选中它,转到检查器,单击 Material Override(材质覆盖)旁的 <空> 文本(如果是单独的 CSG 节点则为 Material)。选择 新建 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 节点可见。
导出为 glTF
使用 CSG 绘制关卡,然后将其导出为 3D 模型,以导入到 3D 建模软件中,这是非常有用的工作流程。你可以通过选择 场景 > 导出为...> glTF 2.0 场景... 来执行此操作。