У меня есть прямоугольник с параллелепипедом в трехмерном пространстве, подобный этому:
Предположим, что он расположен на начале оси и когда его вращение равно (0,0,0) его самое большое лицо (зеленое) находится на XY, его самое маленькое (синее) параллельно YZ.
Предполагая, что у меня есть два (ортогональных) вектора, V1 и V2.
V1 представляет нормаль самой большой грани (зеленой) Object3d.
V2, вместо этого, является нормалью самой маленькой грани (синей).
Учитывая два новых вектора, как я могу повернуть в трехмерном пространстве этот параллелепипед так, чтобы нормали его граней совпали с этими новыми векторами?
Пример:
const V1 = new Vector3(0, 1, 0);
const V2 = new Vector3(0, 0, 1);
В этой конфигурации я ожидаем, что это вращение (euler in grad): (-90, 0, -90).
(Получившееся solid будет иметь самое большое лицевое направление вниз на XZ и самое маленькое на XY).
Что я пробовал:
const v1 = some_value;
const v2 = some_othen_value; // ortogonal to v1
const q1 = new Quaternion();
q1.setFromUnitVectors(new Vector3(1, 0, 0), v1);
const q2 = new Quaternion();
q2.setFromUnitVectors(new Vector3(0, 0, 1), v2);
parallelepiped.setRotationFromQuaternion(q2.multiply(q1));
Этот метод работает для определенных конфигураций, но не работает плохо с другими.
Пример сбоя:
V1 = new Vector3(1, 0, 0);
V2 = new Vector3(0, 0, 1);
В этом случае результирующий поворот будет (0, 0, 0), но я бы ожидал что-то вроде (0, 90, 90 )
Есть идеи?