А, Разум допёр, и я тоже! +100 Разуму!
Щас я ещё подразжевать попробую.
2
smt005: давай обозначим первый вектор направления как v1, а второй - как v2, чтоб не путаццо. А матрицу оринетации изначальную - m1. Значит, задача состоит в том, чтобы посчитать матрицу ориентации, соответствующую новому вектору ориентации v2, так?
Это мы сделаем, повернув матрицу m1 на тот же угол, на который повёрнут v2 относительно v1.
Для того, чтобы повернуть m1, нам нужна матрица поворота (Разум привёл её - я глянул, в доках ОпенГЛя для функции glRotate та же формула). А чтобы её составить, требуется знать вектор, вокруг которого осуществляется поворот (r) и угол поворота (О), либо синус и косинус этого угла.
!!! Вектора r1 и r2 должны быть единичной длины!!!
Найдём косинус угла поворота:
cosO = dot(r1,r2);
Вектор поворота вычислим: для этого векторно умножим r1 и r2:
r = cross(r1, r2);
Учти, что если вектора совпадают по направлению (ориентация не менялась), то получится нулевой вектор (|r|=0) - в таком случае дальше вычислять ничего нельзя.
Синус найти легко - это длина вектора r (
):
sinO = |r|;
Под конец не забудь нормализовать вектор поворота:
r = normalize(r);
После этого составляй матрицу поворота по формуле Разума (x,y,z в ней - координаты вектора r).
Когда матрица поворота есть (М), юзай её для поворота матрицы ориентации m1.
Тут я не уверен, какая из матриц слева, какая справа, и нужно ли какую из них транспонировать.
Но если так логически прикинуть, то раз нам нужно повернуть (трансформировать)матрицу m1, то, наверное, она должна быть справа (по аналогии с трансформируемым вектором), а матрица поворота M - слева...
Разум с Фрозеном, лучше знают.