Transform3D
Матрица 3×4, представляющая трехмерное преобразование.
Описание
Встроенный тип Variant Transform3D — это матрица 3×4, представляющая преобразование в трехмерном пространстве. Он содержит Basis, который сам по себе может представлять вращение, масштаб и сдвиг. Кроме того, в сочетании с собственным origin преобразование также может представлять перемещение.
Для общего введения см. Матрицы и преобразования.
Примечание: Godot использует правую систему координат, что является общепринятым стандартом. Для направлений соглашение для встроенных типов, таких как Camera3D, заключается в том, что -Z указывает вперед (+X — вправо, +Y — вверх, а +Z — назад). Другие объекты могут использовать другие соглашения о направлениях. Для получения дополнительной информации см. руководство Условия направления 3D-активов.
Примечание
Существуют заметные различия при использовании данного API с C#. Подробнее см. API различия C# и GDScript.
Обучающие материалы
Свойства
|
||
|
Конструкторы
Transform3D(from: Transform3D) |
|
Transform3D(basis: Basis, origin: Vector3) |
|
Transform3D(from: Projection) |
|
Transform3D(x_axis: Vector3, y_axis: Vector3, z_axis: Vector3, origin: Vector3) |
Методы
affine_inverse() const |
|
interpolate_with(xform: Transform3D, weight: float) const |
|
inverse() const |
|
is_equal_approx(xform: Transform3D) const |
|
is_finite() const |
|
looking_at(target: Vector3, up: Vector3 = Vector3(0, 1, 0), use_model_front: bool = false) const |
|
orthonormalized() const |
|
rotated_local(axis: Vector3, angle: float) const |
|
scaled_local(scale: Vector3) const |
|
translated(offset: Vector3) const |
|
translated_local(offset: Vector3) const |
Операторы
operator !=(right: Transform3D) |
|
operator *(right: AABB) |
|
operator *(right: PackedVector3Array) |
|
operator *(right: Plane) |
|
operator *(right: Transform3D) |
|
operator *(right: Vector3) |
|
operator *(right: float) |
|
operator *(right: int) |
|
operator /(right: float) |
|
operator /(right: int) |
|
operator ==(right: Transform3D) |
Константы
IDENTITY = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) 🔗
Тождество Transform3D. Это преобразование без перемещения, без вращения и масштабом Vector3.ONE. Его basis равен Basis.IDENTITY. Это также означает, что:
Его Basis.x указывает вправо (Vector3.RIGHT);
Его Basis.y указывает вверх (Vector3.UP);
Его Basis.z указывает назад (Vector3.BACK).
var transform = Transform3D.IDENTITY
var basis = transform.basis
print("| X | Y | Z | Origin")
print("| %.f | %.f | %.f | %.f" % [basis.x.x, basis.y.x, basis.z.x, transform.origin.x])
print("| %.f | %.f | %.f | %.f" % [basis.x.y, basis.y.y, basis.z.y, transform.origin.y])
print("| %.f | %.f | %.f | %.f" % [basis.x.z, basis.y.z, basis.z.z, transform.origin.z])
# Выводит:
# | X | Y | Z | Origin
# | 1 | 0 | 0 | 0
# | 0 | 1 | 0 | 0
# | 0 | 0 | 1 | 0
Если Vector3, AABB, Plane, PackedVector3Array или другой Transform3D преобразуется (умножается) этой константой, то преобразование не происходит.
Примечание: В GDScript эта константа эквивалентна созданию Transform3D без каких-либо аргументов. Ее можно использовать для того, чтобы сделать ваш код более понятным и для согласованности с C#.
FLIP_X = Transform3D(-1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) 🔗
Transform3D с зеркальным отражением, примененным перпендикулярно плоскости YZ. Его basis равен Basis.FLIP_X.
FLIP_Y = Transform3D(1, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 0) 🔗
Transform3D с зеркальным отражением, примененным перпендикулярно плоскости XZ. Его basis равен Basis.FLIP_Y.
FLIP_Z = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0) 🔗
Transform3D с зеркальным отражением, примененным перпендикулярно плоскости XY. Его basis равен Basis.FLIP_Z.
Описания свойств
Basis basis = Basis(1, 0, 0, 0, 1, 0, 0, 0, 1) 🔗
Basis этого преобразования. Он состоит из 3 осей (Basis.x, Basis.y и Basis.z). Вместе они представляют вращение, масштаб и сдвиг преобразования.
Vector3 origin = Vector3(0, 0, 0) 🔗
Смещение трансляции этого преобразования. В трехмерном пространстве это можно рассматривать как позицию.
Описания конструктора
Transform3D Transform3D() 🔗
Создает Transform3D, идентичный IDENTITY.
Примечание: В C# это создает Transform3D с его origin и компонентами его basic, установленными на Vector3.ZERO.
Transform3D Transform3D(from: Transform3D)
Создает Transform3D как копию заданного Transform3D.
Transform3D Transform3D(basis: Basis, origin: Vector3)
Создает Transform3D из Basis и Vector3.
Transform3D Transform3D(from: Projection)
Создает Transform3D из Projection. Поскольку Transform3D — это матрица 3×4, а Projection — это матрица 4×4, эта операция обрезает последнюю строку матрицы проекции (from.x.w, from.y.w, from.z.w и from.w.w не включены в новое преобразование).
Transform3D Transform3D(x_axis: Vector3, y_axis: Vector3, z_axis: Vector3, origin: Vector3)
Создает Transform3D из четырех значений Vector3 (также называемых столбцами матрицы).
Первые три аргумента — это оси basic (Basis.x, Basis.y и Basis.z).
Описания метода
Transform3D affine_inverse() const 🔗
Возвращает инвертированную версию этого преобразования. В отличие от inverse(), этот метод работает практически с любым basis, включая неравномерные, но медленнее. См. также Basis.inverse().
Примечание: Чтобы этот метод возвращал правильно, basis преобразования должен иметь определитель, который не равен точно 0.0 (см. Basis.determinant()).
Transform3D interpolate_with(xform: Transform3D, weight: float) const 🔗
Возвращает результат линейной интерполяции между этим преобразованием и xform по заданному weight.
weight должен быть между 0.0 и 1.0 (включительно). Значения вне этого диапазона разрешены и могут использоваться для выполнения экстраполяции.
Transform3D inverse() const 🔗
Возвращает инвертированную версию этого преобразования. См. также Basis.inverse().
Примечание: Чтобы этот метод возвращал правильно, basis преобразования должен быть ортонормальным (см. orthonormalized()). Это означает, что базис должен представлять только поворот. Если это не так, используйте вместо этого affine_inverse().
bool is_equal_approx(xform: Transform3D) const 🔗
Возвращает true, если это преобразование и xform приблизительно равны, путем запуска @GlobalScope.is_equal_approx() для каждого компонента.
Возвращает true, если это преобразование конечно, вызывая @GlobalScope.is_finite() для каждого компонента.
Transform3D looking_at(target: Vector3, up: Vector3 = Vector3(0, 1, 0), use_model_front: bool = false) const 🔗
Возвращает копию этого преобразования, повернутую так, чтобы прямая ось (-Z) указывала на позицию target.
Верхняя ось (+Y) указывает как можно ближе к вектору up, оставаясь перпендикулярной прямой оси. Результирующее преобразование ортонормализовано. Существующая информация о вращении, масштабе и наклоне из исходного преобразования отбрасывается. Векторы target и up не могут быть нулевыми, не могут быть параллельны друг другу и определены в глобальном/родительском пространстве.
Если use_model_front равно true, ось +Z (фронт актива) рассматривается как прямая (подразумевается, что +X слева) и указывает на позицию target. По умолчанию ось -Z (камера впереди) рассматривается как прямая (подразумевается, что +X справа).
Transform3D orthonormalized() const 🔗
Возвращает копию этого преобразования с его basis ортонормированным. Ортонормированный базис является как перпендикулярный (оси перпендикулярны друг другу), так и нормализованным (оси имеют длину 1.0), что также означает, что он может представлять только поворот. См. также Basis.orthonormalized().
Transform3D rotated(axis: Vector3, angle: float) const 🔗
Возвращает копию этого преобразования, повернутую вокруг заданной axis на заданный angle (в радианах).
axis должен быть нормализованным вектором (см. Vector3.normalized()). Если angle положительный, базис поворачивается против часовой стрелки вокруг оси.
Этот метод является оптимизированной версией умножения заданного преобразования X на соответствующее преобразование вращения R слева, т. е. R * X.
Это можно рассматривать как преобразование относительно глобального/родительского кадра.
Transform3D rotated_local(axis: Vector3, angle: float) const 🔗
Возвращает копию этого преобразования, повернутую вокруг заданной axis на заданный angle (в радианах).
axis должен быть нормализованным вектором в локальной системе координат преобразования. Например, для поворота вокруг локальной оси X используйте Vector3.RIGHT.
Этот метод является оптимизированной версией умножения заданного преобразования X на соответствующее преобразование поворота R справа, т. е. X * R.
Это можно рассматривать как преобразование относительно локальной системы отсчета.
Transform3D scaled(scale: Vector3) const 🔗
Возвращает копию этого преобразования, масштабированную заданным коэффициентом scale.
Этот метод является оптимизированной версией умножения заданного преобразования X на соответствующее масштабирующее преобразование S слева, т. е. S * X.
Это можно рассматривать как преобразование относительно глобального/родительского кадра.
Transform3D scaled_local(scale: Vector3) const 🔗
Возвращает копию этого преобразования, масштабированную заданным коэффициентом scale.
Этот метод является оптимизированной версией умножения заданного преобразования X на соответствующее масштабирующее преобразование S справа, т. е. X * S.
Это можно рассматривать как преобразование относительно локального кадра.
Transform3D translated(offset: Vector3) const 🔗
Возвращает копию этого преобразования, переведенную на заданное offset.
Этот метод является оптимизированной версией умножения заданного преобразования X на соответствующее преобразование перевода T слева, т. е. T * X.
Это можно рассматривать как преобразование относительно глобального/родительского фрейма.
Transform3D translated_local(offset: Vector3) const 🔗
Возвращает копию этого преобразования, переведенную на заданное offset.
Этот метод является оптимизированной версией умножения заданного преобразования X на соответствующее преобразование перевода T справа, т. е. X * T.
Это можно рассматривать как преобразование относительно локального фрейма.
Описания оператора
bool operator !=(right: Transform3D) 🔗
Возвращает true, если компоненты обоих преобразований не равны.
Примечание: Из-за ошибок точности с плавающей точкой рассмотрите возможность использования is_equal_approx() вместо этого, что более надежно.
AABB operator *(right: AABB) 🔗
Преобразует (умножает) AABB на эту матрицу преобразования.
PackedVector3Array operator *(right: PackedVector3Array) 🔗
Преобразует (умножает) каждый элемент Vector3 заданного PackedVector3Array на эту матрицу преобразования.
На больших массивах эта операция выполняется намного быстрее, чем преобразование каждого Vector3 по отдельности.
Plane operator *(right: Plane) 🔗
Преобразует (умножает) Plane на эту матрицу преобразования.
Transform3D operator *(right: Transform3D) 🔗
Преобразует (умножает) это преобразование на преобразование right.
Это операция, выполняемая между родительским и дочерним Node3D-ми.
Примечание: Если вам нужно изменить только один атрибут этого преобразования, рассмотрите возможность использования одного из следующих методов:
Для перевода см. moved() или moved_local().
Для поворота см. rotated() или rotated_local().
Для масштабирования см. scaled() или scaled_local().
Vector3 operator *(right: Vector3) 🔗
Преобразует (умножает) Vector3 на эту матрицу преобразования.
Transform3D operator *(right: float) 🔗
Умножает все компоненты Transform3D на заданный float, включая origin. Это влияет на масштаб преобразования равномерно, масштабируя basis.
Transform3D operator *(right: int) 🔗
Умножает все компоненты Transform3D на заданное int, включая origin. Это влияет на масштаб преобразования равномерно, масштабируя basic.
Transform3D operator /(right: float) 🔗
Делит все компоненты Transform3D на заданный float, включая origin. Это равномерно влияет на масштаб преобразования, масштабируя basis.
Transform3D operator /(right: int) 🔗
Делит все компоненты Transform3D на заданное int, включая origin. Это равномерно влияет на масштаб преобразования, масштабируя basis.
bool operator ==(right: Transform3D) 🔗
Возвращает true, если компоненты обоих преобразований в точности равны.
Примечание: Из-за ошибок точности с плавающей точкой рассмотрите возможность использования is_equal_approx() вместо этого, что более надежно.