Transform2D

A 2×3 матриця, що представляє 2D перетворення.

Опис

Вбудований тип Variant методу Transform2D — це матриця розміром 2×3, що представляє перетворення у двовимірному просторі. Вона містить три значення Vector2: x, y та origin. Разом вони можуть представляти переміщення, обертання, масштаб та нахил.

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

Застосування нахиленого перетворення до двовимірного спрайту призведе до спотворення спрайту.

Загальний вступ див. у навчальному посібнику Матриці та перетворення. Примітка: На відміну від Transform3D, для типу Basis немає двовимірного еквівалента. Усі згадки про "basis" стосуються компонентів x та y класу Transform2D.

Примітка

Існують значні відмінності при використанні цього API із С#. Більше інформації: ref:doc_c_sharp_differences.

Посібники

Властивості

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 | Початок")
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])
# Відбитки:
# | X | Y | Походження
# | 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 матриці. У 2D просторі це можна побачити як позицію.


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)

Constructs a Transform2D з заданого кута (в редисках) і положення.


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

Constructs 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, перетворена (multiplied) матрицею перетворення. На відміну від оператора мультиплікації (*, цей метод ігнорує origin.


Vector2 basis_xform_inv(v: Vector2) const 🔗

Повертає копію вектора v, перетвореного (помноженого) на матрицю базису оберненого перетворення (див. inverse()). Цей метод ігнорує початок координат члена.

Примітка: Цей метод припускає, що базис цього перетворення є ортонормованим (див. 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's кут (див. 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()) # Друкує (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, якщо ця трансформація є конформаційною. Конформалізована основа — як orthogonal (віски є перпендикулярно один одному) і uniform (такі ж довжини діляться осі). Цей метод може бути особливо корисним при розрахунку фізики.


bool is_equal_approx(xform: Transform2D) const 🔗

Повертає true, якщо це перетворення і xform є приблизно рівні, запустивши @GlobalScope.is_equal_about() на кожному компоненті.


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

Трансформи (multiplies) кожен Vector2 елемент даної PackedVector2Array за допомогою цієї матриці перетворення.

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


Rect2 operator *(right: Rect2) 🔗

Трансформи (multiplies) Rect2 цієї матриці перетворення.


Transform2D operator *(right: Transform2D) 🔗

Перетворює (множить) це перетворення на перетворення right.

Це операція, що виконується між батьківським та дочірнім вузлами CanvasItem.

Примітка: Якщо вам потрібно змінити лише один атрибут цього перетворення, розгляньте можливість використання одного з наступних методів:


Vector2 operator *(right: Vector2) 🔗

Трансформи (multiplies) Vector2 за допомогою цієї матриці перетворення.


Transform2D operator *(right: float) 🔗

Багатофункціональні всі компоненти Transform2D, в тому числі 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.