Quaternion

Единичный кватернион, используемый для представления трехмерных вращений.

Описание

Встроенный тип Variant Quaternion — это 4D-структура данных, которая представляет вращение в виде кватерниона соглашения Гамильтона. По сравнению с типом Basis, который может хранить как вращение, так и масштаб, кватернионы могут хранить только вращение.

Quaternion состоит из 4 компонентов с плавающей точкой: w, x, y и z. Эти компоненты очень компактны в памяти, и из-за этого некоторые операции более эффективны и менее склонны вызывать ошибки с плавающей точкой. Такие методы, как get_angle(), get_axis() и slerp(), быстрее своих аналогов из Basis.

Для отличного введения в кватернионы посмотрите это видео от 3Blue1Brown. Вам не нужно знать математику, лежащую в основе кватернионов, так как Godot предоставляет несколько вспомогательных методов, которые справляются с этим за вас. К ним относятся slerp() и spheric_cubic_interpolate(), а также оператор *.

Примечание: Кватернионы должны быть нормализованы перед использованием для вращения (см. normalized()).

Примечание: Аналогично Vector2 и Vector3, компоненты кватерниона по умолчанию используют 32-битную точность, в отличие от float, который всегда 64-битный. Если требуется двойная точность, скомпилируйте движок с опцией precision=double.

Примечание

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

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

Свойства

float

w

1.0

float

x

0.0

float

y

0.0

float

z

0.0

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

Quaternion

Quaternion()

Quaternion

Quaternion(from: Quaternion)

Quaternion

Quaternion(arc_from: Vector3, arc_to: Vector3)

Quaternion

Quaternion(axis: Vector3, angle: float)

Quaternion

Quaternion(from: Basis)

Quaternion

Quaternion(x: float, y: float, z: float, w: float)

Методы

float

angle_to(to: Quaternion) const

float

dot(with: Quaternion) const

Quaternion

exp() const

Quaternion

from_euler(euler: Vector3) static

float

get_angle() const

Vector3

get_axis() const

Vector3

get_euler(order: int = 2) const

Quaternion

inverse() const

bool

is_equal_approx(to: Quaternion) const

bool

is_finite() const

bool

is_normalized() const

float

length() const

float

length_squared() const

Quaternion

log() const

Quaternion

normalized() const

Quaternion

slerp(to: Quaternion, weight: float) const

Quaternion

slerpni(to: Quaternion, weight: float) const

Quaternion

spherical_cubic_interpolate(b: Quaternion, pre_a: Quaternion, post_b: Quaternion, weight: float) const

Quaternion

spherical_cubic_interpolate_in_time(b: Quaternion, pre_a: Quaternion, post_b: Quaternion, weight: float, b_t: float, pre_a_t: float, post_b_t: float) const

Операторы

bool

operator !=(right: Quaternion)

Quaternion

operator *(right: Quaternion)

Vector3

operator *(right: Vector3)

Quaternion

operator *(right: float)

Quaternion

operator *(right: int)

Quaternion

operator +(right: Quaternion)

Quaternion

operator -(right: Quaternion)

Quaternion

operator /(right: float)

Quaternion

operator /(right: int)

bool

operator ==(right: Quaternion)

float

operator [](index: int)

Quaternion

operator unary+()

Quaternion

operator unary-()


Константы

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

Кватернион идентичности, представляющий отсутствие вращения. Имеет такое же вращение, как и Basis.IDENTITY.

Если Vector3 вращается (умножается) на этот кватернион, он не изменяется.

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


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

float w = 1.0 🔗

Компонент W кватерниона. Это «реальная» часть.

Примечание: Компоненты кватерниона обычно не следует изменять напрямую.


float x = 0.0 🔗

X-компонента кватерниона. Это значение вдоль «мнимой» оси i.

Примечание: Компоненты кватерниона обычно не следует изменять напрямую.


float y = 0.0 🔗

Компонент Y кватерниона. Это значение вдоль «мнимой» оси j.

Примечание: Компоненты кватерниона обычно не следует изменять напрямую.


float z = 0.0 🔗

Z-компонента кватерниона. Это значение вдоль «мнимой» оси k.

Примечание: Компоненты кватерниона обычно не следует изменять напрямую.


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

Quaternion Quaternion() 🔗

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

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


Quaternion Quaternion(from: Quaternion)

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


Quaternion Quaternion(arc_from: Vector3, arc_to: Vector3)

Создает Quaternion, представляющий кратчайшую дугу между arc_from и arc_to. Их можно представить как две точки, пересекающие поверхность сферы, с радиусом 1.0.


Quaternion Quaternion(axis: Vector3, angle: float)

Создает Quaternion, представляющий вращение вокруг axis на заданный angle в радианах. Ось должна быть нормализованным вектором.


Quaternion Quaternion(from: Basis)

Создает Quaternion из заданного вращения Basis.

Этот конструктор быстрее, чем Basis.get_rotation_quaternion(), но заданный базис должен быть ортонормализован (см. Basis.orthonormalized()). В противном случае конструктор завершается неудачей и возвращает IDENTITY.


Quaternion Quaternion(x: float, y: float, z: float, w: float)

Создает Quaternion, определенный заданными значениями.

Примечание: Только нормализованные кватернионы представляют вращение; если эти значения не нормализованы, новый Quaternion не будет допустимым для вращения.


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

float angle_to(to: Quaternion) const 🔗

Возвращает угол между этим кватернионом и to. Это величина угла, на который вам нужно повернуть, чтобы перейти от одного к другому.

Примечание: Величина ошибки с плавающей точкой для этого метода аномально высока, поэтому такие методы, как is_zero_approx, не будут работать надежно.


float dot(with: Quaternion) const 🔗

Возвращает скалярное произведение между этим кватернионом и with.

Это эквивалентно (quat.x * with.x) + (quat.y * with.y) + (quat.z * with.z) + (quat.w * with.w).


Quaternion exp() const 🔗

Возвращает экспоненту этого кватерниона. Ось вращения результата — нормализованная ось вращения этого кватерниона, угол результата — длина векторной части этого кватерниона.


Quaternion from_euler(euler: Vector3) static 🔗

Создает новый Quaternion из заданного Vector3 углов Эйлера, в радианах. Этот метод всегда использует соглашение YXZ (@GlobalScope.EULER_ORDER_YXZ).


float get_angle() const 🔗

Возвращает угол поворота, представленный этим кватернионом.

Примечание: Кватернион должен быть нормализован.


Vector3 get_axis() const 🔗

Возвращает ось вращения, представленную этим кватернионом.


Vector3 get_euler(order: int = 2) const 🔗

Возвращает вращение этого кватерниона как Vector3 углов Эйлера в радианах.

Порядок каждого последовательного вращения можно изменить с помощью order (см. константы EulerOrder). По умолчанию используется соглашение YXZ (@GlobalScope.EULER_ORDER_YXZ): сначала вычисляется Z (roll), затем X (pitch) и, наконец, Y (yaw). При использовании противоположного метода from_euler() этот порядок меняется на обратный.


Quaternion inverse() const 🔗

Возвращает обратную версию этого кватерниона, инвертируя знак каждого компонента, кроме w.


bool is_equal_approx(to: Quaternion) const 🔗

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


bool is_finite() const 🔗

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


bool is_normalized() const 🔗

Возвращает true, если этот кватернион нормализован. См. также normalized().


float length() const 🔗

Возвращает длину этого кватерниона, также называемую величиной.


float length_squared() const 🔗

Возвращает длину этого кватерниона, возведенную в квадрат.

Примечание: Этот метод быстрее, чем length(), поэтому предпочитайте его, если вам нужно только сравнить длины кватернионов.


Quaternion log() const 🔗

Возвращает логарифм этого кватерниона. Умножает ось вращения этого кватерниона на его угол вращения и сохраняет результат в векторной части возвращаемого кватерниона (x, y и z). Действительная часть возвращаемого кватерниона (w) всегда равна 0.0.


Quaternion normalized() const 🔗

Возвращает копию этого кватерниона, нормализованную так, что ее длина равна 1.0. См. также is_normalized().


Quaternion slerp(to: Quaternion, weight: float) const 🔗

Выполняет сферически-линейную интерполяцию с кватернионом to, заданным weight и возвращает результат. И этот кватернион, и to должны быть нормализованы.


Quaternion slerpni(to: Quaternion, weight: float) const 🔗

Выполняет сферически-линейную интерполяцию с кватернионом to, заданным weight и возвращает результат. В отличие от slerp(), этот метод не проверяет, является ли путь вращения меньше 90 градусов. И этот кватернион, и to должны быть нормализованы.


Quaternion spherical_cubic_interpolate(b: Quaternion, pre_a: Quaternion, post_b: Quaternion, weight: float) const 🔗

Выполняет сферическую кубическую интерполяцию между кватернионами pre_a, данным вектором, b и post_b на заданную величину weight.


Quaternion spherical_cubic_interpolate_in_time(b: Quaternion, pre_a: Quaternion, post_b: Quaternion, weight: float, b_t: float, pre_a_t: float, post_b_t: float) const 🔗

Выполняет сферическую кубическую интерполяцию между кватернионами pre_a, этим вектором, b и post_b на заданную величину weight.

Он может выполнять более плавную интерполяцию, чем methodspheric_cubic_interpolate по значениям времени.


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

bool operator !=(right: Quaternion) 🔗

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

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


Quaternion operator *(right: Quaternion) 🔗

Составляет (умножает) два кватерниона. Это вращает кватернион right (потомок) этим кватернионом (родитель).


Vector3 operator *(right: Vector3) 🔗

Поворачивает (умножает) вектор right на этот кватернион, возвращая Vector3.


Quaternion operator *(right: float) 🔗

Умножает каждый компонент Quaternion на правильное значение float.

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


Quaternion operator *(right: int) 🔗

Умножает каждый компонент Quaternion на правильное значение int.

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


Quaternion operator +(right: Quaternion) 🔗

Добавляет каждый компонент левого Quaternion к правому Quaternion.

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


Quaternion operator -(right: Quaternion) 🔗

Вычитает каждый компонент левого Quaternion из правого Quaternion.

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


Quaternion operator /(right: float) 🔗

Делит каждый компонент Quaternion на правое значение float.

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


Quaternion operator /(right: int) 🔗

Делит каждый компонент Quaternion на правое значение int.

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


bool operator ==(right: Quaternion) 🔗

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

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


float operator [](index: int) 🔗

Доступ к каждому компоненту этого кватерниона по их индексу.

Индекс 0 такой же, как x, индекс 1 такой же, как y, индекс 2 такой же, как z, а индекс 3 такой же, как w.


Quaternion operator unary+() 🔗

Возвращает то же значение, как если бы + не было. Унарный + ничего не делает, но иногда он может сделать ваш код более читаемым.


Quaternion operator unary-() 🔗

Возвращает отрицательное значение Quaternion. Это то же самое, что умножить все компоненты на -1. Эта операция приводит к кватерниону, который представляет то же вращение.