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

../../_images/tuto_3d2.png

3D 内容

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

DCC创建的模型

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

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

生成的几何体

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

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

即时几何体

相反, 如果需要生成会经常更新的简单几何体,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 中使用的都是公制,1 个单位等于 1 米。物理和其他区域都为此而调整过。因此,试图使用不同的比例通常是一个坏主意(除非你知道你在做什么)。

使用 3D 素材时,最好使用正确的比例(将 DCC 设置为公制)。Godot 允许在导入后缩放,尽管在大多数时都没问题,但在极少数情况下,会在渲染或物理等敏感区域带来浮点精度问题(带来毛刺或失真)。所以,请确保你的渲染总是在正确的比例下工作!

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

  • X 是两边

  • Y 是上/下

  • Z 是前/后

空间和操纵辅助线框

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

../../_images/tuto_3d5.png

一些有用的键盘绑定:

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

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

视图菜单

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

../../_images/tuto_3d6.png

你可以通过这个菜单在编辑器的3D视图中隐藏辅助线框:

../../_images/tuto_3d6_1.png

要隐藏特定类型的辅助线框, 你可以在 “视图” 菜单中把它们切换掉.

../../_images/tuto_3d6_2.png

默认环境

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

../../_images/tuto_3d8.png

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

相机

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

../../_images/tuto_3d10.png

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

../../_images/tuto_3d11.png

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

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

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

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

灯光

Godot的每个网格最多限制8个灯. 除此之外, 在Godot中, 对灯的数量和灯的类型都没有限制. 在性能允许的情况下, 可以根据需要, 添加任意数量的灯, 而单个网格上照射的灯不超过8盏.