[x3d-public] TILES

GPU Group gpugroup at gmail.com
Thu Jul 23 14:55:02 PDT 2020


my experience implementing cesium-like 3DTiles in freewrl
-Doug Sanden

RESULTS
http://dug9.users.sourceforge.net/web3d/tests/tiles/TILES_scene2.mp4
http://dug9.users.sourceforge.net/web3d/tests/tiles/tile_scene2.x3d
http://dug9.users.sourceforge.net/web3d/tests/tiles/gen_tiles2.py
- a 3D grid
- video shows 'computational viewpoint freezing' aka tile view freeze
technique for inspecting frustum culling

http://dug9.users.sourceforge.net/web3d/tests/tiles/TILES_scene47.mp4
http://dug9.users.sourceforge.net/web3d/tests/tiles/tile_scene47.x3d
http://dug9.users.sourceforge.net/web3d/tests/tiles/gen_tiles47.py
- video shows both screenspace error and frustum culling techniques

REFERENCES
https://github.com/CesiumGS/3d-tiles

http://www.lighthouse3d.com/tutorials/view-frustum-culling/

https://www.3drotterdam.nl/datasource-data/29e9f348-7325-4be3-a901-bb2da17e0053/tileset.json



METHODS
As with the cesium 3DTiles, a decision is made at each node of a tree
whether to load a url sub-scene aka content, and/or to render children
nodes.
X3D LOD and GeoLOD have range criteria - the parent node holds ranges and
checks to see which to render.
3DTiles has a slightly more refined method using 3 varieties bounding
volume techinques. I implemented OBB oriented bounding box, That helps
avoid loading scenery that's away from the field of view - and to unload
scenery when the viewpoint pans away.
And a test of object-space accuracy/precision/geometricError projected into
screenspace, to decide whether to load the content of a tile, or to load
children tiles
Bounding volumes need to be supplied explicitly. That's because a range is
needed to project the geometric error to screenspace before deciding
whether to load. And the boundingVolume center is used for that.

Difference from LOD, GeoLOD
- refine {ADD,REPLACE}
-- children can add to or replace
- Cesium 3DTile node content is always loaded by url
- in my implementation, its always an SFNode, so it can be either in-scene
content or an Inline (or Transform wrapping an inline).
- to implement unload for frustum culling of bounding volumes, I put a
field on Tile:
SFBool out showContent
which can be ROUTEd to Inline.load to load / unload.

cesium 3DTiles has 2 node types: TileSet and Tile, with TileSet being the
root tile. I found I didn't need TileSet (yet) - just a tree of Tiles was
sufficient: root_tile can be detected with a stack or static - if stack
empty then its the root tile.

For both cesium and x3d tile, only the content is subject to transforms,
not the bounding volumes or geometricErrors which are all in some scene /
world space / meters units.
Tile
- SFNode content
- MFFloat contentVolume
- SFFloat contentError
- MFNode children
- MFFloat tileVolume

Frustum culling - I found it fiddly to implement, and a technique I found
helpful for testing was to have a keyboard key to toggle freezing of the
'computational viewpoint' / tile view so I could back away the viewer and
see the result of culling.

NOT DONE:
- regional bounding volume, spherical bounding volue
- any geospatial-specific such as use of GeoViewpoint and geospatial region

Q. do we need a separate node, or can LOD / GeoLOD be fixed?
- good question.
Goal: be able to convert cesium 3DTile to x3d and back losslessly
- load cesium tiles directly - to show for example rotterdam (in references
above) in x3d viewer.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://web3d.org/pipermail/x3d-public_web3d.org/attachments/20200723/e8b10b95/attachment.html>


More information about the x3d-public mailing list