Вам не нужно использовать glRotate для этого.Вы уже поняли, что знаете что-то, целевое направление.Но направление цели - это еще не все, вы все равно можете вращать объект вокруг оси прицеливания, поэтому вам также необходим вектор Up.
Это локальная ось Z объекта (или любая другая матрица, которую вы можете обозначить как "вперед").Вы можете нормализовать этот вектор и поместить его в столбец Z матрицы преобразования объектов.
Вектор Up должен быть перпендикулярен к оси цели.Либо он у вас есть, либо вы выводите его из предположения, что вектор «Вверх» объекта должен, по крайней мере, идти вверх, то есть иметь компонент Y.Вы можете получить вектор, направленный вверх и перпендикулярно целевой оси, беря скалярное произведение вектора с целевой осью и вычитая из целевой оси вектор целевой оси, масштабируемый скалярным произведением, затем нормализуйте.Допустим, Y вырос:
U = normalize( T - T · Y )
Наконец, вам нужна третья локальная ось L. Это можно получить, взяв перекрестное произведение U и T, то есть
L = U × T
Получивиз них вы строите матрицу
Lx Ux Tx 0
Ly Uy Ty 0
Lz Uz Tz 0
0 0 0 1
и передаете ее в OpenGL, используя glMultMatrix (фиксированная функция), или умножаете ее на свой собственный управляемый стек и снабжаете его glUniformMatrix (шейдеры).
Обратите внимание, что glMultMatrix индексирует элементы матрицы в следующем порядке
0 4 8 c
1 5 9 d
2 6 a e
3 7 b f