2011-02-04 3 views
2

Используя openGL (только 2d), я пытаюсь повернуть текстуру, чтобы она указывала на точку на экране. Сначала я покажу изображение, чтобы помочь мне объяснить.OpenGL, вращающийся к точке

http://img692.imageshack.us/img692/3088/probe.png

Say моя текстура синяя точка в точке 1 и движется к месту назначения в пункте 2. Я хочу, чтобы повернуть # 1, так что «наведение» по отношению к точке 2 (текстура птица, так что она имеет определенный «фронт»). Для этого мне нужно выяснить угол 3. Аналогичным образом, если моя птица находится в точке № 4, идущей к точке 5, мне нужно выработать угол 6.

В чем секрет этого?

ответ

6

Решение является супер-полезной функцией std::atan2. Вычтите текущую позицию из целевого положения птицы и вещи y и x (обратите внимание на порядок!) В atan2, чтобы получить угол.

Редактировать: Обратите внимание, что atan обычно принимает 0 ° на оси X + (справа). Тем не менее, вы, кажется, выровняете свое «основное направление» с Y + вместо (вверх), поэтому вы можете вычесть 90 ° или скрипку с порядком и знаками параметров для функций атана (используя основные симметрии в круге, то есть atan2(-x,y)).

+0

Звучит хорошо, но выйти трудно понять, я не получаю то, что вы точно означает. –

+0

Какая часть точно? – ltjax

+2

знание математики помогает в этих ситуациях ....: p –

2

Скажите, что ваше целевое положение находится в точке 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 
+0

+1 не нужно использовать atan2 в этом случае. – rotoglup

Смежные вопросы