Скажите, что ваше целевое положение находится в точке T, а ваше положение спрайтов - P, тогда вектор T-P указывает на направление от P до T. Таким образом, вы должны выровнять текстуру в этом направлении. Для этого вам не нужно делать тригонометрию! Итак, вот как это получается:
Tx и Ty - это положения x и y T, и точно так же Px и Py для P. Вектор T - P => (Tx - Px, Ty - Pz) = D_l. Мы хотим, чтобы этот вектор был нормирован, что можно сделать, масштабируя элементы вектора с длиной 1 (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)
и просто для completenes
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
, или если вы хотите поместить в него положение, тоже, а затем загрузить следующую vaiant с помощью glLoadMatrix
B.x D.x 0 P.x
B.y D.y 0 P.y
0 0 1 P.z
0 0 0 1
Звучит хорошо, но выйти трудно понять, я не получаю то, что вы точно означает. –
Какая часть точно? – ltjax
знание математики помогает в этих ситуациях ....: p –