need some input on how to use 3d tiles

hi,

being new to 3d tiles I'd appreciate some input:

I have a growing data set of (potentially millions of) points all over the surface of the globe. each data point is displayed as an instance of the same model. in order to limit the total amount of instances visible at a time, I am generating 3d tiles that are meant to correspond to different zoom levels (camera altitudes) in cesium (– basically just like image tiles).
the root tile spans the entire globe, which is then recursively subdivided into 4 quadrants. on the most zoomed in level you will see all the data points, on more zoomed out levels you will only see smaller and smaller subsets of the data set per tile region.

currently I have .i3dm files with fake data and tilesets referenced as external files. for instance the root tile looks like this. it has 5 children: 1 .i3dm file and 4 external tilesets.

{
  "asset": {
    "version": "0.0"
  },
  "geometricError": 18914501.65107806,
  "root": {
    "refine": "replace",
    "boundingVolume": {
      "region": [
        -3.141592653589793,
        -1.4844217274429492,
        3.141592653589793,
        1.4844217274429492,
        -1,
        1
      ]
    },
    "geometricError": 18914501.65107806,
    "children": [
      {
        "content": {
          "url": "1-1-1.i3dm"
        },
        "boundingVolume": {
          "region": [
            -3.141592653589793,
            -1.4844217274429492,
            3.141592653589793,
            1.4844217274429492,
            -1,
            1
          ]
        },
        "geometricError": 18914501.65107806
      },
      {
        "content": {
          "url": "2-1-1.json"
        },
        "geometricError": 9457250.82553903,
        "boundingVolume": {
          "region": [
            -3.141592653589793,
            0,
            0,
            1.4844217274429492,
            -1,
            1
          ]
        }
      },
      {
        "content": {
          "url": "2-3-1.json"
        },
        "geometricError": 9457250.82553903,
        "boundingVolume": {
          "region": [
            0,
            0,
            3.141592653589793,
            1.4844217274429492,
            -1,
            1
          ]
        }
      },
      {
        "content": {
          "url": "2-3-2.json"
        },
        "geometricError": 9457250.82553903,
        "boundingVolume": {
          "region": [
            0,
            -1.4844217274429492,
            3.141592653589793,
            0,
            -1,
            1
          ]
        }
      },
      {
        "content": {
          "url": "2-1-2.json"
        },
        "geometricError": 9457250.82553903,
        "boundingVolume": {
          "region": [
            -3.141592653589793,
            -1.4844217274429492,
            0,
            0,
            -1,
            1
          ]
        }
      }
    ]
  }
}

the `geometricError` of each tile is its height in meters — I read that "often the radius in meters makes an ok geometric error". I wonder if this is still a good rule of thumb in my case. like many others, I am kind of clueless what value to choose for this.

what do I have to do to achieve the following:
- show only tiles of the same level (depending on cesium camera altitude)
  - ideally I'd be able to specify (in meters) at which heights the switch from one level to the next happens
- only show tiles that are currently visible to the user. (I assume this is already happening.)

thanks a lot in advance!

this is a screenshot of what I currently have. model instances on the same zoom level have the same size, but the size varies between different zoom levels. – the fact that you can see models of different sizes makes me think that parent/child tiles are visible at the same time, here. could that be?

Yeah radius is one of my go-to geometric errors, but finding the right value is often the result of seeing the LOD switching in action. This perceptual metric will vary from tileset to tileset.

  • show only tiles of the same level (depending on cesium camera altitude)
    - ideally I’d be able to specify (in meters) at which heights the switch from one level to the next happens

I’m not sure if there is a good strategy for doing this right now.

But you could try using request volumes. Every tile at the same level would use the the same request volume. The volume would be a region with specific min/max heights. The amount of tileset bloat for this is pretty heavy, but I think it would work.

  • only show tiles that are currently visible to the user. (I assume this is already happening.)

Yeah that is already happening. You can confirm by using the freezeFrame toggle in the Cesium3DTilesInspector like in the Sandcastle demo.

Since you are using replacement refinement the children and parents should not be rendering simultaneously, so I don’t know how to explain that screenshot, unless the external tilesets are using additive refinement for some reason.You could try looking at the bounding volumes with the 3D Tiles inspector and see what it looks like.