Введение в 3D

Создание 3D игры может быть трудоемким. Дополнительная Z координата делает многие обычные техники для создания 2D игр неработоспособными. Для помощи в этом переходе, стоит упомянуть что Godot использует похожие API для 2D и 3D. Большинство узлов одинаковые и представлены в 2D и 3D версиях. На самом деле, стоит проверить пример с 3D платформером, или примеры с кинематикой 3D персонажей, чтобы убедиться что они почти идентичны с их 2D версиями.

В 3D, математика немного более сложная чем в 2D, так что мы рекомендуем посмотреть статью Векторная алгебра (которая была создана для разработчиков игр, а не математиков или инженеров) которая поможет вам создавать 3D игры эффективно.

Узел Spatial

Node2D это базовый узел для 2D. Control базовый узел для GUI. Следуя той же логике, движок 3D использует Spatial для всего 3D.

../../_images/tuto_3d1.png

Spatial узлы имеют локальную трансформацию, относительно родительского узла (пока родительский узел также наследуется от типа Spatial). Эта трансформация может быть доступна как 4x3 Transform, или как 3 Vector3 члена представляющие позицию, вращение по Эйлеру (x, y и z углы) и масштаб.

../../_images/tuto_3d2.png

3D content

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 (usually referred to as DCCs) and exported to an exchange file format in order to be imported in Godot (3D formats are not as standardized as images).

DCC-created models

There are two pipelines to import 3D models in Godot. The first and most common one is by Importing 3D scenes, which allows you to import entire scenes (just as they look in the DCC), 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 MeshInstance node for display.

Генерация геометрии

Возможно создание пользовательской геометрии используя ресурс ArrayMesh напрямую. Просто создавайте ваши массивы и используйте функцию ArrayMesh.add_surface_from_arrays(). Существует вспомогательный класс SurfaceTool, который предоставляет более простой API и вспомогательные функции для индексации, генерации нормалей, тангенсов, итд.

В любом случае, этот метод предназначен для генерации статичной геометрии (модели которая не будет обновляться часто), так как создание массивов вершин и передача их в 3D API несет существенные затраты в производительности.

Immediate geometry

If, instead, there is a requirement to generate simple geometry that will be updated often, Godot provides a special node, ImmediateGeometry, which provides an OpenGL 1.x style immediate-mode API to create points, lines, triangles, etc.

2D в 3D

While Godot packs a powerful 2D engine, many types of games use 2D in a 3D environment. By using a fixed camera (either orthogonal or perspective) that does not rotate, nodes such as Sprite3D and AnimatedSprite3D can be used to create 2D games that take advantage of mixing with 3D backgrounds, more realistic parallax, lighting/shadow effects, etc.

The disadvantage is, of course, that added complexity and reduced performance in comparison to plain 2D, as well as the lack of reference of working in pixels.

Окружение

Besides editing a scene, it is often common to edit the environment. Godot provides a WorldEnvironment node that allows changing the background color, mode (as in, put a skybox), and applying several types of built-in post-processing effects. Environments can also be overridden in the Camera.

3D viewport

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

../../_images/tuto_3d3.png

Default 3D scene navigation controls are similar to Blender (aiming to have some sort of consistency in the free software pipeline..), but options are included to customize mouse buttons and behavior to be similar to other tools in the Editor Settings:

../../_images/tuto_3d4.png

Система координат

Godot использует `метрическую<https://en.wikipedia.org/wiki/Metric_system>`__ систему для всего. 3D Физика и прочие области настроены на нее, так что попытка использовать другую размерность обычно плохая идея (если вы точно не уверены что делаете).

Во время работы с 3D ассетами, всегда лучше использовать правильный масштаб (установите ваш DCC на метры). Godot позволяет масштабировать их после импорта , это работает в большинстве случаев, но изредка могут случаться сбои вычислений плавающей точки (и от них, глюки и артефакты) в определенных областях, таких как отображение или физика, так что убедитесь что ваши художники всегда работают в правильном масштабе!

Координата Y используется как «вверх», тогда как для многих объектов которые нуждаются в выравнивании (таких как свет, камеры, капсульный коллайдер, машина, итд.), ось Z используется как «указатель на» направление. Это соглашение примерно означает что:

  • X это влево/вправо
  • Y это вверх/вниз
  • Z это вперед/назад

Space and manipulation gizmos

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

Some useful keybindings:

  • To snap placement or rotation, press the «s» key while moving, scaling or rotating.
  • To center the view on the selected object, press the «f» key.

View menu

The view options are controlled by the «View» menu in the viewport’s toolbar.

../../_images/tuto_3d6.png

You can hide the gizmos in the 3D view of the editor through this menu:

../../_images/tuto_3d6_1.png

To hide a specific type of gizmos, you can toggle them off in the «View» menu.

../../_images/tuto_3d6_2.png

Default environment

When created from the Project Manager, the 3D environment has a default sky.

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

Cameras

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

../../_images/tuto_3d10.png

Cameras are associated with (and only display to) a parent or grandparent viewport. Since the root of the scene tree is a viewport, cameras will display on it by default, but if sub-viewports (either as render target or picture-in-picture) are desired, they need their own children cameras to display.

../../_images/tuto_3d11.png

When dealing with multiple cameras, the following rules are enforced for each viewport:

  • If no cameras are present in the scene tree, the first one that enters it will become the active camera. Further cameras entering the scene will be ignored (unless they are set as current).
  • If a camera has the «current» property set, it will be used regardless of any other camera in the scene. If the property is set, it will become active, replacing the previous camera.
  • If an active camera leaves the scene tree, the first camera in tree-order will take its place.

Lights

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).