2013-11-02 2 views
5

Я должен сделать домашнее задание, и я пытаюсь реализовать функцию lookAt. Я пытался по-разному, но единственный результат, который я получил, - это синий экран. Остальная часть моей программы работает очень сильно, infact, если я использую glm :: lookAt, все хорошо. Это мой код:Функция LookAt: я схожу с ума

mat4 Transform::lookAt(const vec3 &eye, const vec3 &center, const vec3 &up) 
{ 
    vec3 w(glm::normalize(eye - center)) ; 
     vec3 u(glm::normalize(glm::cross(up, w))); 
     vec3 v(glm::cross(w, u)) ; 
    mat4 ret = mat4 (
     vec4 (u.x,v.x,w.x,0), 
      vec4 (u.y,v.y,w.y,0), 
      vec4 (u.z,v.z,w.z,0), 
     vec4 (-u.x*eye.x-u.y*eye.y-u.z*eye.z, 
      -v.x*eye.x-v.y*eye.y-v.z*eye.z, 
      -w.x*eye.x-w.y*eye.y-w.z*eye.z, 
      1) 
    ); 
    return ret; 

ответ

9

Я видел, что вы используете библиотеку GLM для матричных операций, поэтому из кода GLM реализация LookAt выглядит следующим образом:

mat4x4 lookAt(vec3 const & eye, vec3 const & center, vec3 const & up) 
{ 
    vec3 f = normalize(center - eye); 
    vec3 u = normalize(up); 
    vec3 s = normalize(cross(f, u)); 
    u = cross(s, f); 

    mat4x4 Result(1); 
    Result[0][0] = s.x; 
    Result[1][0] = s.y; 
    Result[2][0] = s.z; 
    Result[0][1] = u.x; 
    Result[1][1] = u.y; 
    Result[2][1] = u.z; 
    Result[0][2] =-f.x; 
    Result[1][2] =-f.y; 
    Result[2][2] =-f.z; 
    Result[3][0] =-dot(s, eye); 
    Result[3][1] =-dot(u, eye); 
    Result[3][2] = dot(f, eye); 
    return Result; 
} 

Вы сначала нормализовать векторы вы будете использовать (f - это направление, на которое вы смотрите, u вверх и s - это правильный вектор). Затем, чтобы убедиться, что вверх вектор перпендикулярно направлению и правых векторов вы пересчитывать его в качестве кросс продукта, потому что, когда вы даете вектор до вы не можете убедиться, что его перпендикулярно глаза -центр вектора (вид в направлении), они просто образуют плоскость, которая дает вам правый вектор.

Матрица построена из этих. Для более подробной информации, как это работает, проверьте страницу http://www.songho.ca/opengl/gl_transform.html. Вкратце: это матрица, которая создает вам новую систему координат, поэтому coloumns - это оси. Затем при последнем coloumn применяется матрица перевода.

(Посмотрите на единичную матрицу:

AXIS  TRANSFORM 
x y z transl. 
1, 0, 0, 0 
0, 1, 0, 0, 
0, 0, 1, 0 
0, 0, 0, 1 

Это дает стандарт системы координат без перевода.)

Затем умножить это с проекционными и модели матриц (р * v * м) , порядок важен. Когда вы пишете свою реализацию, убедитесь, что вы используете основные матрицы coloumn, из-за opengl или транспонируете их.

Надеюсь, это поможет.