So we have been working on a full open world map system.
First version ended up being a 360* x 180* map system with a 36,000 x 18,000 km world area.
Yes this is BIG, 144GB of Terrain Data to be exact.
We use a dynamically loading terrain chunk system. Which uses custom Asset files to load TerrainData, as well as all environment structures, and NPC spawn points. Each spawn point then loads a NPC from the designated Asset file for that NPC.
v1.0 Cylindrical Mapping System
This is the simplest of ways to translate a Vector2 (x,y) map system to a world map. The main problem being of course is this is a Cylindrical Map System.
Diameter of x in this case 36,000 is maintained at all times while traveling +/-9,000km. This is not Spherical! But the easiest to do.
v2.0 6-sided-cube Mapping System
Next we have moved to Version 2.0 which is a 6-sided-cube Map. We are representing the world a 6 faces each with +/-45* on it in each access. This method of using a six 90* x 90* maps seems the best. But at the same time has some issues of it’s own.
We store the map data in a Vector3 system (x,y,side[0-5]). This works rather well
The main problem is when a player reaches one of the 8 cube points in the world. We are displaying the environment to the user as flat Vector2 Terrain elements. So you need 4 terrain chunks to meet at a point of junction. Which works except at these 8 point. Where you only have 3 terrain chunks available.
Work around so far that we have is to confuse the end user. We do this by creating what I refer to as a deadzone terrain chunk. This area of the world is void of an distinguishable features to the horizon. By doing this you are able to fill in the fourth unavailable terrain chunk with a deadzone chunk as well.
a good example of deadzone chunks would be continuous ocean surface.
One solution is graphically fill in the empty space with a deadzone chunk. And translate the user to the correct piece. But Issues arise when dealing with multiplayer. As player location cross chunks get distorted. As well the effect of the deadzone can also be observed from high altitude flying.
Other option is to preform a distortion to remove the empty area at rendering/runtime. Basically making a 270* area appear to be a 360* area to the user.
v3.0 Instanced 6-sided-cube Mapping System
The third option is to stay with the 6 sides mapping, but instance separate the user from each side. The end user experiences a load screen which masks the change from side to side. but this removes the world map from being truly an open world map. But leaves you with no issues. Typically you would use a mass transit system to move them between sides. And design the surface that no terrain can allow travel from side to side. This would exclude user controlled boats, planes or spacecraft from exiting via a side.
As you can see making a 2D world map is a lot simpler then a full 3D spherical one. As a rectangular area can not be translated into a spherical system with out a lot of pitfalls. Which is why most maps remain a sliced area of a side. and never a full 100% open world.
Please leave any comments or discussions on the technical difficulties of designing around a spherical open world map system here. I will try and watch and respond the thread.