Basis
Три оси линейного преобразования 3D без переноса.
Basis хранит поворот, масштаб и возможный shear. Basis.Identity — единичный базис; нулевая структура не заменяет его. Определитель при равномерном масштабе s равен s³, при s = 2 — 8. Нулевой определитель означает отсутствие обратной матрицы.
Для чистой ориентации нужны ортонормированные оси либо единичный Quaternion. Orthonormalized меняет исходный масштаб/искажение. Нормаль при неравномерном масштабе переносите через Inverse().Transposed(), затем нормализуйте; обычное умножение Basis не сохраняет её перпендикулярность поверхности.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы4
Basis4 перегрузки
public Basis(Quaternion quaternion);Создает Basis из 3-х векторов осей. Это столбцы матрицы базиса.
| Имя | Тип | По умолчанию |
|---|---|---|
quaternion | Quaternion | — |
quaternionКватернион для создания основы.
public Basis(Vector3 column0, Vector3 column1, Vector3 column2);Создает Basis из 3-х векторов осей. Это столбцы матрицы базиса.
| Имя | Тип | По умолчанию |
|---|---|---|
column0 | Vector3 | — |
column1 | Vector3 | — |
column2 | Vector3 | — |
column0Вектор Х, или колонка 0.
column1Вектор Y, или колонка 1.
column2Вектор Z, или колонка 2.
public Basis(Vector3 axis, float angle);Создает Basis из 3-х векторов осей. Это столбцы матрицы базиса.
| Имя | Тип | По умолчанию |
|---|---|---|
axis | Vector3 | — |
angle | float | — |
axisОсь, чтобы повернуться, должна быть нормализована.
angleУгол поворота в радианах.
public Basis(float xx, float yx, float zx, float xy, float yy, float zy, float xz, float yz, float zz);Создает Basis из 3-х векторов осей. Это столбцы матрицы базиса.
| Имя | Тип | По умолчанию |
|---|---|---|
xx | float | — |
yx | float | — |
zx | float | — |
xy | float | — |
yy | float | — |
zy | float | — |
xz | float | — |
yz | float | — |
zz | float | — |
xxX компонент вектора X, доступ через b.X.X или [0][0].
yxКомпонент X вектора Y, доступ через b.Y.X или [1][0].
zxX компонент вектора Z, доступ через b.Z.X или [2][0].
xyY компонент вектора X, доступ через b.X.Y или [0][1].
yyY компонент вектора Y, доступ к которому обеспечивается через b.Y.Y или [1][1].
zyY компонент столбца Z, доступ через b.Y.Y или [2][1].
xzZ компонент вектора X, доступ через b.X.Y или [0][2].
yzZ компонент вектора Y, доступ через b.Y.Y или [1][2].
zzZ компонент столбца Z, доступ через b.Y.Y или [2][2].
Свойства13
Column0Свойство
public Vector3 Column0 { get; set; }Колонка 0 матрицы оснований (вектор Х).
Column1Свойство
public Vector3 Column1 { get; set; }Колонка 1 базовой матрицы (вектор Y).
Column2Свойство
public Vector3 Column2 { get; set; }Колонка 2 базовой матрицы (вектор Z).
FlipXСвойство
public static Basis FlipX { get; }Когда любой базис умножается на Basis.FlipX, он инвертирует все компоненты оси Basis.X (столбец X).
Когда Basis.FlipX умножается на любой базис, он инвертирует компонент Vector3.X всех осей (строка X).
FlipYСвойство
public static Basis FlipY { get; }Когда любой базис умножается на Basis.FlipY, он инвертирует все компоненты оси Basis.Y (столбец Y).
Когда Basis.FlipY умножается на любой базис, он инвертирует компонент Vector3.Y всех осей (строка Y).
FlipZСвойство
public static Basis FlipZ { get; }Когда любой базис умножается на Basis.FlipZ, он инвертирует все компоненты оси Basis.Z (столбец Z).
Когда Basis.FlipZ умножается на любой базис, он инвертирует компонент Vector3.Z всех осей (строка Z).
IdentityСвойство
public static Basis Identity { get; }Тождество Basis. Это ортонормальный базис без вращения, без сдвига и масштабом Vector3.One. Это также означает, что:
Basis.Xуказывает вправо (Vector3.Right);Basis.Yуказывает вверх (Vector3.Up);Basis.Zуказывает назад (Vector3.Back).
Если a Vector3 или иного рода Basis Преобразуется (многократно) на эту постоянную, не происходит никакой трансформации.
Примечание: В C# эта константа эквивалентна созданию a [конструктор Basis] без каких-либо аргументов. Он может быть использован для того, чтобы сделать ваш код более ясным и чтобы он соответствовал C#.
Item2 перегрузки
public Vector3 this[int column] { get; set; }Целые колонки в виде Vector3.
public float this[int column, int row] { get; set; }Элементы матрицы доступа в основном столбце.
ScaleСвойство
public Vector3 Scale { get; }Исходя из того, что матрица представляет собой сочетание ротации и масштабирования, возвратить абсолютное значение коэффициентов масштабирования вдоль каждой оси.
XСвойство
public Vector3 X { get; set; }Ось X базиса и столбец 0 матрицы.
На основе тождества этот вектор указывает вправо (Vector3.Right).
YСвойство
public Vector3 Y { get; set; }Ось Y базиса и столбец 1 матрицы.
На основе тождества этот вектор направлен вверх (Vector3.Up).
ZСвойство
public Vector3 Z { get; set; }Ось Z базиса и столбец 2 матрицы.
На основе тождества этот вектор указывает назад (Vector3.Back).
Методы29
Determinantfloat
public float Determinant();Определитель матрицы 3×3. Для равномерного масштаба s равен s³: масштаб 2 даёт 8. Ноль означает необратимость; отрицательный знак меняет ориентацию базиса.
floatОпределяющий фактор базовой матрицы.
Equals2 перегрузки
public bool Equals(Basis other);Returns (Возврат) true если базовые матрицы являются точно
Примечание: Из-за ошибок в точности в плавающей точке рассмотреть вопрос об использовании
Basis.IsEqualApprox вместо этого, что более надежно.
| Имя | Тип | По умолчанию |
|---|---|---|
other | Basis | — |
otherДругая основа.
boolЯвляется ли матрица оснований точно равной.
public override bool Equals(object? obj);Returns (Возврат) true если: Basis это
точно равно данному объекту (obj).
Примечание: Из-за ошибок в точности в плавающей точке рассмотреть вопрос об использовании
Basis.IsEqualApprox вместо этого, что более надежно.
| Имя | Тип | По умолчанию |
|---|---|---|
obj | object | — |
objОбъект, с которым можно сравниться.
boolЯвляется ли матрица оснований и объект точно равны.
FromEulerBasis
public static Basis FromEuler(Vector3 euler, EulerOrder order = EulerOrder.Yxz);Создает новый Basis, который представляет собой только вращение относительно заданного Vector3 Углов Эйлера в радианах.
Vector3.Xдолжен содержать угол вокруг осиBasis.X(тангаж);Vector3.Yдолжен содержать угол вокруг осиBasis.Y(рыскание);Vector3.Zдолжен содержать угол вокруг осиBasis.Z(крен).
// Creates a Basis whose z axis points down.
var myBasis = Basis.FromEuler(new Vector3(Mathf.Tau / 4.0f, 0.0f, 0.0f));
ReckfellApi.Print(myBasis.Z); // Prints (0, -1, 0)Порядок каждого последующего вращения можно изменить с помощью order (см. константы EulerOrder). В Reckfell углы Эйлера всегда используют внутренний порядок. По умолчанию используется внутренняя конвенция YXZ (EULER_ORDER_YXZ): базис сначала вращается вокруг локальной оси Y (рыскание), затем вокруг локальной оси X (тангаж) и, наконец, вокруг локальной оси Z (крен). При использовании противоположного метода Basis.GetEuler для разложения вращения этот порядок меняется на обратный.
| Имя | Тип | По умолчанию |
|---|---|---|
euler | Vector3 | — |
order | EulerOrder | EulerOrder.Yxz |
eulerИспользуемые углы Эйлера.
orderПорядок построения углов Эйлера.
BasisFromScaleBasis
public static Basis FromScale(Vector3 scale);Создает новый Basis, который представляет только масштаб, без вращения или сдвига, из заданного вектора scale.
var myBasis = Basis.FromScale(new Vector3(2.0f, 4.0f, 8.0f));
ReckfellApi.Print(myBasis.X); // Prints (2, 0, 0)
ReckfellApi.Print(myBasis.Y); // Prints (0, 4, 0)
ReckfellApi.Print(myBasis.Z); // Prints (0, 0, 8)Примечание: В линейной алгебре матрица этого базиса также известна как диагональная матрица.
| Имя | Тип | По умолчанию |
|---|---|---|
scale | Vector3 | — |
scaleШкала взносов Vector3.
BasisЧистая чаша Basis Матрица.
GetEulerVector3
public Vector3 GetEuler(EulerOrder order = EulerOrder.Yxz);Возвращает вращение базиса в виде Vector3 углов Эйлера в радианах. Возвращаемое значение:
Vector3.Xсодержит угол вокруг осиBasis.X(тангаж);Vector3.Yсодержит угол вокруг осиBasis.Y(рыскание);Vector3.Zсодержит угол вокруг осиBasis.Z(крен). Порядок каждого последующего вращения можно изменить с помощьюorder(см. константыEulerOrder). В Reckfell углы Эйлера всегда используют внутренний порядок. По умолчанию используется внутренняя конвенция YXZ (EULER_ORDER_YXZ): поскольку мы разлагаем, сначала вычисляется локальная Z (крен), затем локальная X (тангаж) и, наконец, локальная Y (рыскание). При использовании противоположного методаBasis.FromEulerдля построения вращения порядок меняется на обратный. Примечание: Для корректного возврата этого метода базис должен быть ортонормированным (см.Basis.Orthonormalized). Примечание: Углы Эйлера гораздо более интуитивно понятны, но не подходят для 3D-математики. Поэтому рекомендуется использовать методBasis.GetRotationQuaternion, который возвращаетQuaternion. Примечание: В панели инспектора вращение базиса часто отображается в углах Эйлера (в градусах), как это происходит со свойствомEntity3D.Rotation.
| Имя | Тип | По умолчанию |
|---|---|---|
order | EulerOrder | EulerOrder.Yxz |
orderПриказ Эйлера использовать. По умолчанию используйте порядок YXZ (самый распространенный).
GetHashCodeint
public override int GetHashCode();Выполняет функцию хеширования Basis.
intКод хэша для этой основы.
GetRotationQuaternionQuaternion
public Quaternion GetRotationQuaternion();Возвращает вращение этого базиса как Quaternion.
Примечание: Кватернионы гораздо больше подходят для 3D-математики, но менее интуитивно понятны. Для пользовательских интерфейсов рассмотрите возможность использования метода Basis.GetEuler, который возвращает углы Эйлера.
QuaternionБазовая ротация.
InverseBasis
public Basis Inverse();Возвращает обратный Basis. При определителе, точно равном 0, выбрасывает InvalidOperationException; почти вырожденные данные могут сильно усилить погрешность.
BasisОбратное значение. При точном нулевом определителе результат не возвращается: выбрасывается InvalidOperationException.
IsEqualApproxbool
public bool IsEqualApprox(Basis other);Возвращает true, если этот базис и b приблизительно равны, вызывая @GlobalScope.is_equal_approx для всех компонентов вектора.
| Имя | Тип | По умолчанию |
|---|---|---|
other | Basis | — |
otherДругая основа для сравнения.
boolО том, равны ли основания.
IsFinitebool
public bool IsFinite();Возвращает true, если этот базис конечен, вызывая @GlobalScope.is_finite для всех компонентов вектора.
boolЯвляется ли этот вектор конечным или нет.
LookingAt2 перегрузки
public static Basis LookingAt(Vector3 target, Vector3 up);Создает новый Basis с поворотом таким образом, что прямая ось (-Z) указывает на позицию target.
По умолчанию ось -Z (камера вперед) рассматривается как прямая (подразумевается, что +X находится справа). Если use_model_front равно true, ось +Z (ассет спереди) рассматривается как прямая (подразумевается, что +X находится слева) и указывает на позицию target.
Верхняя ось (+Y) указывает как можно ближе к вектору up, оставаясь перпендикулярной прямой оси. Возвращаемый базис ортонормализован (см. Basis.Orthonormalized).
target и up не могут быть Vector3.Zero и не должны быть коллинеарными, чтобы избежать непреднамеренного поворота вокруг локальной оси Z.
| Имя | Тип | По умолчанию |
|---|---|---|
target | Vector3 | — |
up | Vector3 | — |
Basispublic static Basis LookingAt(Vector3 target, Vector3? up = default, bool useModelFront = false);Создает новый Basis с поворотом таким образом, что прямая ось (-Z) указывает на позицию target.
По умолчанию ось -Z (камера вперед) рассматривается как прямая (подразумевается, что +X находится справа). Если use_model_front равно true, ось +Z (ассет спереди) рассматривается как прямая (подразумевается, что +X находится слева) и указывает на позицию target.
Верхняя ось (+Y) указывает как можно ближе к вектору up, оставаясь перпендикулярной прямой оси. Возвращаемый базис ортонормализован (см. Basis.Orthonormalized).
target и up не могут быть Vector3.Zero и не должны быть коллинеарными, чтобы избежать непреднамеренного поворота вокруг локальной оси Z.
| Имя | Тип | По умолчанию |
|---|---|---|
target | Vector3 | — |
up | Vector3? | default |
useModelFront | bool | false |
targetПоложение, на которое нужно смотреть.
upОтносительное направление вверх.
useModelFrontЕсли это так, то модель ориентирована наоборот, в направлении передней оси модели (+Z, Vector3. Модель " Передний край &quuot; , которая более полезна для ориентации 3D моделей.
BasisПолученная в результате матрица основы.
OrthonormalizedBasis
public Basis Orthonormalized();Возвращает ортонормированную версию этого базиса. Ортонормированный базис является как ортогональным (оси перпендикулярны друг другу), так и нормализованным (оси имеют длину 1.0), что также означает, что он может представлять только поворот.
Часто бывает полезно вызывать этот метод, чтобы избежать ошибок округления на основе поворота:
// Rotate this Entity3D every frame.
public override void _Process(double delta)
{
Basis = Basis.Rotated(Vector3.Up, Mathf.Tau * (float)delta)
.Rotated(Vector3.Right, Mathf.Tau * (float)delta)
.Orthonormalized();
}BasisМатрица ортопедической основы.
RotatedBasis
public Basis Rotated(Vector3 axis, float angle);Возвращает копию этого базиса, повернутую вокруг заданной axis на заданный angle (в радианах).
axis должен быть нормализованным вектором (см. Vector3.Normalized). Если angle положительный, базис поворачивается против часовой стрелки вокруг оси.
var myBasis = Basis.Identity;
var angle = Mathf.Tau / 2.0f;
myBasis = myBasis.Rotated(Vector3.Up, angle); // Rotate around the up axis (yaw).
myBasis = myBasis.Rotated(Vector3.Right, angle); // Rotate around the right axis (pitch).
myBasis = myBasis.Rotated(Vector3.Back, angle); // Rotate around the back axis (roll).| Имя | Тип | По умолчанию |
|---|---|---|
axis | Vector3 | — |
angle | float | — |
axisОсь, чтобы повернуться, должна быть нормализована.
angleУгол поворота в радианах.
BasisМатрица поворачиваемых баз.
ScaledBasis
public Basis Scaled(Vector3 scale);Возвращает этот базис с компонентами каждой оси, масштабированными по заданным компонентам scale.
Строки матрицы базиса умножаются на компоненты scale. Эта операция является глобальной шкалой (относительно родителя).
var myBasis = new Basis(
new Vector3(1.0f, 1.0f, 1.0f),
new Vector3(2.0f, 2.0f, 2.0f),
new Vector3(3.0f, 3.0f, 3.0f)
);
myBasis = myBasis.Scaled(new Vector3(0.0f, 2.0f, -2.0f));
ReckfellApi.Print(myBasis.X); // Prints (0, 2, -2)
ReckfellApi.Print(myBasis.Y); // Prints (0, 4, -4)
ReckfellApi.Print(myBasis.Z); // Prints (0, 6, -6)| Имя | Тип | По умолчанию |
|---|---|---|
scale | Vector3 | — |
scaleМасштаб для введения.
BasisМасштабная матрица.
ScaledLocalBasis
public Basis ScaledLocal(Vector3 scale);Возвращает этот базис, где каждая ось масштабирована по соответствующему компоненту в заданном scale.
Столбцы базисной матрицы умножаются на компоненты scale. Эта операция является локальной (относительной) шкалой.
var myBasis = new Basis(
new Vector3(1.0f, 1.0f, 1.0f),
new Vector3(2.0f, 2.0f, 2.0f),
new Vector3(3.0f, 3.0f, 3.0f)
);
myBasis = myBasis.ScaledLocal(new Vector3(0.0f, 2.0f, -2.0f));
ReckfellApi.Print(myBasis.X); // Prints (0, 0, 0)
ReckfellApi.Print(myBasis.Y); // Prints (4, 4, 4)
ReckfellApi.Print(myBasis.Z); // Prints (-6, -6, -6)| Имя | Тип | По умолчанию |
|---|---|---|
scale | Vector3 | — |
scaleМасштаб для введения.
BasisМасштабная матрица.
SlerpBasis
public Basis Slerp(Basis target, float weight);Выполняет сферически-линейную интерполяцию с базисом to, заданным weight. И этот базис, и to должны представлять поворот.
Пример: Плавно повернуть Entity3D к целевому базису с течением времени с Tween:
| Имя | Тип | По умолчанию |
|---|---|---|
target | Basis | — |
weight | float | — |
targetМесто назначения для интерполяции.
weightЗначение на диапазоне от 0,0 до 1,0, представляющее собой величину интерполяции.
BasisПолучаемая в результате матрица интерполяции.
Tdotxfloat
public float Tdotx(Vector3 with);Возвращает транспонированное скалярное произведение между with и осью Basis.X (см. Basis.Transposed).
Это эквивалентно basis.x.dot(vector).
| Имя | Тип | По умолчанию |
|---|---|---|
with | Vector3 | — |
withВектор для расчета продукта с точки.
floatПолучаемый продукт.
Tdotyfloat
public float Tdoty(Vector3 with);Возвращает транспонированное скалярное произведение между with и осью Basis.Y (см. Basis.Transposed).
Это эквивалентно basis.y.dot(vector).
| Имя | Тип | По умолчанию |
|---|---|---|
with | Vector3 | — |
withВектор для расчета продукта с точки.
floatПолучаемый продукт.
Tdotzfloat
public float Tdotz(Vector3 with);Возвращает транспонированное скалярное произведение между with и осью Basis.Z (см. Basis.Transposed).
Это эквивалентно basis.z.dot(vector).
| Имя | Тип | По умолчанию |
|---|---|---|
with | Vector3 | — |
withВектор для расчета продукта с точки.
floatПолучаемый продукт.
ToString2 перегрузки
public override string ToString();Преобразует это Basis к а string.
stringA string :: представление этой основы.
public string ToString(string? format);Преобразует это Basis к а string с указанным format.
| Имя | Тип | По умолчанию |
|---|---|---|
format | string | — |
stringA string :: представление этой основы.
TransposedBasis
public Basis Transposed();Возвращает транспонированную версию этого базиса. Это превращает столбцы матрицы базиса в строки, а ее строки в столбцы.
var myBasis = new Basis(
new Vector3(1.0f, 2.0f, 3.0f),
new Vector3(4.0f, 5.0f, 6.0f),
new Vector3(7.0f, 8.0f, 9.0f)
);
myBasis = myBasis.Transposed();
ReckfellApi.Print(myBasis.X); // Prints (1, 4, 7)
ReckfellApi.Print(myBasis.Y); // Prints (2, 5, 8)
ReckfellApi.Print(myBasis.Z); // Prints (3, 6, 9)BasisПереносная матрица базы.
op_Equalitybool
public static bool operator ==(Basis left, Basis right);Returns (Возврат) true если базовые матрицы являются точно
Примечание: Из-за ошибок в точности в плавающей точке рассмотреть вопрос об использовании
Basis.IsEqualApprox вместо этого, что более надежно.
| Имя | Тип | По умолчанию |
|---|---|---|
left | Basis | — |
right | Basis | — |
leftЛевую основу.
rightПравильная основа.
boolЯвляется ли матрица оснований точно равной.
op_Inequalitybool
public static bool operator !=(Basis left, Basis right);Returns (Возврат) true если базовые матрицы не равны.
Примечание: Из-за ошибок в точности в плавающей точке рассмотреть вопрос об использовании
Basis.IsEqualApprox вместо этого, что более надежно.
| Имя | Тип | По умолчанию |
|---|---|---|
left | Basis | — |
right | Basis | — |
leftЛевую основу.
rightПравильная основа.
boolНе равны ли базовые матрицы.
op_Multiply3 перегрузки
public static Basis operator *(Basis left, Basis right);Составляет эти две базовые матрицы путем их умножения Это приводит к преобразованию второй основы. (ребенка) с первого основания (родителя).
| Имя | Тип | По умолчанию |
|---|---|---|
left | Basis | — |
right | Basis | — |
leftРодительская основа.
rightДетская основа.
BasisСоставная основа.
public static Vector3 operator *(Basis basis, Vector3 vector);Возвращается a Vector3 Преобразован (многократно) в базовую матрицу.
| Имя | Тип | По умолчанию |
|---|---|---|
basis | Basis | — |
vector | Vector3 | — |
basisПрименяется матричная трансформация основы.
vectorA Vector3 Преобразовать.
Vector3Преобразованные Vector3.
public static Vector3 operator *(Vector3 vector, Basis basis);Возвращается a Vector3 преобразованная (многократно) обратной базовой матрицей, при том предположении, что основа преобразования является ортопедической (т.е. вращение/отражение)
- в порядке, масштабирование/скайв - нет).
vector * basisэквивалентенbasis.Transposed() * vectorСм.Basis.Transposed. Преобразование в обратном направлении неортонормальной основы (например, при масштабировании)basis.Inverse() * vectorвместо этого можно использовать. См.Basis.Inverse.
| Имя | Тип | По умолчанию |
|---|---|---|
vector | Vector3 | — |
basis | Basis | — |
vectorA Vector3 Чтобы обратно преобразоваться.
basisПрименяется матричная трансформация основы.
Vector3Обратно преобразованный вектор.
Поля и константы3
Row0Поле
public Vector3 Row0;Строка 0 матрицы основы. Показывает, какие векторы вносят вклад Строки не очень полезны для кода пользователя, но являются более эффективными для некоторых внутренних расчетов.
Row1Поле
public Vector3 Row1;Строка 1 матрицы основы. Показывает, какие векторы вносят вклад Строки не очень полезны для кода пользователя, но являются более эффективными для некоторых внутренних расчетов.
Row2Поле
public Vector3 Row2;Строка 2 матрицы оснований. Показывает, какие векторы вносят вклад Строки не очень полезны для кода пользователя, но являются более эффективными для некоторых внутренних расчетов.