使用 CSG 设计关卡原型

CSG 是 Constructive Solid Geometry(构造实体几何)的缩写,是一种将基本形状或自定义网格组合起来以创建更复杂形状的工具。在三维建模软件中,CSG 多被称为“布尔运算符”。

关卡原型是 Godot 中 CSG 的主要用途之一。该技术允许用户通过组合图元来创建最常见形状的简单版本。可以使用反转图元创建内部环境。

备注

The CSG nodes in Godot are mainly intended for prototyping. There is no built-in support for UV mapping or editing 3D polygons (though extruded 2D polygons can be used with the CSGPolygon3D node). In addition CSG can’t reliably create meshes made up of multiple nodes without holes.

If you’re looking for an easy to use level design tool for a project, you may want to use FuncGodot or Cyclops Level Builder instead.

CSG being used to subtract a torus shape from a box

参见

你可以通过 CSG 演示项目 来学习如何使用 CSG 节点构建各种形状(例如楼梯或道路)。

CSG 节点简介

与 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

CSGPolygon3D 节点通过下列方式沿着以 2D(X、Y 坐标)绘制的多边形挤出:

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

  • Spin:(旋转)围绕原点旋转时挤出。

  • 路径(Path): 沿路径节点挤出. 此操作通常称为放样.

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

备注

Path 模式必须需要一个 Path3D 节点来运行。在 Path 节点中绘制路径,CSGPolygon3D 中的多边形将沿给定路径挤出。

自定义网格

任何网格都可以用于 CSGMesh3D,网格可以在其他软件中建模并导入Godot。支持多种材质。对几何体有一些限制:

  • 它必须被关闭,

  • 它不能自我相交,

  • 它不能包含内部面,

  • 每条边都必须连接到另外两个面.

../../_images/csg_custom_mesh.png

CSGCombiner3D

CSGCombiner3D 节点是一个用于组织的空形状,它只会合并子节点。

处理顺序

每个CSG节点将首先按树顺序处理其子节点及其操作:并集、交集或减,并将它们逐一应用于自身。

备注

为了保证性能, 确保CSG几何体保持相对简单, 因为复杂的网格可能需要一段时间来处理. 如果将对象添加在一起(如桌子和房间对象), 请将它们创建为单独的CSG树. 强制在一棵树中添加太多对象最终会影响性能. 仅在实际需要的地方使用二进制操作.

原型设计

我们将对房间进行原型设计以练习使用CSG工具.

小技巧

正交视角下工作,在组合 CSG 形状时可以得到更好的视图。

我们的关卡将包含以下对象:

  • 一个房间,

  • 一张床,

  • 一盏灯,

  • 一张桌子,

  • 一个书架.

创建一个以 Node3D 节点作为根节点的场景。

小技巧

环境的默认光照在某些角度不能提供清晰的阴影。使用 3D 视图菜单中的显示重复绘制改变显示模式,或者添加一个 DirectionalLight 节点来帮助你清楚看到。

../../_images/csg_overdraw.png

创建一个 CSGBox3D 并将其命名为 room,启用 Invert Faces(反转面)并改变你的房间的大小。

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

接下来,创建一个 CSGCombiner3D 并将其命名为 desk

桌子有一个表面和四条腿:

  • Union 模式下为曲面创建1个 CSGBox3D 子节点,并调整尺寸。

  • Union 模式下为腿部创建4个 CSGBox3D 子节点并调整尺寸。

调整它们的摆放位置, 就像一张办公桌.

../../_images/csg_desk.png

备注

CSGCombiner3D 内的 CSG 节点只会在组合内处理它们的操作。因此,CSGCombiner3D(CSG 组合器)是用来组织 CSG 节点的。

创建一个 CSGCombiner3D,并将其命名为 bed

我们的床由三部分组成:床,床垫和枕头。创建一个 CSGBox3D 并调整床的尺寸。再创建一个CSGBox3D,并调整床垫的尺寸。

../../_images/csg_bed_mat.png

我们将创建另一个名为 pillow 的 CSGCombiner3D 作为 bed 的子节点。场景树应如下所示:

../../_images/csg_bed_tree.png

我们将在 Union 模式下组合 3 个 CSGSphere3D 节点,形成一个枕头。缩放球体的 Y 轴并启用 Smooth Faces(平滑面)。

../../_images/csg_pillow_smooth.png

选择 pillow 节点,并将模式切换到 Subtraction;组合后的球体将在床垫上开一个洞。

../../_images/csg_pillow_hole.png

试着将 pillow 节点重新设置为根 Node3D 节点的父节点;这个洞会消失。

备注

这是为了说明CSG处理顺序的效果。由于根节点不是CSG节点,因此CSGCombiner3D节点是操作的结束;这展示了使用CSGCombiner3D来组织CSG场景。

观察效果后,撤消重新选择父节点。你搭建的床应如下所示:

../../_images/csg_bed.png

创建一个CSGCombiner3D,并将其命名为 lamp

一盏灯由三部分组成:灯座、灯杆和灯罩。创建一个 CSGCylinder3D,启用 Cone 选项并使其成为支架。创建另一个 CSGCylinder3D 并调整尺寸,将其用作灯杆使用。

../../_images/csg_lamp_pole_stand.png

我们将使用 CSGPolygon3D 来制作灯罩。使用CSGPolygon3D 的 Spin 模式,在前视图(小键盘 1)下绘制一个梯形,这个形状将围绕原点挤出,形成灯罩。

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

调整3个部分的位置,使其看起来像一盏灯。

../../_images/csg_lamp.png

创建一个CSGCombiner3D,并将其命名为 bookshelf

我们将为书架使用3个 CSGBox3D 节点。创建一个 CSGBox3D 并调整其大小,这将是书架的尺寸。

../../_images/csg_shelf_big.png

复制 CSGBox3D 并缩短每个轴的尺寸,并将模式改为 Subtraction(减去)。

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

你几乎已经建立了一个架子。再创建一个 CSGBox3D,把架子分成两层。

../../_images/csg_shelf.png

根据你的喜好将你的家具放在房间里,你的场景应该是这样的:

../../_images/csg_room_result.png

你已经成功地用 Godot 中的 CSG 工具制作了一个房间关卡的原型。CSG工具可以用于设计各种类型的关卡,如迷宫或城市;在设计游戏时探究它的局限性。

使用原型纹理

Godot的 标准 3D 材质与 ORM 3D 材质 支持 triplanar mapping (三平面映射), 可用于自动将纹理应用到任意对象而不失真。使用 CSG 时这很方便,因为 Godot 尚不支持在 CSG 节点上编辑 UV 贴图。三平面映射相对较慢,这通常限制其在地形等有机表面上的使用。尽管如此,在制作原型时,它仍可用于快速将纹理应用到基于 CSG 的关卡。

备注

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

有两种方法可以将材质应用到CSG节点:

  • 将其作为材质覆盖应用到 CSGCombiner3D 节点上(在检查器中的 Geometry > Material Override ),这将自动影响它的子节点,但能改变单个子节点的材质。

  • 将材质应用于单个节点( 材质 在(属性)检查器中). 这样, 每个CSG节点都可以有自己的外观. 减去CSG节点将把它们的材质应用到 “digging” 到的节点上.

要将三平面映射应用到 CSG 节点,请选中它,转到“检查器”,单击 Material Override(材质覆盖)旁的 [空] 字样(如果是单独的 CSG 节点则为 Material)。选择新建 SpatialMaterial3D。点击刚创建出来的材质图标来进行编辑。展开 Albedo 部分,为 Texture 属性加载一张纹理。现在再展开 Uv1 部分,勾选 Triplanar。可以用上面的 ScaleOffset 属性来调整纹理在各个方向上的缩放和偏移量。Scale 属性越大,纹理重复得越多。

小技巧

你可以复制一个 SpatialMaterial3D,以便在 CSG 节点中重复使用它。要做到这一点,在(属性)检查器中点击材质属性旁边的下拉箭头,然后选择 复制 。 要粘贴它,请选择要应用该材质的节点,单击其材质属性旁边的下拉箭头,然后选择 粘贴

导出为 glTF

使用 CSG 绘制关卡,然后将其导出为 3D 模型,以导入到 3D 建模软件中,这是非常有用的工作流程。你可以通过选择 场景 > 导出为…> glTF 2.0 场景 来执行此操作。

../../_images/export_as_gltf.webp