Can we load child tiles (b3dm) from different server by network speed?

Hi ,
I have a couple of services that contain different quality of the same building set. I created those services to handle appropriate service for client requests based on network speed. But I can’t redirect requests to another service because the urls of child tiles are contained in the root level. Is there any way to redirect tile? Or Can I add a querystring to b3dm tile before requested?

The request and setup sound a bit unusual, and it might be necessary to get a clearer idea about the actual goal here.

3D Tiles has the built-in concept of a “Hierarchical Level Of Detail”. So one could say that every tileset is low quality and high quality at the same time. When applied to a tileset that represents a building, it means that the root tile will usually contain a low-quality representation of the building (with few triangles and low-resolution textures). The child tiles will contain parts of the building with higher quality. The collection of all leaf tiles will contain the geometry of the building in the highest quality that is available.

At runtime, clients will first read the root tile and display the lowest quality representation. Then they will refine this data, by loading further tiles that contain data with higher quality.

Further details about how this works in practice are described in sections 5, 6, and mainly 7 of the 3D Tiles reference card at 3d-tiles/3d-tiles-reference-card.pdf at main · CesiumGS/3d-tiles · GitHub . There are also some mechanisms for “steering” the quality (and the amount of data that is downloaded) on the client side.

But before going into the details here: You mentioned …

different quality of the same building set.

What exactly is the difference between these tilesets? (Do they both have the same structure, but with different geometry data? Do they have the same geometricError values in their tiles? …)

Hi Marco. Like you said the consept of level of detail is explained. I want to say I designed same structures. While the server1 returns lod2 under 600 meter , the server2 retjrn same lod under 300 meter thats because i want to redirect to different server when network speed going to low or high. There is one solution for this purpuse but i have to remove and then add primitive . But it doesnt look god solution, in fact ı want to load data like youtube did at runtime. I wonder if its posible.

“different quality of the same building set.”

Maybe I will return high quality texture on same geometric Error but everything is related to possibility of this problem solution

It’s difficult for me to understand the actual use case and intended behavior.

You have a 3D model of a building.
You convert it into a “high quality” 3D Tiles data set, and put this on one server.
And you convert convert it into a “low quality” 3D Tiles data set, and put this on another server.

What is the difference between the “low quality” and the “high quality” data set?

You could probably add certain query parameters to the URL strings in the tileset.json, but I cannot imagine how this should be used in practice. The client (CesiumJS, for example) will send out requests, and it will send the requests to the server from which it obtained the tileset JSON file…

Hi Marco,
I want to clarify step by step

What is the difference between the “low quality” and the “high quality” data set?

The difference between low and high quality is image resolution in case of texture tile on the other hand is geometry lod level in case of solid tile.

For example when a person opens my website and wants to look at texture tile. There will be a problem when he connects with low network speed and he will think this tile isn’t working because he can’t download high-quality b3dm files. To solve this problem I want to know if there is any solution to rewrite b3dm file url when I detect the low network speed.
if it has a solution I will rewrite b3dm request url and I will add a parameter that is known by the server to which the network speed is connecting. By the way client will know only one url but every request will be respond by appropriate server.

I hope I was clarified my problem. Also thank you for your interest.

A 3D Tiles data set consists of the tileset.json file, and the associated content (B3DM) files.

Do you have one data set, or do you have two data sets?


I don’t know whether the goal is to have something like

if (networkIsSlow) {
  tileset = await Cesium3DTileset.fromUrl(
    "http://low-quality-server/tileset.json");
} else {
  tileset = await Cesium3DTileset.fromUrl(
    "http://high-quality-server/tileset.json")
}

But imagine you have a simple tileset.json file like this (pseudocode):

root: {
  content: lowQuality.b3dm
  children: [ {
    content: mediumQuality.b3dm,
    children: [ {
      content: highQuality.b3dm
    }]
  }]
}

It refers to three different tiles (B3DM files).
Each one contains higher quality data than the previous.

Now, someone is visiting the website and opens this tileset.json with CesiumJS.

CesiumJS will first download the lowQuality.b3dm and display it.
Then it will download the mediumQuality.b3dm and display it.
Then it will download the highQuality.b3dm and display it.

I don’t undertand at which point, under which condition, or for which purpose you want to add query parameters to the URLs.

Maybe someone who has a better understanding of network infrastructures can give you better advice here.