Yet some gluLookAt trouble

Hello,

Okay, I’m getting really agry about this thing. Here´s the code I’m trying to make work onto a way of walking like a first person shooter. But when I’m aligned to the x-axis of the world, some strange things happen. Take a look and see if you find any errors (delphi code, shouldn’t be difficult for you guys to understand though)

(the setup procedure)
procedure TForm1.FormCreate(Sender: TObject);
begin
InitGl;

 upve[1]:= 1;

 posi[0]:= 0;
 posi[1]:= 0;
 posi[2]:= -5;

 vect[0]:= 0;
 vect[1]:= 0;
 vect[2]:= 1;

 cent[0]:= posi[0] + (vect[0] * 1);
 cent[1]:= posi[1] + (vect[1] * 1);
 cent[2]:= posi[2] + (vect[2] * 1);

end;

(the movement procedure)
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
var
u: single;
begin
//walk front
if key = VK_UP then begin
u:= 0.1;

      posi[0]:= posi[0] + (vect[0] * u);
      posi[1]:= posi[1] + (vect[1] * u);
      posi[2]:= posi[2] + (vect[2] * u);

      cent[0]:= posi[0] + (vect[0] * 1);
      cent[1]:= posi[1] + (vect[1] * 1);
      cent[2]:= posi[2] + (vect[2] * 1);
 end;

 //walk back
 if key = VK_DOWN then begin
      u:= 0.1;

      posi[0]:= posi[0] - (vect[0] * u);
      posi[1]:= posi[1] - (vect[1] * u);
      posi[2]:= posi[2] - (vect[2] * u);

      cent[0]:= posi[0] + (vect[0] * 1);
      cent[1]:= posi[1] + (vect[1] * 1);
      cent[2]:= posi[2] + (vect[2] * 1);
 end;

 //look left
 if key = VK_F1 then begin
      u:= 5;

      RotateY(u, vect);
      cent[0]:= posi[0] + (vect[0] * 1);
      cent[1]:= posi[1] + (vect[1] * 1);
      cent[2]:= posi[2] + (vect[2] * 1);
 end;

 //look rigth
 if key = VK_F2 then begin
      u:= -5;

      RotateY(u, vect);
      cent[0]:= posi[0] + (vect[0] * 1);
      cent[1]:= posi[1] + (vect[1] * 1);
      cent[2]:= posi[2] + (vect[2] * 1);
 end;

 //look up
 if key = VK_F3 then begin
      u:= -5;

      RotateX(u, vect);
      cent[0]:= posi[0] + (vect[0] * 1);
      cent[1]:= posi[1] + (vect[1] * 1);
      cent[2]:= posi[2] + (vect[2] * 1);
 end;

 //Look Down
 if key = VK_F4 then begin
      u:= 5;

      RotateX(u, vect);
      cent[0]:= posi[0] + (vect[0] * 1);
      cent[1]:= posi[1] + (vect[1] * 1);
      cent[2]:= posi[2] + (vect[2] * 1);
 end;

 normalize(vect);

end;

(the draw procedure)
procedure TForm1.WMPaint(var message: TWMPaint);
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

 glLoadIdentity;

 gluLookat(posi[0], posi[1], posi[2], //position
           cent[0], cent[1], cent[2],  //center
           upve[0], upve[1], upve[2]); //up

 //draw some objects

end;

(the normalize, rotateY and RotateX functions)
procedure Normalize(var dest : TVector);
var
leng : Single;
scaleFactor : Single;
begin
leng := Len(dest);
if (leng = 0.0) then
Exit;

scaleFactor := 1.0/leng;

dest[0] := dest[0] * scaleFactor;
dest[1] := dest[1] * scaleFactor;
dest[2] := dest[2] * scaleFactor;
end;

procedure RotateX(ang : Single; var dest : TVector);
var
y0, z0 : Single;
radAng : Single;
begin
y0 := dest[1];
z0 := dest[2];
radAng := DegToRad(ang);

dest[1] := (y0 * cos(radAng)) - (z0 * sin(radAng));
dest[2] := (y0 * sin(radAng)) + (z0 * cos(radAng));
end;

procedure RotateY(ang : Single; var dest : TVector);
var
x0, z0 : Single;
radAng : Single;
begin
x0 := dest[0];
z0 := dest[2];
radAng := DegToRad(ang);

dest[0] := (x0 * cos(radAng)) + (z0 * sin(radAng));
dest[2] := (z0 * cos(radAng)) - (x0 * sin(radAng));
end;

Okay, let me explain the variables: posi is an array that sets the position of the camera, center is the center point of the scene, up is the up-vector and vect is the vector to where I’m pointing.

Sorry for the long post, but I’m busting my brains out of this.

Thanks,
Matheus.