If gluLookAt isn't doing what you think it should, look carefully at exercise 5.6.1 on pp 264-265, and perhaps explore exercise 5.6.2 to verify your understanding.

(You can work around this grossness, to some extent, by abusing glOrtho, but a better way is to use glFrustum. Yes, I had to look it up too.)

Thanks to Toby for figuring this stuff out.