OpenGL вращается к точке - PullRequest
       0

OpenGL вращается к точке

2 голосов
/ 04 февраля 2011

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 04 февраля 2011

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

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

2 голосов
/ 04 февраля 2011

Скажем, ваша целевая позиция в точке 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 
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...