2D Transforms
В двумерном пространстве мы используем знакомую координатную плоскость X-Y. Помните, что в Godot, как и в большинстве приложений для компьютерной графики, ось Y направлена вниз:


Для начала рассмотрим этот космический корабль, парящий в пространстве:


Корабль направлен в ту же сторону, что и ось X. Если мы хотим, чтобы он двигался вперед, мы можем увеличить его координату X, и он переместится вправо:
position += Vector2(10, 0)
Но что произойдет, если корабль повернется?


Как теперь переместить корабль вперед? Если вы помните тригонометрию из школы, вы, возможно, начнете думать об углах, синусах и косинусах и делать что-то вроде position += Vector2(10 * cos(angle), 10 * sin(angle))
. Хотя это сработает, есть гораздо более удобный способ: Transform (трансформация).
Давайте снова посмотрим на повернутый корабль, но на этот раз представим, что у корабля есть свои собственные оси X и Y, которые он «носит» с собой, независимо от глобальных осей:


Эти «локальные» оси содержатся в трансформации объекта.
Зная это, мы можем переместить корабль вперед, двигая его вдоль его собственной оси X, и нам не нужно беспокоиться об углах и тригонометрических функциях. Чтобы сделать это в Godot, мы можем использовать свойство transform
, которое доступно для всех узлов, производных от Node2D.
position += transform.x * 10
Проверь свои знания в нашем бесплатном ТЕСТЕ по Godot! Узнай, насколько хорошо ты его знаешь!
Этот код означает: «Добавить вектор X из трансформации, умноженный на 10». Давайте разберем, что это значит. Трансформация содержит свойства x
и y
, которые представляют эти локальные оси. Это единичные векторы, то есть их длина равна 1. Другое название для единичного вектора — вектор направления. Они показывают, в каком направлении направлена ось X корабля. Затем мы умножаем на 10, чтобы увеличить расстояние.
Совет
Свойствоtransform
узла относительно его родительского узла. Если вам нужно получить глобальное значение, оно доступно вglobal_transform
.
Помимо локальных осей, трансформация также содержит компонент под названием origin
. Он представляет смещение, или изменение позиции.
На этой картинке синий вектор — это transform.origin
. Он равен вектору позиции объекта.


Преобразование между локальным и глобальным пространством
Вы можете преобразовать координаты из локального в глобальное пространство, применяя трансформацию. Для удобства Node2D и Spatial включают вспомогательные функции для этого: to_local()
и to_global()
:
var global_position = to_global(local_position)
Давайте воспользуемся примером объекта в 2D-плоскости и преобразуем щелчки мыши (в глобальном пространстве) в координаты относительно объекта:
extends Sprite
func _unhandled_input(event):
if event is InputEventMouseButton and event.pressed:
if event.button_index == BUTTON_LEFT:
printt(event.position, to_local(event.position))
3D Transforms
В 3D-пространстве идея преобразований работает так же, как и в 2D. На самом деле, она становится ещё более важной, так как использование углов в 3D может вызывать разные трудности, как мы увидим далее.
3D-узлы наследуются от базового узла Node3D
, который содержит информацию о преобразовании. 3D-преобразование требует больше данных, чем 2D-версия. Положение всё ещё хранится в свойстве origin, но вращение находится в свойстве basis, которое содержит три единичных вектора, представляющих локальные оси X, Y и Z объекта.
Когда вы выбираете 3D-узел в редакторе, появляется gizmo, позволяющий изменять преобразование.


Как и в 2D, мы можем использовать локальные оси для перемещения объекта вперёд. В ориентации Godot 3D (ось Y вверх) это означает, что по умолчанию ось -Z тела является направлением вперёд. Чтобы двигаться вперёд:
position += -transform.basis.z * speed * delta