Overview

Prerequisites and Preparation

First you need a dataset that is split to individual files in a single directory. If your dataset is one single big file, you need to split it first with PCV (Tiles mode) → Tools → Split - add an empty object to scene, then go to 3d Viewport sidebar N, go to Point Cloud Visualizer tab, on top switch Mode to Tiles, Tools panel becomes accessible. See Split for more details how to use Split tools. By default the empty object will become container for Tiles instance after splitting.

If dataset is already split to multiple files you can use it as it is, or split it even further to smaller parts if overall performance is not smooth enough. Large tiles in terms of total number of points in file are slower to work with. By large is meant ~20 million points and more per file. In this case same splitting tools can be used and run in batch on whole directory of files, see Batch Split for details.

General Use

Add an Empty type object to scene (or use any other Blender object type that exists in scene), then go to 3d Viewport sidebar N, go to Point Cloud Visualizer tab, on top switch Mode to Tiles and click Select Directory , file browser will open, navigate to directory with tiles (dataset split to a grid of LAS/LAZ/E57 files) and click Select Directory button. Directory contents will be read, correct file types selected and list of tiles will be populated. Then click Draw button.

Add Menu Helper Operator

Faster and preferable way of adding PCV Tiles instance to scene is to use helper operator from Add menu: 3d Viewport header → Add or Shift+A anywhere in viewport and choose PCV: Tiles menu item. File browser will open, navigate to directory with tiles (dataset split to a grid of LAS/LAZ/E57 files), set options if needed (defaults will be set from preferences), and click Add PCV: Tiles button. Correct files will be selected from directory, tiles list populated and tiles drawn in viewport.

Add Helper

Main Panel and Tile List

When source directory is set and contents scanned for files, tile list is populated. Each row represent one file. To rescan directory for files, click at the end of directory row.

means tile is not loaded, indicates that tile linked file has been loaded. is selection status, marks selected tile. is tile show status, if enabled, tile contents will be drawn in viewport, if not only preview data or lowest LOD level will be used. means tile is enabled, means tile is disabled and will not be loaded and processed.

Under list, there are two selection modal operators, Pointer select and Box select , deselect operator and menu with utility operators.

If you select list item directly clicking it so it is highlighted, item is considered selected and active, if you click its button, it is considered selected. It makes difference in a few utility operators.

Draw and Erase are main tile set controls, one will start processing, other will stop it. Frame TileSet will move viewport camera to frame all tiles, set viewport clip start and end to preferable range and will adjust LOD Distance of tile set according to overall dimensions.

Main Panel

Pointer Select

Shade demo
data: ZABAGED® - Výškopis - DMR 5G. Digitální model reliéfu České republiky 5. generace v S-JTSK, Bpv license: CC BY 4.0

Box Select

Shade demo
data: ZABAGED® - Výškopis - DMR 5G. Digitální model reliéfu České republiky 5. generace v S-JTSK, Bpv license: CC BY 4.0

Tile List Menu

Collection of utility operators working with tile list. Some can be run at runtime when tile set is loaded, some cannot.

First section contains some more framing operators. Second selection manipulation and select by tile status flags. Third section will set flags on selected tiles. Fourth section operators remove tile list items by selection or flags. Fifth exports (copies) tile files to a another directory. And last will open source directory in system file browser.

Tile List Menu

TileSet

Tile set main settings, these have direct influence on performance.

Type switches between Sequential, Parallel and Threaded. Sequential loads files in Blender Main thread, this is option for safety and stability, it is still possible to use Blender while files are loading, but interface will be laggy until visible tiles files finish loading. Parallel will load and process files in parallel, Blender interface will be locked until all is finished, but it is the fastest way to load data. Threaded will load multiple files in other threads, interface interaction will be much smoother, files will be all loaded sooner, but Blender may become unstable, it is uncertain if you will run into problems or not. Blender is not built to be thread safe, see here for more info from Blender documentation or Troubleshooting section. The best is to leave at Sequential for first load, then if dataset fits fully in system memory when loaded, switch to Parallel so next time when blend file is opened all is loaded sooner. But you may also find that Threaded in your use case is perfectly stable.

Pause and Resume will pause or resume loading of new tile files, tiles that already started loading will finish first.

LOD enables generating of Level Of Detail levels upon loading, if disabled, only a preview level is generated at 1% of points to be used while navigating or when tile Show flag is disabled. LOD Distance controls how levels are distributed. Imagine line at the center of 3D viewport starting at camera location, pointing in camera direction of LOD Distance length, divided in LOD Levels segments with level number assigned starting at LOD Levels down to zero at far end. If tile is in camera view and bounding box center falls into any segment, til will draw assigned level, if it is further that that, zero level is used.

Unload Hidden can help managing memory by unloading tiles that are not in view, unloading can happen after some time is elapsed or immediately, depends on Preferences settings. But unless you running out of system memory (RAM) better to leave disabled.

Optimize Data controls what is loaded from source files, see next section.

Preset menu in panel header will save all settings in all subpanels into a preset.

TileSet

TileSet → Optimize Data

Controls what is loaded from source files, if disabled, all available is loaded, but this will have serious impact on system memory usage. For example on screenshot there are settings that will load all points, but only keep colors and intensity scalar. Other data are not stored and point coordinates will be stored as single precision floats.

  • Max Points - limit maximum number of points loaded, in millions
  • Keep Double Precision - keep point positions in float64 as loaded from files, for drawing on screen, single precision - float32 is used, there is not need to keep double precision in memory, takes twice as much space
  • Keep Colors - disable if dataset has no colors or colors are stored, but all zeros
  • Keep Normals - it is very probable your dataset has no normals anyway, and so far normals are not used for anything yet
  • Keep Scalars - disable to not store scalar values at all, enable to keep all or select fields if its name matches any of comma separated strings in field next to it

Optimize Data

TileSet → States

Define and store tile set states. State includes tile status and selection flags and you can quickly switch between stored states. Ideal for datasets that cannot fit into memory, or to improve performance of large dataset if you need to focus to just one section of it. Using selection modal tools and select tiles and set flags on them as needed, click to store state. will update already stored state with current.

To switch between stored states, click button, means current state of tiles is identical to stored state.

States

States list menu with several options

  • Apply Selected State - same function as button
  • Check State Identity - enable or disable identity indication with and , disable if ui is not as responsive as it should be
  • Check Identity Including Selection - enable or disable selection comparison
  • Apply Selection From State - restore selection flag on tiles when restoring state or not
  • Clear Stored States - remove all stored

States

Shade demo
data: ZABAGED® - Výškopis - DMR 5G. Digitální model reliéfu České republiky 5. generace v S-JTSK, Bpv license: CC BY 4.0

TileSet → Advanced

TileSet Type: Sequential

  • Load Queue - Controls how many tiles at most are loaded at the same time, if set to zero, all tiles are loaded without a break, but interface will be locked until everything is loaded

TileSet Type: Parallel

  • CPU Count - Controls how many CPU cores are utilized during loading, leave at zero for maxmimum, set to lower value to leave some cores for other tasks (not exactly per core). If set to higher value than system offers, maximum is used
  • Load Everything On Draw - Load all enabled tiles even those not in view, disabled when Unload Hidden is enabled

TileSet Type: Threaded

  • Use Multithreading - Start multiple background threads to load files concurrently, disable to use one background thread to load one file at a time. While you will get tiles loaded faster, Blender interface will be less responsive because more work need to be done in Main thread where Blender runs (e.g. passing data to gpu). It has positive effect only when individual tiles have mostly higher point count, 500k and more. Please note, this is not multithreading as in multiprocessing, multiple threads are started, but python is processing only one thread at a time, some operations will happen concurrently, like disk I/O, but point processing will not. Some deeper changes need to be made to Blender first to support multiprocessing so even data can be processed in parallel.
  • Threads - How many threads will be running when Multithreading is enabled, value 0 will use number of logical CPUs

TileSet Type: Any

Custom Shift/Scale lets you set specific values for shift and scale, Reset will remove custom values and will use automatic. If this is used, loaded tileset will be reloaded.

LOD Level Percentages lets you change distribution of points in levels for current LOD Levels number.

  • - Set linear distribution
  • - Set cubic distribution
  • - Set exponential distribution
  • - Validate percentages, i.e. make sure they are sorted in correct order, this can shuffle your values
  • - Reset to default (cubic)

Preview Count - Force number of points for preview level, lowest LOD level if LOD is enabled, or for preview data

GPU Queue - Because "uploading" of data to GPU can happen only in Blender main thread, to minimize locking of interface, only a portion of tiles are "uploaded" at a time, this controls how many tiles are "uploaded" at once

Advanced
TileSet → Type: Sequential
Advanced
TileSet → Type: Parallel
Advanced
TileSet → Type: Threaded

Preferences

To open Tiles preferences, go to main Blender menu → Edit → Preferences.., choose Add-ons section from left, find Point Cloud Visualizer, expand with and scroll down to Tiles section

Engine

Engine

  • Budget (GB) - Total budget for all tile sets in scene in GB of gpu memory, different shaders has different requirements for point data that need to be uploaded in gpu memory, thus memory is used instead of point counts. Set it at least 25% less then available on gpu hardware to leave space for other processes, on macOS arm64 architecture with unified memory set it to 25% or less of total ram. Please note, memory is not checked from hardware, but estimated from data sent to gpu
  • View Refresh - Tile visibility check rate
  • Continuous Checking - Check for tile visibility only when idle (i.e. not navigating) (default, disabled state) or check continuously on every viewport change (enabled state). While continuous check will start tile loading earlier, it may also start tiles that will not be needed in the end and once file loading starts, it must complete, loading cannot be stopped from outside. Also enabling this is not recommended if Fast Navigation is disabled or Sequential or Parallel TileSet type is used
  • Use Fast Navigation - Draw preview level resolution while navigating viewport, if disabled, current view is drawn while navigating, will refresh when you stop navigating
  • Navigation Delay - Delay drawing of high resolution point cloud to viewport after navigation ended
  • Use Unload Timeout - Unload tile point data when tile is not visible (will have effect only if TileSet > Unload Hidden is enabled) after timeout has passed or if timeout is disabled, unload will happen immediately. This affects only automatic processes based on viewport, disabling or hiding tile has immediate effect
  • Unload Timeout - Unload timeout
  • Unload On Hide - Unload tiles if container object is hidden from viewport (will have effect only if TileSet > Unload Hidden is enabled)
  • Monitor System Memory - Monitor system memory while loading new data, pause loading when limit is reached to prevent freeze or crash
  • Memory Limit - When memory is filled over limit, loading of new tiles will pause. Checks system total memory, not only portion used by tiles data
  • Show Statistics - Show statistics for all tile sets in viewport lower left corner

Memory Limit

If Memory Limit is reached, loading of new files is paused and message displayed in main panel and Stats. It checks total system memory minus total free memory, not just memory used by Tiles itself.

Message

Message

Add Helper Defaults

Lets you set defaults for Add Helper Operator, so each time it is run, these will be already set without doing anything

Add Helper Defaults

Tiles Theme

Here you can change colors and sizes of ui elements to fit your interface theme

Stats

Statistics for all tile sets in scene in viewport lower left corner. Shows how much of Budget and GPU memory (this is only a estimate based on what Tiles sends there) is used for current view, system memory usage, number of points displayed/loaded/total, tiles loaded/total and length of load queue and gpu queue.

Stats

Tips

3D Viewport performance tips

  • make sure total point count is somewhere between 5-10 million points per file (this is just an estimate, maybe more or less on your system), if not, split further with Split tools using Batch Split to process all files in directory
  • you can manually adjust TileSet → LOD Distance to be shorter, so only closest tiles are drawn with higher LOD level, with that you can disable to prevent it being changed back to automatic if Frame TileSet is used
  • disable tiles you don't need to see in tiles list and use States to quickly change between stored states of tiles list
  • let all tiles preload to system memory at start and have Unload Hidden disabled, so files are not loaded while navigating viewport, please note that by default files will be loaded until total system memory is 80% full (can be changed in preferences), then loading will pause
  • use Optimize Data to limit amount of data loaded, if dataset has colors but they are all zeros, disable colors, if dataset has scalars, but you don't need them, disable all, or keep select scalar fields you need, these options can have huge impact on system memory usage and overall performance
  • have and use only one 3D Viewport, while it is possible to use multiple viewports and tiles LOD levels are calculated for all viewports merged, it will lead to more points being displayed then for just one and will slow down overall performance

Other tips

  • add Pointer select and Box select operators to Quick Favourites Q menu, right click button and choose Add to Quick Favourites to have quick access to tile selecting tools, both can also enable/disable tiles with a key shortcut while they are running, it is faster than using TileSet menu
  • automatic scalar range is set when first tile data is available, it may not be the same in all tiles, best to use selection and fit to selection if dataset is merged from various sources and range differs from tile to tile or fit to all loaded with when more tiles finished loading

Troubleshooting

Notes on "Threaded" TileSet type

If you experience rare random Blender crash while using TileSet → Type: Threaded, it may be caused by another installed and enabled addon that is using gpu module and custom shaders (i.e. addon that draws on screen anything with custom shaders or use shaders for gpu accelerated computing) and it does not clear GPUShader objects from memory properly once finished with them. This happens only if custom shaders are used, builtin shaders that comes with Blender, which are used the most by addon developers, are not affected by this since they are never cleared from memory.

Because Threaded Tiles are using threads to do memory heavy processing, Python may decide to run garbage collecting (clearing out no longer used objects from memory) while running other thread than main thread and when that happens, such shader object is cleared when Blender does not expect that and because shader object is not Python only object but interface to Blender internals, Blender will crash. In that case, disable all addons you don't absolutely need for work. If you want to report that to me, please include list of enabled addons.

PCV itself is immune to this, all its custom shaders are cleared immediately after no longer in use in main thread. TileSet → Type: Sequential is not using threads at all and Parallel is using them in Blender supported way, will not cause any problems of this sort.

Similar kind of a problem may also be with other parts of Blender Python API that are closer to Blender internals, but I don't know about that yet. If you encounter something like this, please let me know here, Message Creator button.

Notes on "E57" files

Some software writes E57 files incorrectly without bounding box (min/max positions) and/or scan pose (translation/rotation) in file header.

If you use E57 files and during loading engine alerts you with E57 element path well formed but not defined (E57_ERROR_PATH_UNDEFINED) library errors, you can try first enable Patch 'pye57' library from PCV preferences, that will fix missing pose information.

Missing bounding box is not yet handled (it would require reading full file and compute min and max instead of just values in header) and your only options are:

  • Use LAS/LAZ files exported from source software or somehow force it to write full header info
  • Open and save E57 files in software that will write correct header info, e.g. CloudCompare
  • Use Tools → Split with settings All At Once, Cuboid, set cuboid dimensions much larger than source file is so file is not split, output format E57 (or LAS/LAZ while at it) and ignore tool warnings that file has not been split