ТРИ. js установка прямоугольного вращения параллелепипеда по «нормальным» векторам двух его граней - PullRequest
3 голосов
/ 28 апреля 2020

У меня есть прямоугольник с параллелепипедом в трехмерном пространстве, подобный этому:

example parallelepiped

Предположим, что он расположен на начале оси и когда его вращение равно (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 )

Есть идеи?

...