for opengl i use this:

[pascal]
function lookat(cameraPosition, cameraTarget: tvector4f): tmatrix4x4;
var zaxis, xaxis, yaxis: tvector4f;
begin
cameratarget := multiply(cameratarget,-1);
zaxis := normalize(sub(cameraTarget, cameraPosition));
xaxis := normalize(cross(vector4f(0,1,0,0), zaxis));
yaxis := cross(zaxis, xaxis);

result := matrix4x4(xaxis.x, yaxis.x, zaxis.x, 0,
xaxis.y, yaxis.y, zaxis.y, 0,
xaxis.z, yaxis.z, zaxis.z, 0,
-dot(xaxis, cameraPosition), -dot(yaxis, cameraPosition), -dot(zaxis, cameraPosition), 1);
end;
[/pascal]