Как повернуть модель, используя 3 вектора (вперед, вправо, вверх) - PullRequest
2 голосов
/ 13 октября 2019

У меня есть код для отображения модели в ее положении (aX, aY, aZ), используя 3 угла Эйлера (aRotX, aRotY, aRotZ):

var m = mat4.create();
mat4.identity(m);
mat4.translate(m, [aX, aY, aZ]);
mat4.rotateX(m, aRotX);
mat4.rotateY(m, aRotY);
mat4.rotateZ(m, aRotZ);

Это работает, но я хочу отобразить модельиспользуя его вперед / вправо / вверх векторов. Как это сделать?

1 Ответ

2 голосов
/ 13 октября 2019

Если у вас есть 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
);
...