Как найти матрицу вращения между двумя наборами трехмерных точек в ТРИ. js - PullRequest
0 голосов
/ 05 мая 2020

Мой вопрос является продолжением этого вопроса: Как найти матрицу вращения между двумя векторами в THREE. js

Если бы у меня был Vector3, а Vector3 нормальный к нему описывая ориентацию трехмерного объекта, как бы я go мог найти матрицу вращения между этой векторной группой и преобразованием этой векторной группы, доступной мне как уже переведенную группу векторов?

Вот визуальный элемент проясните:

Imgur Link

Я хочу использовать правильные ТРИ. js утилиты находят кватернион, который вращает вращение группы, описанной v1 и v1n вращению той же группы, описываемому v1 'и v1n'. Поворотные точки этих состояний описываются точками p1 и p1 '.

Из приведенного выше ответа я знаю, как получить поворот от одного Vector3 к другому, но если бы я использовал этот метод для своего использования В этом случае я бы не стал обрабатывать 3-ю степень свободы вращения (предполагая, что для описания вращения используются рыскание, тангаж, крен).

Ответы [ 2 ]

1 голос
/ 12 мая 2020

Мой ответ №2: Не полагаться на ориентацию 2-х групп.

Давайте снова скажем, что мы хотим повернуть v1 и v1n в v2 и v2n. Мы можем использовать .setFromUnitVectors (v1, v2), чтобы получить кватернион Q1, вращающий v1 в v2. v1n превратится в v1nrot1, что нормально для v2, но не v2n. Мы можем снова использовать .setFromUnitVectors (v1nrot1, v2n), чтобы получить кватернион Q2, вращающий v1nrot1 в v2n. Этот второй поворот не повлияет на v1rot (= v2), потому что v1rot нормален для v1nrot1 и v2n. Если бы они не были нормальными, для получения нормалей потребовался бы дополнительный шаг. Наконец, v1rot dot v2 = 1 и v1nrot2 dot v2n = 1, показывающие, что вращение Q2Q1 сработало. Код закомментирован.

1 голос
/ 06 мая 2020

Допустим, v1 и v1n находятся в group1, а v2 и v2n находятся в group2. Если мы можем предположить, что обе группы начали с одинаковой векторной конфигурации, например (0,1,0) и (0,0,1), это кажется логичным:

Сначала переместите group1 в исходную ориентацию .

var qtmp1 = group1.quaternion.clone().conjugate();
group1.applyQuaternion(qtmp1);

Затем переместите group1 в положение group2.

var qtmp2 = group2.quaternion.clone();
group1.applyQuaternion(qtmp2);

За один поворот:

group1.applyQuaternion(qtmp2.multiply(qtmp1));

Предположение может быть неверным.

РЕДАКТИРОВАТЬ: Проще:

group1.quaternion.slerp(group2.quaternion, 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...