When thinking about the camera, it feels like you are rotating and moving the camera around in the world. That's how it looks, but that's not what actually happens. What happens is, that you are moving the world around the camera with the inverted values. That's why getZAxis() gives you the inverted directions of what you would expect. getDirection() corrects this internally, hence the difference in behaviour.