2013-11-02 25 views
5

Muszę zrobić pracę domową i staram się zaimplementować funkcję lookAt. Próbowałem na wiele sposobów, ale jedynym rezultatem, jaki otrzymałem, jest niebieski ekran. Reszta mojego programu działa bardzo dobrze, jeśli użyję glm :: lookAt all is good. To jest mój kod:Funkcja LookAt: idę zwariować

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; 

Odpowiedz

9

Widziałem, jak korzystać z biblioteki GLM dla operacji macierzowych, więc z kodu GLM realizacja LOOKat wygląda następująco:

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; 
} 

najpierw normalizuje wektory będą używane (f jest kierunkiem, na który patrzysz, u s do góry i s jest właściwym wektorem). Następnie, aby upewnić się się wektorem jest prostopadła do kierunkui odpowiednich wektorów ponowne obliczenie go jako produktu poprzecznym, bo kiedy dać górę wektor nie można kierować się jej prostopadle do oka wektor centrum (kierunek widoku), tworzą one płaszczyznę, która daje prawą wektorową.

Na tej podstawie zbudowana jest macierz. Aby uzyskać więcej informacji, jak to działa, sprawdź stronę http://www.songho.ca/opengl/gl_transform.html. W skrócie: jest to macierz, która tworzy nowy układ współrzędnych, więc kolory są osiami. Następnie na ostatni kolor zostanie zastosowana macierz tłumaczenia.

(Spójrz na matrycy tożsamości:

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

Daje to standardowy system współrzędnych bez tłumaczenia).

Następnie należy pomnożyć to z projekcji i modeli matryc (p * v * m) , kolejność jest ważna. Kiedy piszesz swoją implementację, upewnij się, że używasz głównych matryc kolorów z powodu opengl lub transponuj je.

Mam nadzieję, że to pomaga.