Получение поворота оси / угла из двух пар из трех точек (или двух пар из двух векторов)

Обратите внимание, что, хотя это звучит похоже, это не общий вопрос «как повернуть один вектор на другой».

Я бы хотел нравится получать аффинное преобразование (в матричной или кватернионной + векторной форме) из двух наборов по 3. Их можно рассматривать как «маркерные точки» на твердых телах или как конечные точки векторов «вперед и вверх». это не общий вопрос «как повернуть один вектор на другой». Я хотел бы получить аффинное преобразование (либо в матрице, либо в кватернионе + ...

Обратите внимание, что, хотя это звучит похоже, это не общий вопрос «как повернуть один вектор на другой».

Я бы хотел нравится получать аффинное преобразование (в матричной или кватернионной + векторной форме) из двух наборов по 3. Их можно рассматривать как «маркерные точки» на твердых телах или как конечные точки векторов «вперед и вверх». это не общий вопрос «как повернуть один вектор на другой». Я хотел бы получить аффинное преобразование (либо в матрице, либо в кватернионе + ...

Обратите внимание, что, хотя это звучит похоже, это не общий вопрос «как повернуть один вектор на другой».

Я бы хотел нравится получать аффинное преобразование (в матричной или кватернионной + векторной форме) из двух наборов по 3. Их можно рассматривать как «маркерные точки» на твердых телах или как конечные точки векторов «вперед и вверх».

Я хотел бы получить аффинное преобразование (либо в матричной, либо в форме кватерниона + вектора) из двух наборов по 3 точки. Их можно рассматривать как «маркерные точки» на твердых телах или как конечные точки векторов «вперед и вверх».

Я хотел бы получить аффинное преобразование (либо в матричной, либо в форме кватерниона + вектора) из двух наборов по 3 точки. Их можно рассматривать как «маркерные точки» на твердых телах или как конечные точки векторов «вперед и вверх». Необходим сдвиг и вращение, масштабирование не требуется. Кроме того, решение кватернион + вектор было бы плюсом, так как оно позволило бы мне втиснуть 1/3 больше экземпляров в пакет чертежей (8 форм вместо 12). Намерение состоит в том, чтобы иметь систему для определения позы (шарнирно-сочлененных или нет) рыхлых тел интуитивно понятным способом, без необходимости поддерживать и проходить сложную иерархию.

Первое очевидное упрощение - исключить трансляционную часть, выбрав одну точек и вычитая «пункт назначения» из соответствующей «начальной» точки. Теперь нам нужно иметь дело только с вращением.

Существует хорошо известное экономичное в вычислительном отношении решение построения кватерниона, вращающего один вектор на другой, а именно q (cross (v1, v2); sqrt (v1.len_sq * v2.len_sq) + точка (v1, v2)) или q (cross (v1, v2); 1 + точка (v1, v2)) для векторов единичной длины. К сожалению, этот метод не имеет понятия «направление вверх» и, следовательно, всегда вращается по кратчайшей дуге (что приведет к смещению объектов). Наивно было бы просто использовать этот метод для обоих векторов и умножить кватернионы вместе, но это, очевидно, не сработает так просто. Что нужно сделать, это выбрать один из двух векторов (назовем его «вперед») и создать кватернион для этого, затем повернуть другой («вверх») вектор, используя этот кватернион, а затем построить второй кватернион. для повернутого вектора «вверх» (и целевого вектора «вверх») и, наконец, умножьте второй на первый кватернион. Насколько я могу судить, это будет правильно, но это также ужасно сложно.

Теперь ... что касается матриц вращения, я знаю "метод триад", который я понимаю следующим образом : - Ортонормировать векторные пары (как начало, так и конец) - Это приводит к двум ортонормированным базам, которые представляют собой соответствующие матрицы вращения для начала и конца «общей системы отсчета». Неважно, что это за система отсчета, важно только то, что она одинакова для обоих. - S - это преобразование из «общего кадра» в начальный кадр, а D - это преобразование в конечный кадр, соответственно. - Следовательно, S -1 * D * v преобразует любую точку из начальной в конечную систему координат (проходя через общий опорный кадр). - S -1 == S T , поскольку это ортонормированная матрица, и S T * x = x * S - Следовательно: S T * D * v = D * S * v

Это должно работать, но все еще кажется довольно сложным для чего-то, что на самом деле должно быть действительно очень простым.

Есть ли там более простое и понятное решение?

8
задан Damon 12 January 2011 в 14:46
поделиться