3D 简介

创造一个 3D 游戏很有挑战性。那个多出来的的 Z 轴使许多有助于使 2D 游戏变得简单的常用技术不再起作用。为了帮助习惯这种转变,值得一提的是,Godot在2D和3D上使用了类似的API。大多数节点是相同的,并且存在 2D 和 3D 版本。事实上,可以看看 3D 平台游戏教程或 3D 运动学角色教程,它们大部分与2D对应教程相同。

在3D中, 数学比2D更复杂一些, 所以看看Wiki里的 向量数学 将有助于为有效开发3D游戏铺平道路(它是为游戏开发者, 而不是数学家或工程师, 特别创建的).

Node3D 节点

Node2D 是 2D 的基础节点。Control 是所有 GUI 的基础节点。同理,3D 引擎中的所有 3D 物体都使用 Node3D 节点。

../../_images/tuto_3d1.webp

Node3Ds have a local transform, which is relative to the parent node (as long as the parent node is also of or inherits from the type Node3D). This transform can be accessed as a 3×4 Transform3D, or as 3 Vector3 members representing location, Euler rotation (X, Y and Z angles) and scale.

../../_images/tuto_3d2.webp

3D 内容

与 2D 中加载图像内容和绘图都非常直观相比,3D 就有所不同,会稍微难一些。3D 内容需要使用特殊的 3D 工具(通常称为数字内容创建工具,Digital Content Creation 工具,简称 DCC)来创建,然后导出到某种交换文件格式,才能被 Godot 导入。这是因为 3D 格式的标准化不及图像。

手动制作的模型(使用 3D 建模软件)

有两条管线可以导入 3D 模型到 Godot 中。第一个也是最常见的一个,是通过 导入 3D 场景 , 它允许导入整个场景(就像它们在DCC中看起来的那样),包括动画,骨架绑定,混合形状等。

第二条管线是通过导入简单的 .OBJ 文件作为网格资源,然后将其放入 MeshInstance3D 节点中显示。

生成的几何体

通过直接使用 Mesh 资源可以创建自定义几何体。只需创建数组并使用 ArrayMesh.add_surface_from_arrays() 函数即可。也可以使用辅助类 SurfaceTool,它提供了一个更直接的 API 和帮助工具,用于索引、生成法线、切线等。

在任何情况下, 这种方法都是为了用于生成静态几何体(不会经常更新的模型), 因为创建顶点数组并将它们提交给3D API具有显著的性能开销.

即时几何体

相反,如果你需要生成经常更新的简单几何体,Godot 提供了一种特殊的 ImmediateMesh 资源,它可以在 MeshInstance3D 节点中使用。这提供了 OpenGL 1.x 风格的即时模式 API 来创建点、线、三角形等。

3D 中的 2D

虽然Godot包装了强大的2D引擎, 但许多类型的游戏会使用在3D环境中的2D效果. 通过使用不旋转的固定相机(正交或透视), 可以使用诸如 Sprite3DAnimatedSprite3D 等节点来创建混合了具有3D背景, 更逼真的视差, 灯光/阴影效果等的2D游戏.

当然, 缺点在于与普通2D相比增加了复杂性并降低了与普通2D 相比的性能, 以及缺乏进行像素工作时的参考.

环境

除了编辑场景之外, 编辑环境通常也很常见. Godot提供了一个 WorldEnvironment 节点, 该节点允许更改背景颜色, 模式(就像放一个天空盒时那样)以及应用多种内置处理后效果. 环境可以在Camera中被覆写.

3D 视口

编辑 3D 场景可以在 3D 选项卡中完成。该选项卡可以手动选择,但在选择 Node3D 节点时将自动启用。

../../_images/tuto_3d3.webp

默认的3D场景导航控制类似于Blender(旨在在自由软件工作流程中具有某种一致性), 但在编辑器设置中也包含了自定义鼠标按钮和行为使其看上去像其他工具的选项:

../../_images/tuto_3d4.webp

坐标系

Godot 在 3D 中使用的都是公制,1 个单位等于 1 米。物理和其他区域都为此而调整过。因此,试图使用不同的比例通常是一个坏主意(除非你知道你在做什么)。

使用 3D 资产时,最好始终使用正确的比例(在 3D 建模软件中将单位设置为公制)。Godot 允许在导入后缩放,尽管在大多数时都没问题,但在极少数情况下,会在渲染或物理等敏感区域带来浮点精度问题(从而导致故障或伪影)。所以,确保你的艺术家始终在正确的比例下进行创作!

Y 坐标用于“向上”。至于水平 X/Z 轴,Godot 使用 右手 坐标系。这意味着对于大多数需要对齐的对象(例如灯光或相机),Z 轴被用作“指向”方向。这个约定的大致意思是:

  • X 是两边

  • Y 是上/下

  • Z 是前/后

有关与其他 3D 软件的比较,请参阅此图表:

3D坐标系比较图表

图像来自 Freya Holmér

空间与操纵小工具

在 3D 视图中移动物体是通过操纵器小工具完成的。每个轴用一种颜色表示:红、绿、蓝分别代表 X、Y、Z。这种惯例也适用于网格和其他小工具(也适用于着色器语言、Vector3、Color 等组件的顺序)。

../../_images/tuto_3d5.webp

一些有用的键盘绑定:

  • 在移动, 缩放或旋转时, 按 Ctrl 键, 可进行吸附放置或旋转.

  • 要将视图集中在所选对象上, 按 F.

使用 Blender 风格的变换快捷键

从 Godot 4.2 开始,可以启用 Blender 风格的快捷键来平移、旋转和缩放节点。在 Blender 中,这些快捷键分别是:

  • G 用于平移

  • R 用于旋转

  • S 用于缩放

在聚焦于 3D 编辑器视口的同时,按下快捷键,可以移动鼠标或输入数字以将选定节点移动指定的 3D 单位量。你可以通过用字母指定特定的轴,然后指定距离(如果使用键盘来输入值),以此来将选中节点的平移限制到特定的轴上。

例如,要将选中物体向上移动 2.5 个单位,请按顺序输入以下序列(Y+ 在 Godot 中是向上,也就是延 Y 轴正方向):

G-Y-2-.-5-Enter

如果要在 Godot 中使用 Blender 风格的变换快捷键,请转到编辑器设置的 快捷键 选项卡,然后在 Spatial Editor 部分中进行以下调整:

  • 开始平移转换 绑定到 G。

  • 开始旋转变换 绑定到 R。

  • 开始缩放转换 绑定到 S。

  • 最后,取消 缩放模式 快捷键的绑定,使其快捷键不会与 开始旋转变换 冲突。

视图菜单

视图选项由视口工具栏中的“视图”菜单控制。

../../_images/tuto_3d6.webp

你可以通过这个菜单在编辑器的 3D 视图中隐藏小工具:

../../_images/tuto_3d6_1.webp

要隐藏特定类型的小工具,你可以在“视图”菜单中把它们切换掉。

../../_images/tuto_3d6_2.webp

preview environment and light

By default, any 3D scene that doesn’t have a WorldEnvironment node, or a DirectionalLight3D, will have a preview turned on for what it’s missing to light the scene.

这个预览光线只会在编辑器中的场景中显示。如果运行这个场景或导出项目,它们就不会再出现在场景中。

环境/光可以通过点击黄色方框中的两个蓝色图标,来打开/关闭预览。右边三个点有一些参数,用来调整环境/光的属性。

../../_images/tuto_3d8.webp

同一个项目中,不同的场景使用的是相同的预览太阳和预览环境。因此,在这里作出的调整应该适合所有需要预览灯光和预览环境的场景。

相机

无论在 3D 空间中放置多少物体,除非在场景中添加了 Camera3D,否则不会显示任何内容。相机可以在正交或透视投影中工作:

../../_images/tuto_3d10.webp

摄像机与父视口或其祖先视口相关联, 且仅显示到他们上面. 由于场景树的根是一个视口, 默认情况下会在其上显示摄像机, 但如果需要子视口(作为渲染目标或画中画), 则需要自己的子摄像头才能显示.

../../_images/tuto_3d11.png

处理多台摄像机时, 每个视口都遵循以下规则:

  • 如果场景树中没有摄像机,则第一个进入的摄像机将成为活跃摄像机。进入场景的其他摄像机将被忽略(除非它们被设置为 current)。

  • 如果相机设置了“current”属性,则无论场景中是否有其他相机,都会使用它。如果该属性已设置,它将变为活动状态,取代之前的摄像机。

  • 如果活动摄像机离开了场景树,则按树形顺序排列的第一台摄像机将取代它。

灯光

背景环境发出一些出现在表面上的环境光。然而,如果场景中没有任何光源,除非背景环境非常明亮,否则场景会显得很暗。

大多数室外场景都有平行光(如太阳或月亮),而室内场景通常有多个位置光(如灯、手电筒等)。 有关在 Godot 中设置灯光的更多信息,请参阅 3D 灯光和阴影