3D简介

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

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

Spatial(空间)节点

Node2D 是2D的基本节点。 Control 是所有GUI的基本节点。 按照这个逻辑,3D引擎中的所有3D物体使用 Spatial 节点。

../../_images/tuto_3d1.png

Spatial nodes 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 Spatial). This transform can be accessed as a 4×3 Transform, or as 3 Vector3 members representing location, Euler rotation (X, Y and Z angles) and scale.

../../_images/tuto_3d2.png

3D内容

与2D中加载图像内容和绘图非常简单的情况不同, 3D更难一些。3D内容需要使用特殊的3D工具(通常称为DCC)创造,并导出为交换文件格式以导入Godot(3D格式不像图像那样标准化)。

DCC创建的模型

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

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

生成的几何体

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

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

Immediate geometry (即时几何体)

相反,如果需要生成会经常更新的简单几何体,Godot会提供一个特殊节点 ImmediateGeometry ,它会提供OpenGL 1.x风格的即时模式API来创建点,线 ,三角形等。

3D环境下的2D

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

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

环境

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

3D 视口

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

../../_images/tuto_3d3.png

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

../../_images/tuto_3d4.png

坐标系统

Godot使用 公制 系统来处理所有事情。 3D物理和其他部分都为此而调整,所以试图使用不同的缩放比例通常是一个坏主意(除非你知道你在做什么)。

When working with 3D assets, it's always best to work in the correct scale (set your DCC to metric). 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, so make sure your artists always work in the right scale!

Y坐标用于"向上",但对于大多数需要对齐的物体(如灯光,摄像机,胶囊碰撞体,载具等),Z轴用作"指向"方向。 这个约定大致意味着:

  • X 是两边
  • Y 是上/下
  • Z 是前/后

空间和操纵控件

Moving objects in the 3D view is done through the manipulator gizmos. Each axis is represented by a color: Red, Green, Blue represent X, Y, Z respectively. This convention applies to the grid and other gizmos too (and also to the shader language, ordering of components for Vector3, Color, etc.).

../../_images/tuto_3d5.png

一些有用的键盘绑定:

  • To snap placement or rotation, press Ctrl while moving, scaling or rotating.
  • To center the view on the selected object, press F.

视图菜单

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

../../_images/tuto_3d6.png

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

../../_images/tuto_3d6_1.png

要隐藏特定类型的控件,你可以在“视图”菜单中将其关闭。

../../_images/tuto_3d6_2.png

默认环境

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

../../_images/tuto_3d8.png

鉴于基于物理的渲染工作方式,建议总是使用一个默认环境,以便为对象提供间接和反射光。

相机

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

../../_images/tuto_3d10.png

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

../../_images/tuto_3d11.png

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

  • 如果场景树中没有摄像机,则第一个进入的摄像机将成为活跃摄像机。 进入场景的其他摄像机将被忽略(除非它们被设置为 current )。
  • 如果相机设置了" current "属性,则无论场景中是否有其他相机,都会使用它。 如果该属性已设置,它将变为活动状态,取代之前的摄像头。
  • 如果活动摄像机离开场景树,则按树形顺序排列的第一台摄像机将取代它。

灯光

Godot has a limit of up to 8 lights per mesh. Aside from that, there is no limitation on the number of lights, nor of types of lights, in Godot. As many as desired can be added, as long as performance allows, and no more than 8 lights shine on a single mesh.