Вращение OpenGL в заданном направлении - PullRequest
3 голосов
/ 09 августа 2011

Я думаю о простом способе определения поворотов в opengl.Я понял, как работает вращение вокруг любой оси на определенное количество.Я также знаю, что могу вращаться вокруг каждой оси по очереди.Но все это не помогает моей проблеме.Что я хочу сделать, так это вращать объект так, чтобы он смотрел в определенном (заданном) направлении.Таким образом, я уже знаю результат связки вращения .... как я могу добраться туда напрямую?Можно ли как-то определить направление lookAt для любого объекта?

Ответы [ 2 ]

7 голосов
/ 09 августа 2011

Вам не нужно использовать 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
0 голосов
/ 10 августа 2011

Я наконец-то смог решить мою проблему, и она на самом деле работает довольно хорошо.Спасибо datenwolf !

//direction is the direction you want the object to point at
//up- first guess
Vector3f up;
if(abs(direction.x)< 0.00001 && abs(direction.z) < 0.00001){ //If x and z are really small
if(direction.y > 0)
    up = Vector(0.0, 0.0, -1.0); //if direction points in +y direction
else
    up = Vector(0.0, 0.0, 1.0); //if direction points in -y direction
} else {
    up = Vector(0.0, 1.0, 0.0); //y-axis is the general up direction
}

//left
Vector left = cross(direction,up);
left.normalize();

//final up
up= cross(left,direction);
up.normalize();

float matrix[]={left.x, left.y, left.z, 0.0f,     //LEFT
up.x, up.y, up.y, 0.0f,                       //UP 
direction.x, direction.y, direction.z, 0.0f,  //FORWARD
position.x, position.y, position.z, 1.0f};    //TRANSLATION TO WHERE THE OBJECT SHOULD BE PLACED
glMultMatrixf(matrix);
//DRAW OBJECT
//KEEP IN MIND the z-axis of your object points now in direction direction
...