We are developing a Google Earth like application and we are tring to utilize a Spherical View-Dependent (Adaptive) LOD method.
Before the details I need to mention two things:
- We are using a Quad-Tree containing the tiles. (a regular subdivision method is applied)
- The tiles acquire their height values as they are generated. The complete heightmap is not available.
We have read almost anything we can find about the subject (vterrain was our primary source) but if not all, most papers assumes that the heightmap of the whole terrain is known beforehand (especially when calculating the object space errors). Well it is not the case for us. Our application acquires the height values on demand through a seperate layer.
What we are primarily interested in is the LOD to be completely view-dependent. We want the area focused to be the most detailed (of course the viewer distance is a consideration - closer parts are more detailed even if not focused) and the area around it to be less detailed and so on. In other words, we do not like to show an area more detailed just because it has dramatic height changes in it.
We are not completely blank about the subject. Here is a screenshot of where we are:
Here, what we consider are:
the distance of the viewer to the tile's nearest point. (primary variable)
the angle between the vectors;
- from viewer to the nearest point of the tile
- from the viewer to the focal point (as it grows allowed distance to be in a specific level is reduced)
the angle between the vectors;
- from the center of the earth to the viewer
- from the center of the earth to the tile's closest point (same as above)
When there is a camera movement, All level zero tiles (least detailed tiles) are processed and it is determined whether that tile should be more detailed or not considering these values. If it is; its children are processed the same way. Of course there is a level limit.
We played around with the values a lot: doubled them, squared them, take cosine of them, or normalized linearly, tripled and so on. But we reach nowhere better than where we currently are.
What we are aiming is the optimal triangle throughput: There is really only one tile (deglecting the edge cases) as detailed as can be. All tiles around it are one level less detailed. Around them are one more level less detailed and so on.
There may be other things that we forget to consider when determining the tile under consideration should be more detailed or not. Our formulations may be wrong or incomplete. We are sure StackOverflow is a great place, members of which can help us. Any help would be greatly appreciated.