Если у вас есть 3 вектора, представляющих выравнивание объектов по 3 осям, и координату, вы можете вручную построить матрицу для позиционирования этого объекта из этих 4 векторов.
Вектор оси {x, y, z} должна иметь длину, которая представляет масштаб вдоль этой оси. Если вы нормализуете векторы, масштаб будет 1. Умножьте векторы, чтобы масштабировать объект.
Таким образом, 3 оси как xAxis
, yAxis
, zAxis
и позиция coord
в мирепробел
Матрица 4 на 4 в виде массива
const matrix4 = new Float32Array([
xAxis.x, xAxis.y, xAxis.z, 0,
yAxis.x, yAxis.y, yAxis.z, 0,
zAxis.x, zAxis.y, zAxis.z, 0,
coord.x, coord.y, coord.z, 1
]);
Или
const matrix4 = new Float32Array([...xAxis, 0, ...yAxis, 0, ...zAxis, 0, ...coord, 1]);
Или использование для создания mat4
const mat = mat4.create().fromValues(...xAxis, 0, ...yAxis, 0, ...zAxis, 0, ...coord, 1);
Помните, что длина векторов оси масштабирует эту ось.
Иногда оси 3 не все перпендикулярны и могут искажать объект. Вы можете использовать перекрестное произведение двух осей, чтобы найти третью ось. Пример Ось Z неизвестна или не выровнена.
const mat = mat4.create().fromValues(
...xAxis, 0,
...yAxis, 0,
...vec3.cross(vec3.create(), xAxis, yAxis), 0,
...coord, 1
);