Matrix4

Класс представляющий матрицу 4x4.

Наиболее распространенное использование матрицы 4x4 в трехмерной компьютерной графике - в качестве матрицы трансформации. Для ознакомления с матрицами трансформации, используемыми в WebGL, ознакомьтесь с данным уроком.

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

Каждый Object3D имеет три связанные с ним Matrix4:

Cameras имеют две дополнительные матрицы Matrix4: Примечание: Object3D.normalMatrix это не матрица4, а Matrix3.

Замечание о порядке следования строк и столбцов

Метод set() принимает аргументы в порядке row-major а внутри массива elements они хранятся в главном порядке столбцов.

Это означает, что вызов const m = new v3d.Matrix4(); m.set(11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44); приведет к тому, что массив elements будет содержать: m.elements = [11, 21, 31, 41, 12, 22, 32, 42, 13, 23, 33, 43, 14, 24, 34, 44]; и внутри все вычисления выполняются с использованием упорядочивания по столбцам. Однако, поскольку фактический порядок не имеет математического значения, а большинство людей привыкли думать о матрицах в порядке возрастания строк, в документации Verge3D матрицы показаны в порядке возрастания строк. Просто имейте в виду, что если вы читаете исходный код, вам придется взять transpose любых матриц, описанных здесь, чтобы понять смысл вычислений.

Извлечение положения, поворота и масштаба

Существует несколько вариантов извлечения position, rotation и scale из Matrix4.

Конструктор

Matrix4()

Создает и инициализирует Matrix4 в 4x4 identity matrix.

Свойства

.elements : Array

column-major список значений матрицы.

Методы

.clone() → Matrix4

Создает новую Matrix4 с элементами elements, идентичными данной.

.compose(position : Vector3, quaternion : Quaternion, scale : Vector3) → this

Устанавливает эту матрицу в преобразование, состоящее из position, quaternion и scale.

.copy(m : Matrix4) → this

Копирует elements матрицы m в данную матрицу.

.copyPosition(m : Matrix4) → this

Копирует компонент перевода предоставленной матрицы m в компонент перевода этой матрицы.

.decompose(position : Vector3, quaternion : Quaternion, scale : Vector3) → null

Раскладывает эту матрицу на компоненты position, quaternion и scale. Метод не может быть использован для разложения матрицы мира объекта, если его родитель имеет неоднородный масштаб.

.determinant() → Float

Вычисляет и возвращает determinant этой матрицы.

На основе метода изложенного здесь.

.equals(m : Matrix4) → Boolean

Возвращает true, если эта матрица и m равны.

.extractBasis(xAxis : Vector3, yAxis : Vector3, zAxis : Vector3) → this

Извлекает basis этой матрицы в три предоставленных вектора осей. Если эта матрица является: a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p то для xAxis, yAxis, zAxis будут установлены значения: xAxis = (a, e, i) yAxis = (b, f, j) zAxis = (c, g, k)

.extractRotation(m : Matrix4) → this

Извлекает компонент вращения предоставленной матрицы m в компонент вращения этой матрицы.

.fromArray(array : Array, offset : Integer) → this

array — массив для чтения элементов из него.
offset — (необязательно) смещение в массиве. По умолчанию равно 0.

Устанавливает элементы этой матрицы на основе array в формате column-major.

.invert() → this

Инвертирует эту матрицу, используя analytic method. Вы не можете инвертировать с детерминантом, равным нулю. Если вы попытаетесь это сделать, метод выдаст нулевую матрицу.

.getMaxScaleOnAxis() → Float

Получает максимальное значение масштаба по 3 осям.

.identity() → this

Сбрасывает данную матрицу в identity matrix.

.lookAt(eye : Vector3, center : Vector3, up : Vector3,) → this

Строит матрицу вращения, направленную от eye к center, ориентированную вектором up.

.makeRotationAxis(axis : Vector3, theta : Float) → this

axis — Ось вращения, должна быть нормализована.
theta — Угол поворота в радианах.

Устанавливает эту матрицу как преобразование вращения вокруг axis на theta радиан.
Это несколько спорная, но математически обоснованная альтернатива вращению через Quaternions. Смотрите обсуждение здесь.

.makeBasis(xAxis : Vector3, yAxis : Vector3, zAxis : Vector3) → this

Установить это в basis матрицу, состоящую из трех предоставленных базисных векторов: xAxis.x, yAxis.x, zAxis.x, 0, xAxis.y, yAxis.y, zAxis.y, 0, xAxis.z, yAxis.z, zAxis.z, 0, 0, 0, 0, 1

.makePerspective(left : Float, right : Float, top : Float, bottom : Float, near : Float, far : Float) → this

Создает матрицу перспективной проекции. Она используется внутри PerspectiveCamera.updateProjectionMatrix()

.makeOrthographic(left : Float, right : Float, top : Float, bottom : Float, near : Float, far : Float) → this

Создает матрицу ортогональной проекции. Она используется внутри OrthographicCamera.updateProjectionMatrix().

.makeRotationFromEuler(euler : Euler) → this

Устанавливает компонент вращения (левая верхняя матрица 3x3) этой матрицы на поворот, заданный Euler Angle. Остальная часть матрицы устанавливается в тождество. В зависимости от order порядка euler возможны шесть исходов. Полный список смотрите здесь.

.makeRotationFromQuaternion(q : Quaternion) → this

Устанавливает компонент вращения этой матрицы на вращение, заданное q, как описано here. Остальная часть матрицы устанавливается в тождество. Таким образом, при задании q = w + xi + yj + zk результирующая матрица будет иметь вид: 1-2y²-2z² 2xy-2zw 2xz+2yw 0 2xy+2zw 1-2x²-2z² 2yz-2xw 0 2xz-2yw 2yz+2xw 1-2x²-2y² 0 0 0 0 1

.makeRotationX(theta : Float) → this

theta — Угол поворота в радианах.

Устанавливает эту матрицу как вращательное преобразование вокруг оси X на theta (θ) радиан. Результирующая матрица будет иметь вид: 1 0 0 0 0 cos(θ) -sin(θ) 0 0 sin(θ) cos(θ) 0 0 0 0 1

.makeRotationY(theta : Float) → this

theta — Угол поворота в радианах.

Устанавливает эту матрицу как вращательное преобразование вокруг оси Y на theta (θ) радиан. Результирующая матрица будет иметь вид: cos(θ) 0 sin(θ) 0 0 1 0 0 -sin(θ) 0 cos(θ) 0 0 0 0 1

.makeRotationZ(theta : Float) → this

theta — Угол поворота в радианах.

Устанавливает эту матрицу как вращательное преобразование вокруг оси Z на theta (θ) радиан. The resulting matrix will be: cos(θ) -sin(θ) 0 0 sin(θ) cos(θ) 0 0 0 0 1 0 0 0 0 1

.makeScale(x : Float, y : Float, z : Float) → this

x — величина масштабирования по оси X.
y — величина масштабирования по оси Y.
z — величина масштабирования по оси Z.

Устанавливает эту матрицу в качестве масштабного преобразования: x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, 0, 0, 0, 1

.makeShear(x : Float, y : Float, z : Float) → this

x — величина сдвига по оси X.
y — величина сдвига по оси Y.
z — величина сдвига по оси Z.

Устанавливает эту матрицу в качестве преобразования сдвига: 1, y, z, 0, x, 1, z, 0, x, y, 1, 0, 0, 0, 0, 1

.makeTranslation(x : Float, y : Float, z : Float) → this

x — значение перевода по оси X.
y — значение перевода по оси Y.
z — значение перевода по оси Z.

Устанавливает эту матрицу в качестве преобразования перевода: 1, 0, 0, x, 0, 1, 0, y, 0, 0, 1, z, 0, 0, 0, 1

.multiply(m : Matrix4) → this

После умножения этой матрицы на m.

.multiplyMatrices(a : Matrix4, b : Matrix4) → this

Устанавливает эту матрицу в a x b.

.multiplyScalar(s : Float) → this

Умножает каждый компонент матрицы на скалярное значение s.

.premultiply(m : Matrix4) → this

Предварительно умножает эту матрицу на m.

.scale(v : Vector3) → this

Умножает столбцы этой матрицы на вектор v.

.set(n11 : Float, n12 : Float, n13 : Float, n14 : Float, n21 : Float, n22 : Float, n23 : Float, n24 : Float, n31 : Float, n32 : Float, n33 : Float, n34 : Float, n41 : Float, n42 : Float, n43 : Float, n44 : Float) → this

Установите elements этой матрицы в заданные значения row-major n11, n12, ... n44.

.setPosition(v : Vector3) → this

.setPosition(x : Float, y : Float, z : Float) → this // optional API

Устанавливает компонент позиции для этой матрицы из вектора v, не затрагивая остальную часть матрицы - т.е. если матрица находится в текущем состоянии: a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p Она становится: a, b, c, v.x, e, f, g, v.y, i, j, k, v.z, m, n, o, p

.toArray(array : Array, offset : Integer) → Array

array — (необязательный) массив для хранения результирующего вектора.
offset — (необязательно) смещение в массиве, на которое следует поместить результат.

Записывает элементы этой матрицы в массив в column-major формате.

.transpose() → this

Transposes данную матрицу.

Исходный файл

О том как получить исходный код этого модуля читайте тут.