For basic/generic 3d programming I found the Irrlicht engine to be very helpful. It's a snap to load simple map data and make it interact with physics routines. For future projects you can also add TrueAxis to your browser bookmarks. Create an object, give it graphics properties using Irrlicht and connect it to a physics object in TrueAxis. Manipulate the TrueAxis object using forces and in a different thread make the Irrlicht object draw itself. That's all you have to do and you can already start implementing the gamedesign.
The Irrlicht project also has an xml engine IrrXML that makes loading config files easy as "int bitdepth = xml_load(pointerToFile, "bitdepth");" and a basic sound engine IrrKlang.
That said, for your programming experience it is useful to do the gfx implementation the hard way once and actually come up with your own ways of drawing real time shadows using stencil buffering instead of telling an engine "IrrlichtGraphicsObject.drawShadow();".
The above structure of "Irrlicht for the graphics, TrueAxis for the physics, SDL_net for networking, IrrXML for loading data, IrrKlang for sounds, etc. ..." will force you to structure your objects very well. You will only look at the code that represents your game design. You will never mix different tasks like game design and sound calls in one c++ object. That makes code look very nice and easy to maintain/restructure. If done well you can exchange the complete graphics engine merely by editing the constructor of your most basic entity-object.
Vain