Large Point Clouds: San Simeon

A while ago, I wrote about a scalable pipeline for processing point clouds. While the text gave an overview of what such a pipeline might look like, it was quite abstract. This time, instead of hand-waving on a very high level, I’m going to present some actual results.

There is a great point cloud data set of a coastline in San Simeon, CA available at OpenTopography. The data represents a 75-mile slice of coastline in San Luis Obispo County, California. The 800 km2 area (195,000 acres) of Lidar data was scanned in 2013 by flying over the area with a Cessna Caravan.

At a resolution of roughly 22 points per m2, the input data totals 17.7 billion points. The original download of the data (very compressed laszip) is roughly 86 GB, some hundreds of gigabytes uncompressed.

So, of course we took this data and Umbrafied it the other day. It took a couple of hours to crunch through it, but the results look pretty good.

Using our pipeline, the 17.7 billion points turn into an optimized and streamable model which consists of triangle meshes and materials. The model gets streamed into the rendering app at the appropriate level of detail, which depends on what you’re looking at and from which distance. Oh, and it works equally well on workstations, mobile devices and headsets.

The produced output is a couple of hundred gigabytes in total, including geometry and textures, for all different hardware targets. But the beauty of it is that only a tiny part of that total will have to be streamed in and rendered at any given time. Here you can see how the system scales regardless of whether you’re looking at a small area in the model or the entire 75-mile slice:

Here’s the same zoom-out in wireframe, illustrating how the level of detail changes based on the distance, yielding roughly a constant amount of rendering overhead no matter how far away you are from the model. You can also see the adaptive tessellation, meaning larger and fewer polygons in areas where there isn’t a lot of high-frequency detail: