Скажем, ваша целевая позиция в точке T, а ваша позиция спрайтов - P, тогда вектор TP указывает в направлении от P до T. Так что вы должны выровнять текстуру в этом направлении.Вам не нужно делать тригонометрию для этого!Итак, вот как это происходит:
Tx и Ty являются позициями x и y для T, и таким же образом Px и Py для P. Вектор T - P => (Tx - Px, Ty -Pz) = D_l.Мы хотим, чтобы этот вектор был нормализован, что можно сделать, масштабируя элементы вектора с 1 / length (D_l).Таким образом, мы получаем D_l по
D.x = D_l.x / sqrt( D.x^2 + D.y^2 ) = (T.x - P.x) / sqrt( (T.x - P.x)^2 + (T.y - P.y)^2 )
D.y = D_l.y / sqrt( D.x^2 + D.y^2 ) = (T.y - P.y) / sqrt( (T.x - P.x)^2 + (T.y - P.y)^2 )
и только для полных
D.z = 0
Таким образом, D теперь является вектором, содержащим направление к цели, то есть направление вверх для спрайта.Теперь нам нужно правильное направление.Теперь мы могли бы сделать несколько причудливых трюков со склонами, но есть более простой способ: мы хотим найти вектор, перпендикулярный плоскости, натянутой на вектор направления, и вектор, смотрящий вниз на сцену, то есть направление Z.Т.е. мы хотим найти перекрестное произведение, дающее двунаправленное направление D × Z = B
Вспоминая определение перекрестного произведения и учитывая Zx = Zy = 0, Zz = 1
B.x = D.y · Z.z - D.z · Z.y = D.y
B.y = D.z · Z.x - D.x · Z.z = -D.x
B.z = D.x · Z.y - D.y · Z.x = 0
Точно так же, как ожидаемый Bz = 0. Из этого вы можете создать матрицу вращения:
B.x D.x 0 0
B.y D.y 0 0
0 0 1 0
0 0 0 1
=
D.y D.x 0 0
-D.x D.y 0 0
0 0 1 0
0 0 0 1
, которая является ортонормированной матрицей и, следовательно, описывает вращение.Вы можете применить вращение к этой матрице, используя glMultMatrix
, или, если вы также хотите поместить в нее позицию, затем загрузить следующий вариант, используя glLoadMatrix
B.x D.x 0 P.x
B.y D.y 0 P.y
0 0 1 P.z
0 0 0 1
.