I have been trying for a while now to figure out the best way to write a 3D tile engine using one of the scene graph APIs (like JME, Java3D, Xith etc). I want to create a tile based terrain engine like the many found in isometric tile games but in 3D so the player has a limited movement of view and zoom from above and at a slight angle. The game Civilization most closely resembles what I am aiming for.
I have played with heightmaps but the main problem I faced there is that I need a varying degree of detail from one tile to the next and heightmaps have a uniform level of detail. So 'grassland' tiles should only be a few vertices, whereas a mountain should be 128 or 256 - each occupying the same amount of x,z area. I then tried just creating tiles and mapping them out side by side but with around 60x60 tiles in view thats 3600 objects which the engine has to deal with and thats before I've started putting other details onto the terrain like units, cities, oilfields etc. The total size of the maps need to be big (around 300x300 tiles) but I have realised I can only load a subset at any one time as trying to put that many objects into memory (even tried using a quadtree) is not feasible. Anyway, mapping out the tiles side by side gave very poor results so I am looking for another solution.
I thought about grouping several tiles together into segments (e.g. 16x16) and handling those as chunks which could improve things as it would seriously reduce the number of objects the engine would need to deal with. But I am still quite new to 3D and wouldnt know how to sew two tiles together that have different levels of detail (e.g. grassland with 2x2 vertices next to mountain with 16x16). Also each segment of land could potentially end up having a huge number of vertices if all/most of the tiles were mountains (very unlikely but possible) so I am worried that having - as I calculated - around 100,000 vertices on screen at once would grind even a reasonable GPU to a halt once other details and units etc start to get added.
Cutting right to the chase, is there a reasonable solution or source code out there I can look at that implements this kind of thing? I am currently using jME at the moment which seems very good but if someone has experience with either Java3D or Xith (or other) and is aware of some features in those APIs that might help me I would appreciate hearing about it. ...and any other general advice you might think would be useful I would appreciate very much too