Задача следующая, имеется заданый вектор A, в определенном пространстве M, нужно повернуть объект так, чтобы начальный вектор B этого объекта совпадал с заданым. Чем можно это реализовать и каким образом? Для примера приведу следующий код: Код (Text): glMatrixMode(GL_MODELVIEW); glLoadIdentity(); ... glLoadMatrixf(@SimpleMatrix); // определенное пространство М // берем вектор A из центра, текущей матрици в заданую точку. ... glPushMatrix; // Тут надо реализовать поворот текущей матрици так, // чтобы ось круга (текущая ось Z) проходила через заданый вектор А. oglCircle(100); glPopMatrix; Все что я смог придумать это использовать glRotate, а именно надо повернуть текущую матрицу на угол между векторами A и B через вектор оси угла между векторами, а вот как найти этот вектор, я не знаю...
Координаты вектора для поворота вокруг него: y1*z2-y2*z1, x2*z1-x1*z2, x1*y2-x2*y1 Находится из векторного произведения двух исходных векторов. Соответственно угол, на который нужно повернуть находится из скалярного произведения векторов: a*b=|a|*|b|*cos(theta) theta=arccos((x1*x2+y1*y2+z1*z2)/(sqrt(x1^2+y1^2+z1^2)*sqrt(x2^2+y2^2+z2^2)))
Задача имеет бесконечное количество решений. После совмещения векторов остается еще одна степень свободы - векторы можно вертеть вокруг своей оси.
KeSqueer Спасибо! Способ заработал, только почему-то угол theta должен быть отрицательный. _DEN_ т.к. в моем случаи окружность, степень свободы не влияет на отображение, и вращение вектора вокруг своей оси, для окружности, не заметно.
glRotate вращает против часовой стрелки. Возможно, нужно поменять знак у вектора, вокруг которого идет поворот.
По сути нужно найти матрицу перехода от вектора A к B. Строим матрицы M_A и M_B, в которых компоненты dir соотвественно векторы A и B. M_A * M_T = M_B. M_B * (обратная(M_A)) = M_T. Или строим кватернион, а из него получаем матрицу.