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.

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 节点。

备注

请注意,从 Godot 4 开始,“Spatial”节点现在称为“Node3D”。任何 Godot 3.x 中提到的“Spatial”节点都是指 Godot 4 中的“Node3D”。

../../_images/tuto_3d1.png

Node3D 有一个局部变换,它是相对于父节点而言的(只要父节点也是 或继承自 Node3D 类型)。这个变换可以作为 4×3 的 Transform3D 形式访问,也可以以 3 个 Vector3 成员的形式访问,分别代表位置、欧拉旋转(X、Y、Z 角度)和缩放。

../../_images/tuto_3d2.png

3D 内容

Unlike 2D, where loading image content and drawing is straightforward, 3D is a little more difficult. The content needs to be created with special 3D tools (also called Digital Content Creation tools, or DCCs) and exported to an exchange file format to be imported in Godot. This is required since 3D formats are not as standardized as images.

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

There are two pipelines to import 3D models in Godot. The first and most common one is by 导入 3D 场景, which allows you to import entire scenes (exactly as they look in the 3D modeling software), including animation, skeletal rigs, blend shapes, etc.

The second pipeline is by importing simple .OBJ files as mesh resources, which can be then put inside a MeshInstance3D node for display.

生成的几何体

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

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

即时几何体

If, instead, you need to generate simple geometry that will be updated often, Godot provides a special ImmediateMesh resource that can be used in a MeshInstance3D node. This provides an OpenGL 1.x-style immediate-mode API to create points, lines, triangles, etc.

3D 中的 2D

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

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

环境

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

3D 视口

Editing 3D scenes is done in the 3D tab. This tab can be selected manually, but it will be automatically enabled when a Node3D node is selected.

../../_images/tuto_3d3.png

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

../../_images/tuto_3d4.png

坐标系

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

When working with 3D assets, it's always best to work in the correct scale (set the unit to metric in your 3D modeling software). Godot allows scaling post-import and, while this works in most cases, in rare situations it may introduce floating-point precision issues (and thus, glitches or artifacts) in delicate areas such as rendering or physics. Make sure your artists always work in the right scale!

The Y coordinate is used for "up". As for the horizontal X/Z axes, Godot uses a right-handed coordinate system. This means that for most objects that need alignment (such as lights or cameras), the Z axis is used as a "pointing towards" direction. This convention roughly means that:

  • X 是两边

  • Y 是上/下

  • Z 是前/后

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

3D坐标系比较图表

图像来自 Freya Holmér

空间与操纵小工具

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

../../_images/tuto_3d5.png

一些有用的键盘绑定:

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

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

Using Blender-style transform shortcuts

Since Godot 4.2, you can enable Blender-style shortcuts for translating, rotating and scaling nodes. In Blender, these shortcuts are:

  • G for translating

  • R for rotating

  • S for scaling

After pressing a shortcut key while focusing on the 3D editor viewport, move the mouse or enter a number to move the selected node(s) by the specified amount in 3D units. You can constrain movement to a specific axis by specifying the axis as a letter, then the distance (if entering a value with the keyboard).

For instance, to move the selection upwards by 2.5 units, enter the following sequence in order (Y+ is upwards in Godot):

G-Y-2-.-5-Enter

To use Blender-style transform shortcuts in Godot, go to the Editor Settings' Shortcuts tab, then in the Spatial Editor section:

  • Bind Begin Translate Transformation to G.

  • Bind Begin Rotate Transformation to R.

  • Bind Begin Scale Transformation to S.

  • Finally, unbind Scale Mode so that its shortcut won't conflict with Begin Rotate Transformation.

视图菜单

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

../../_images/tuto_3d6.png

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

../../_images/tuto_3d6_1.png

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

../../_images/tuto_3d6_2.png

默认环境

从项目管理器中创建时,3D环境具有默认的天空.

../../_images/tuto_3d8.png

Given how physically-based rendering works, it is advised to always try to work with a default environment in order to provide indirect and reflected light to your objects.

相机

No matter how many objects are placed in the 3D space, nothing will be displayed unless a Camera3D is also added to the scene. Cameras can work in either orthogonal or perspective projections:

../../_images/tuto_3d10.png

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

../../_images/tuto_3d11.png

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

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

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

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

灯光

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

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