Поворот вектора

komander

Сразу предупрежу - вопрос нупский, просьба в меня не плеваться
Итак, имеется ориентированный обьект (ну или система координат определяемый вектором (x, y, z задающим точку привязки (origin и ротатором (pitch, yaw, roll) - тройкой углов, из которых первые два задают вектор направления стандартным образом - (cos[pitch]*cos[yaw], cos[pitch]*sin[yaw], sin[pitch] а последний (roll) определяет поворот вокруг этого вектора.
Еще есть ось, заданная по тем же самым правилам. Нужно повернуть первый вокруг второй на некоторый угол. Результатом должна быть пара (вектор, ротатор) - это обязательное требование.
Типа объясните плиз как сделать. То есть, другими словами, выпишите плз матрицы преобразований для первой и второй компоненты.
Пусть для определенности первый вектор называется V1, второй V2, угол A, а поля - так как указано.
И да, несколько замечаний.
1) Объяснять нужно как совсем-совсем тупому, реальни. 2) В гугл просьба не посылать, не помогает. 3) Всякими хаками типа gl*-функциями и аналогов пользоваться нельзя, вот.
Надеюсь на помощь, т.к. в пространственной геометрии не рублю совсем

vitamin8808

http://ru.wikipedia.org/wiki/%CA%E2%E0%F2%E5%F0%ED%E8%EE%ED%...
ЗЫ А что за придурок мне все посты минусует? :)

komander

Да-да, кватернионы это замечательно, но они как бы вращают направляющий вектор, а не всю систему. Собственно, вся сложность и была в правильном преобразовании roll'а.

natunchik

Считать матрицы мне влом, поэтому тебе придётся всё-таки включить моск и сделать это самому.
Если тебе нужно получить ответ именно в символьном виде, то желательно обзавестись какой-нибудь штукой вроде мапла, которая тебе всё символьно посчитает, руками задолбаешься делать, если же результатом должен стать код, то прям записываешь всё, что я говорю.
1) Все вычисления производятся в гомогенных координатах, обычные координаты с ними связаны так: (x, y, z) => (x, y, z, 1 (x, y, z, w) => (x/w, y/w, z/w)
2) матрица сдвига в них выглядит так: так, матрицы вращений вокруг осей найдёшь по ссылкам оттуда.
3) переводишь оба преобразования в матричный вид: сдвигаешь на -origin, поворачиваешь последовательно на углы (в порядке roll, pitch, yaw сдвигаешь на origin. То есть это произведение пяти матриц. Которое ты либо воплощаешь в код, либо считаешь в мапле.
4) умножаешь первую матрицу на вторую, получаешь искомый оператор преобразования.
5) разлагаешь его обратно на произведение матрицы переноса, матриц вращения, матрицы переноса обратно. Ну, я не знаю, по сути у тебя в результате третьего шага должно получиться общее описание матрицы вращения, зависящее от этих шести переменных, приравниваешь её матрице, получившейся на четвёртом шаге и аккуратно решаешь получающуюся систему уравнений.
Вот. Может, можно проще, но это гарантированно сработает.
Оставить комментарий
Имя или ник:
Комментарий: