Transforms в Godot

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

Этот код означает: «Добавить вектор 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

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

три × 5 =

Прокрутить вверх