It's me again.

The problem with scalling has been solved once and for all. Everything works like a charm.

Now, I want to expand the possibilities of my camera class by adding a third-person mode. The idea to create the camera matrix is simple:
[code=delphi]
CachedMatrix := LookAt(Position, Target.Position, Vec3(0.0, 1.0, 0.0));
[/code]
This works great, but now, how do I implement moving and strafing? In a first-person mode, I used these:
[code=delphi]
procedure TBrainCamera.Move(const AFactor: Single);
begin
if (AFactor <> 0.0) then
begin
FDirection := Mat4GetDirectionVector(Mat4CreateRotationEuler(Rot ation));

case FCamType of
ctFree:
Position := Vec3(Position.X + (FDirection.X * -AFactor),
Position.Y + (FDirection.Y * -AFactor),
Position.Z + (FDirection.Z * -AFactor));
ctFirstPerson:
Position := Vec3(Position.X + (FDirection.X * -AFactor),
Position.Y, Position.Z + (FDirection.Z * -AFactor));
end;

UpdateNeeded := True;
UpdateInvNeeded := True;
end;
end;
procedure TBrainCamera.Strafe(const AFactor: Single);
begin
if (AFactor <> 0.0) then
begin
FDirection := Mat4GetDirectionVector(Mat4CreateRotationEuler(Rot ation));
Position := Vec3(Position.X + (FDirection.Z * -AFactor),
Position.Y, Position.Z + (-FDirection.X * -AFactor));

UpdateNeeded := True;
UpdateInvNeeded := True;
end;
end;
[/code]

My first idea was to translate the target object and change the camera position accordingly to a new target's position. So the code for a third-person camera would be here:
[code=delphi]
procedure TBrainCamera.Move(const AFactor: Single);
begin
{...}
ctThirdPerson:
begin
Target.Move(AFactor);
Position := Vec3Subtract(Target.Position, Position);
end;
[/code]
But this approach doesn't seem to work.

EDIT
I followed the instructions given here, but it didn't help either.

From all I know, the best thing would be to base the camera on quaternions, but that would mean re-inventing the whole design from the ground up. I don't want them and I believe it can be done on Euler angles.

Do you have any suggestions?