Transform2D

Матрица 2×3, представляющая двумерное преобразование.

Описание

Встроенный тип Variant Transform2D — это матрица 2×3, представляющая преобразование в двумерном пространстве. Она содержит три значения Vector2: x, y и origin. Вместе они могут представлять перемещение, вращение, масштаб и наклон.

Оси x и y образуют матрицу 2×2, известную как базис преобразования. Длина каждой оси (Vector2.length()) влияет на масштаб преобразования, а направление всех осей влияет на вращение. Обычно обе оси перпендикулярны друг другу. Однако при повороте одной оси по отдельности преобразование становится перекошенным. Применение перекошенного преобразования к двумерному спрайту приведет к искажению спрайта.

Для общего введения см. Матрицы и преобразования учебник.

Примечание: В отличие от Transform3D, нет 2D-эквивалента типу Basis. Все упоминания «basis» относятся к компонентам x и y Transform2D.

Примечание

Существуют заметные различия при использовании данного API с C#. Подробнее см. API различия C# и GDScript.

Обучающие материалы

Свойства

Vector2

origin

Vector2(0, 0)

Vector2

x

Vector2(1, 0)

Vector2

y

Vector2(0, 1)

Конструкторы

Transform2D

Transform2D()

Transform2D

Transform2D(from: Transform2D)

Transform2D

Transform2D(rotation: float, position: Vector2)

Transform2D

Transform2D(rotation: float, scale: Vector2, skew: float, position: Vector2)

Transform2D

Transform2D(x_axis: Vector2, y_axis: Vector2, origin: Vector2)

Методы

Transform2D

affine_inverse() const

Vector2

basis_xform(v: Vector2) const

Vector2

basis_xform_inv(v: Vector2) const

float

determinant() const

Vector2

get_origin() const

float

get_rotation() const

Vector2

get_scale() const

float

get_skew() const

Transform2D

interpolate_with(xform: Transform2D, weight: float) const

Transform2D

inverse() const

bool

is_conformal() const

bool

is_equal_approx(xform: Transform2D) const

bool

is_finite() const

Transform2D

looking_at(target: Vector2 = Vector2(0, 0)) const

Transform2D

orthonormalized() const

Transform2D

rotated(angle: float) const

Transform2D

rotated_local(angle: float) const

Transform2D

scaled(scale: Vector2) const

Transform2D

scaled_local(scale: Vector2) const

Transform2D

translated(offset: Vector2) const

Transform2D

translated_local(offset: Vector2) const

Операторы

bool

operator !=(right: Transform2D)

PackedVector2Array

operator *(right: PackedVector2Array)

Rect2

operator *(right: Rect2)

Transform2D

operator *(right: Transform2D)

Vector2

operator *(right: Vector2)

Transform2D

operator *(right: float)

Transform2D

operator *(right: int)

Transform2D

operator /(right: float)

Transform2D

operator /(right: int)

bool

operator ==(right: Transform2D)

Vector2

operator [](index: int)


Константы

IDENTITY = Transform2D(1, 0, 0, 1, 0, 0) 🔗

Тождество Transform2D. Это преобразование без перемещения, без вращения и масштабом Vector2.ONE. Это также означает, что:

var transform = Transform2D.IDENTITY
print("| X | Y | Origin")
print("| %.f | %.f | %.f" % [transform.x.x, transform.y.x, transform.origin.x])
print("| %.f | %.f | %.f" % [transform.x.y, transform.y.y, transform.origin.y])
# Prints:
# | X | Y | Origin
# | 1 | 0 | 0
# | 0 | 1 | 0

Если Vector2, Rect2, PackedVector2Array или другой Transform2D преобразуется (умножается) этой константой, то преобразование не происходит.

Примечание: В GDScript эта константа эквивалентна созданию Transform2D без каких-либо аргументов. Ее можно использовать для того, чтобы сделать ваш код более понятным и для согласованности с C#.

FLIP_X = Transform2D(-1, 0, 0, 1, 0, 0) 🔗

Когда любое преобразование умножается на FLIP_X, оно инвертирует все компоненты оси x (столбец X).

Когда FLIP_X умножается на любое преобразование, оно инвертирует компонент Vector2.x всех осей (строка X).

FLIP_Y = Transform2D(1, 0, 0, -1, 0, 0) 🔗

Когда любое преобразование умножается на FLIP_Y, оно инвертирует все компоненты оси y (столбец Y).

Когда FLIP_Y умножается на любое преобразование, оно инвертирует компонент Vector2.y всех осей (строка Y).


Описания свойств

Vector2 origin = Vector2(0, 0) 🔗

Смещение перевода этого преобразования и столбец 2 матрицы. В двумерном пространстве это можно рассматривать как позицию.


Vector2 x = Vector2(1, 0) 🔗

Ось X базиса преобразования и столбец 0 матрицы. В сочетании с y это представляет поворот, масштаб и наклон преобразования.

В тождественном преобразовании этот вектор указывает вправо (Vector2.RIGHT).


Vector2 y = Vector2(0, 1) 🔗

Ось Y базиса преобразования и столбец 1 матрицы. В сочетании с x это представляет поворот, масштаб и наклон преобразования.

В тождественном преобразовании этот вектор указывает вниз (Vector2.DOWN).


Описания конструктора

Transform2D Transform2D() 🔗

Создает Transform2D, идентичный IDENTITY.

Примечание: В C# это создает Transform2D, все компоненты которого установлены в Vector2.ZERO.


Transform2D Transform2D(from: Transform2D)

Создает Transform2D как копию заданного Transform2D.


Transform2D Transform2D(rotation: float, position: Vector2)

Создает Transform2D по заданному углу (в радианах) и положению.


Transform2D Transform2D(rotation: float, scale: Vector2, skew: float, position: Vector2)

Создает Transform2D по заданному углу (в радианах), масштабу, наклону (в радианах) и положению.


Transform2D Transform2D(x_axis: Vector2, y_axis: Vector2, origin: Vector2)

Создает Transform2D из 3 значений Vector2, представляющих x, y и origin (три столбца матрицы).


Описания метода

Transform2D affine_inverse() const 🔗

Возвращает инвертированную версию этого преобразования. В отличие от inverse(), этот метод работает практически с любым базисом, включая неравномерные, но медленнее.

Примечание: Чтобы этот метод возвращал правильно, базис преобразования должен иметь определитель, который не равен в точности 0.0 (см. determinant()).


Vector2 basis_xform(v: Vector2) const 🔗

Возвращает копию вектора v, преобразованного (умноженного) на матрицу базиса преобразования. В отличие от оператора умножения (*), этот метод игнорирует origin.


Vector2 basis_xform_inv(v: Vector2) const 🔗

Возвращает копию вектора v, преобразованного (умноженного) на матрицу базиса обратного преобразования (см. inverse()). Этот метод игнорирует origin.

Примечание: Этот метод предполагает, что базис этого преобразования является ортонормальным (см. orthonormalized()). Если базис не является ортонормальным, вместо него следует использовать transform.affine_inverse().basis_xform(vector) (см. affine_inverse()).


float determinant() const 🔗

Возвращает определитель матрицы этого базиса преобразования. Для продвинутой математики это число может использоваться для определения нескольких атрибутов:

  • Если определитель равен точно 0.0, базис необратим (см. inverse()).

  • Если определитель — отрицательное число, базис представляет собой отрицательный масштаб.

Примечание: Если масштаб базиса одинаков для каждой оси, его определитель всегда равен этому масштабу в степени 2.


Vector2 get_origin() const 🔗

Возвращает перевод этого преобразования. Эквивалентно origin.


float get_rotation() const 🔗

Возвращает поворот этого преобразования (в радианах). Это эквивалентно углу x (см. Vector2.angle()).


Vector2 get_scale() const 🔗

Возвращает длину x и y как Vector2. Если основа этого преобразования не перекошена, это значение является коэффициентом масштабирования. Оно не зависит от вращения.

var my_transform = Transform2D(
    Vector2(2, 0),
    Vector2(0, 4),
    Vector2(0, 0)
)
# Поворот Transform2D любым способом сохраняет его масштаб.
my_transform = my_transform.rotated(TAU / 2)

print(my_transform.get_scale()) # Prints (2.0, 4.0)

Примечание: Если значение, возвращаемое determinant(), отрицательное, масштаб также будет отрицательным.


float get_skew() const 🔗

Возвращает наклон данного преобразования (в радианах).


Transform2D interpolate_with(xform: Transform2D, weight: float) const 🔗

Возвращает результат линейной интерполяции между этим преобразованием и xform по заданному weight.

weight должен быть между 0.0 и 1.0 (включительно). Значения вне этого диапазона разрешены и могут использоваться для выполнения экстраполяции.


Transform2D inverse() const 🔗

Возвращает инвертированную версию этого преобразования.

Примечание: Чтобы этот метод возвращал правильно, базис преобразования должен быть ортонормальным (см. orthonormalized()). Это означает, что базис должен представлять только поворот. Если это не так, используйте вместо этого affine_inverse().


bool is_conformal() const 🔗

Возвращает true, если базис этого преобразования конформный. Конформный базис является как ортогональным (оси перпендикулярны друг другу), так и равномерным (оси имеют одинаковую длину). Этот метод может быть особенно полезен при физических расчетах.


bool is_equal_approx(xform: Transform2D) const 🔗

Возвращает true, если это преобразование и xform приблизительно равны, путем запуска @GlobalScope.is_equal_approx() для каждого компонента.


bool is_finite() const 🔗

Возвращает true, если это преобразование конечно, вызывая @GlobalScope.is_finite() для каждого компонента.


Transform2D looking_at(target: Vector2 = Vector2(0, 0)) const 🔗

Возвращает копию преобразования, повернутую таким образом, что повернутая ось X указывает на позицию target в глобальном пространстве.


Transform2D orthonormalized() const 🔗

Возвращает копию этого преобразования с ортонормированным базисом. Ортонормированный базис является как ортогональным (оси перпендикулярны друг другу), так и нормализованным (оси имеют длину 1.0), что также означает, что он может представлять только поворот.


Transform2D rotated(angle: float) const 🔗

Возвращает копию этого преобразования, повернутую на заданный angle (в радианах).

Если angle положительно, преобразование поворачивается по часовой стрелке.

Этот метод является оптимизированной версией умножения заданного преобразования X на соответствующее преобразование поворота R слева, т. е. R * X.

Это можно рассматривать как преобразование относительно глобального/родительского кадра.


Transform2D rotated_local(angle: float) const 🔗

Возвращает копию преобразования, повернутую на заданный angle (в радианах).

Этот метод является оптимизированной версией умножения заданного преобразования X на соответствующее преобразование поворота R справа, т. е. X * R.

Это можно рассматривать как преобразование относительно локального кадра.


Transform2D scaled(scale: Vector2) const 🔗

Возвращает копию преобразования, масштабированную заданным коэффициентом scale.

Этот метод является оптимизированной версией умножения заданного преобразования X на соответствующее масштабирующее преобразование S слева, т. е. S * X.

Это можно рассматривать как преобразование относительно глобального/родительского кадра.


Transform2D scaled_local(scale: Vector2) const 🔗

Возвращает копию преобразования, масштабированную заданным коэффициентом scale.

Этот метод является оптимизированной версией умножения заданного преобразования X на соответствующее масштабирующее преобразование S справа, т. е. X * S.

Это можно рассматривать как преобразование относительно локального кадра.


Transform2D translated(offset: Vector2) const 🔗

Возвращает копию преобразования, переведенную на заданное offset.

Этот метод является оптимизированной версией умножения заданного преобразования X на соответствующее преобразование перевода T слева, т. е. T * X.

Это можно рассматривать как преобразование относительно глобального/родительского фрейма.


Transform2D translated_local(offset: Vector2) const 🔗

Возвращает копию преобразования, переведенную на заданное offset.

Этот метод является оптимизированной версией умножения заданного преобразования X на соответствующее преобразование перевода T справа, т. е. X * T.

Это можно рассматривать как преобразование относительно локального фрейма.


Описания оператора

bool operator !=(right: Transform2D) 🔗

Возвращает true, если компоненты обоих преобразований не равны.

Примечание: Из-за ошибок точности с плавающей точкой рассмотрите возможность использования is_equal_approx() вместо этого, что более надежно.


PackedVector2Array operator *(right: PackedVector2Array) 🔗

Преобразует (умножает) каждый элемент Vector2 заданного PackedVector2Array на эту матрицу преобразования.

На больших массивах эта операция выполняется намного быстрее, чем преобразование каждого Vector2 по отдельности.


Rect2 operator *(right: Rect2) 🔗

Преобразует (умножает) Rect2 на эту матрицу преобразования.


Transform2D operator *(right: Transform2D) 🔗

Преобразует (умножает) это преобразование на преобразование right.

Это операция, выполняемая между родительским и дочерним узлами CanvasItem.

Примечание: Если вам нужно изменить только один атрибут этого преобразования, рассмотрите возможность использования одного из следующих методов:


Vector2 operator *(right: Vector2) 🔗

Преобразует (умножает) Vector2 на эту матрицу преобразования.


Transform2D operator *(right: float) 🔗

Умножает все компоненты Transform2D на заданный float, включая origin. Это равномерно влияет на масштаб преобразования.


Transform2D operator *(right: int) 🔗

Умножает все компоненты Transform2D на заданное int, включая origin. Это равномерно влияет на масштаб преобразования.


Transform2D operator /(right: float) 🔗

Делит все компоненты Transform2D на заданный float, включая origin. Это равномерно влияет на масштаб преобразования.


Transform2D operator /(right: int) 🔗

Делит все компоненты Transform2D на заданное int, включая origin. Это равномерно влияет на масштаб преобразования.


bool operator ==(right: Transform2D) 🔗

Возвращает true, если компоненты обоих преобразований в точности равны.

Примечание: Из-за ошибок точности с плавающей точкой рассмотрите возможность использования is_equal_approx() вместо этого, что более надежно.


Vector2 operator [](index: int) 🔗

Доступ к каждой оси (столбцу) этого преобразования по их индексу. Индекс 0 совпадает с x, индекс 1 совпадает с y, а индекс 2 совпадает с origin.