CSG的原型设计水平

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

CSG在Godot中的目的是将其用于关卡原型设计。 该技术允许用户通过组合基元来创建最常见形状的简单版本。 可以使用反转基元创建室内环境。

注解

Godot中的CSG节点主要用于原型设计。没有内置的对UV贴图或编辑3D多边形的支持(尽管挤出的2D多边形可以用CSGPolygon节点来使用)。

如果你正在为一个项目寻找一个简单易用的关卡设计工具,你可能会想使用`Qodot <https://github.com/Shfty/qodot-plugin>`__来代替。它可以让你使用`TrenchBroom <https://kristianduske.com/trenchbroom/>`__设计关卡,并在Godot中导入它们。

../../_images/csg.gif

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

:ref:`CSGPolygon <class_CSGPolygon>`节点以下列方式沿着以2D(X,Y坐标)绘制的多边形挤出:

  • Depth: [深度]挤出一定量。

  • Spin: [旋转]围绕原点旋转时挤出。

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

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

注解

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

自定义网格

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

  • 它必须被关闭,

  • 它不能自我相交,

  • 它不能包含内部面,

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

../../_images/csg_custom_mesh.png

CSGCombiner

:ref:`CSGCombiner <class_CSGCombiner>`节点是一个用于组织的空形状,它只会合并子节点。

处理顺序

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

注解

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

原型设计

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

小技巧

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

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

  • 一个房间,

  • 一张床,

  • 一盏灯,

  • 一张桌子,

  • 一个书架。

使用Spatial节点作为根节点创建场景。

小技巧

环境的默认光照在某些角度不能提供清晰的阴影。使用3D视图菜单中的 Display Overdraw [显示透视]改变显示模式,或者添加一个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节点只会在组合内处理它们的操作。因此,CSGCombiners[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 [枕头]节点,并将模式切换到 减法 ;组合后的球体将在床垫上开一个洞。

../../_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

我们将使用CSGP多边形来制作灯罩。使用 Spin 模式,在 Front View (数字键盘1)下绘制一个 trapezoid [梯形],这个形状将围绕原点挤出,形成灯罩。

../../_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的:ref:`doc_spatial_material`支持*triplanar mapping*,它可以用来自动将纹理应用到任意对象上,而不会发生变形。这在使用CSG时很方便,因为Godot还不支持在CSG节点上编辑UV贴图。三面贴图的速度相对较慢,这通常限制了它的使用,比如地形等有机表面。不过,在原型设计时,还是可以用它来快速将纹理应用到基于CSG的关卡上。【CSG:构造实体几何(Constructive Solid Geometry)的简写】

注解

如果你需要一些原型的图片,Kenney做了一套`CC0授权的原型图片<https://kenney.nl/assets/prototype-textures>`__。

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

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

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

要将三平面贴图应用到CSG节点,请选中它,转到 "(属性)检查器",单击**材料重写**旁边的**[空]**文本(或针对单个CSG节点的**材质**)。选择**新建空间材质**。单击新创建的材质的图标,对其进行编辑。展开**Albedo**部分,将纹理加载到**Texture**属性中。现在,展开**Uv1**部分并选中**Triplanar**。您可以通过上面的 ScaleOffset 属性来改变每个轴上的纹理偏移和比例。在**Scale**属性中,较高的值将导致纹理更频繁地重复。

小技巧

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