Height Gaps Between Adjacent CityGML Objects After 3D Tiles Conversion

Hello Cesium Support Team,

When converting CityGML data, such as water surfaces and land boundaries, to 3D Tiles using Cesium Ion or the pipeline tool, we notice that the height values of adjacent object vertices differ slightly.
As a result, gaps appear in the height direction between surface models.

Enabling or disabling Draco compression does not affect the results.
Since the height values in CityGML are provided as ellipsoidal heights, we have not applied β€œclamp to terrain.”
Changing the srsName between EPSG:4326 and EPSG:4979 does not affect the results.

Does this mean that non-building objects are not fully supported?
Could you provide any insights on this issue?

Thank you.

Hi,

Can you provide some more context about what you are expecting to see? Looking at the image you provided I see there are three lines that appear to intersect at the same point. I’m not able to understand where the gaps are from that image.

Are you able to provide the asset id, or the source data you are having issues with? That will help us investigate this further

Hello, support team.

The three lines in the image are from a gap, where the background is visible through the gap.

Here is the asset ID for your reference

3079703, srsName EPSG:4979, draco compression enabled
3079707, srsName EPSG:4326, draco compression enabled
3079711, srsName EPSG:4326, draco compression disabled

All without clamp to terrain option.

Thank you very much.

Thank you for that additional information. Looking at these assets they cover a large area. Are you able to provide a simplified asset that shows just the problem area? Thanks

Hello, support team.

This asset is simplified one limited to two objects. It is still large, though…
3092370

This problem seems to be occurring in a wide area of data like this.
Thank you.

Thank you for providing that simplified data. I see the small gaps are at the boundaries of two shapes. These edges have the same coordinates so it would be expected that there is no gap. I have created an issue for our team to look into this further.

1 Like

Hi Mark.
I may have a similar issue: Self made 3D tiles terrain, precision problem at edges problem - #8 by Marco13

Of course, my issue may be unrelated as I’m manually creating my gltf files and tilesets so take everything I say with a grain of salt…

I have a self-made 3d tileset terrain generation pipeline which I tried to explain in the other thread. As Marco mentioned, there are a lot of instruments involved in the process and there might be an error or bug introduced in any step… Being that said, I’m trying to bring/snap edge vertices between 2 neighbour tiles together, in world coordinates. I expect to get a smooth output.
I’ve made tons of tests, like β€œtheoretical values calculated vs. actual values generated” which means what is expected numerically vs. what is generated at the end of my pipeline… I can say that the generated tileset edge vertices values are consistent with my theoritical calculations (see logs below), however there is always an offset like difference between the edges when rendering.

Let me share some of my logs here that supports my findings:
Below is the output of my gltf tile generation script, that calculates what 2 neighbour edge vertices should have as world positions. The values are mathematically calculated vertex positions at the edges. After this step, I’m generating the glTF mesh accordingly. Units are meters (ECEF), Dist is euclidean distance, which is => np.linalg.norm(v1_world - v2_world)

The log format is:


mesh1VertexID <-> (corresponding) mesh2VertexID | Dist: Euclidean distance | vertex1_worldposition_xyz | vertex2_worldposition_xyz
...
Vertex 2825↔ 2842 Dist=0.000381 - [ 4216956.54676819 -3870190.02490234  2798999.42675781] - [ 4216956.54638672 -3870190.02490234  2798999.42675781]
Vertex 2827↔ 2844 Dist=0.000008 - [ 4216972.90526581 -3870166.22460938  2799010.28417969] - [ 4216972.90527344 -3870166.22460938  2799010.28417969]
Vertex 2833↔ 2847 Dist=0.000214 - [ 4216991.23117065 -3870144.2421875   2799022.44824219] - [ 4216991.23095703 -3870144.2421875   2799022.44824219]
Vertex 2838↔ 2852 Dist=0.000008 - [ 4217009.1674881  -3870121.89941406  2799034.35351562] - [ 4217009.16748047 -3870121.89941406  2799034.35351562]
Vertex 2842↔ 2857 Dist=0.000034 - [ 4217027.35452652 -3870099.78808594  2799046.42480469] - [ 4217027.35449219 -3870099.78808594  2799046.42480469]
Vertex 2847↔ 2861 Dist=0.000163 - [ 4217046.40641308 -3870078.47607422  2799059.0703125 ] - [ 4217046.40625    -3870078.47607422  2799059.0703125 ]
Vertex 2850↔ 2865 Dist=0.000550 - [ 4217065.36578417 -3870057.07861328  2799071.65527344] - [ 4217065.36523438 -3870057.07861328  2799071.65527344]
Vertex 2854↔ 2869 Dist=0.000019 - [ 4217084.37794876 -3870035.72998047  2799084.27441406] - [ 4217084.37792969 -3870035.72998047  2799084.27441406]
Vertex 2859↔ 2872 Dist=0.000259 - [ 4217101.18482971 -3870012.34375     2799095.4296875 ] - [ 4217101.18457031 -3870012.34375     2799095.4296875 ]
Vertex 2866↔ 2879 Dist=0.000458 - [ 4217117.85299683 -3869988.82910156  2799106.49316406] - [ 4217117.85253906 -3869988.82910156  2799106.49316406]
Vertex 2871↔ 2882 Dist=0.000053 - [ 4217132.49419403 -3869963.44189453  2799116.2109375 ] - [ 4217132.49414062 -3869963.44189453  2799116.2109375 ]
Vertex 2875↔ 2886 Dist=0.000626 - [ 4217142.8238678  -3869934.07177734  2799123.06738281] - [ 4217142.82324219 -3869934.07177734  2799123.06738281]
Vertex 2877↔ 2889 Dist=0.000214 - [ 4217150.45974731 -3869902.21289062  2799128.13574219] - [ 4217150.45996094 -3869902.21289062  2799128.13574219]
Vertex 2882↔ 2896 Dist=0.000160 - [ 4217156.24007416 -3869868.63964844  2799131.97265625] - [ 4217156.24023438 -3869868.63964844  2799131.97265625]
Vertex 2890↔ 2899 Dist=0.000191 - [ 4217161.32050323 -3869834.42041016  2799135.34472656] - [ 4217161.3203125  -3869834.42041016  2799135.34472656]
Vertex 2896↔ 2903 Dist=0.000008 - [ 4217166.35448456 -3869800.15820312  2799138.68554688] - [ 4217166.35449219 -3869800.15820312  2799138.68554688]
Vertex 2902↔ 2910 Dist=0.000397 - [ 4217170.84024048 -3869765.39013672  2799141.66308594] - [ 4217170.83984375 -3869765.39013672  2799141.66308594]
Vertex 2906↔ 2913 Dist=0.000130 - [ 4217176.48131561 -3869731.68945312  2799145.40722656] - [ 4217176.48144531 -3869731.68945312  2799145.40722656]
Vertex 2913↔ 2917 Dist=0.000145 - [ 4217182.61733246 -3869698.44580078  2799149.48046875] - [ 4217182.6171875  -3869698.44580078  2799149.48046875]
Vertex 2916↔ 2924 Dist=0.000076 - [ 4217189.09660339 -3869665.52001953  2799153.78125   ] - [ 4217189.09667969 -3869665.52001953  2799153.78125   ]
Vertex 2918↔ 2927 Dist=0.000549 - [ 4217197.42437744 -3869634.30126953  2799159.30859375] - [ 4217197.42382812 -3869634.30126953  2799159.30859375]
Vertex 2921↔ 2930 Dist=0.000458 - [ 4217207.8119812  -3869604.98583984  2799166.203125  ] - [ 4217207.81152344 -3869604.98583984  2799166.203125  ]
Vertex 2927↔ 2934 Dist=0.000290 - [ 4217219.57939148 -3869576.9453125   2799174.01367188] - [ 4217219.57910156 -3869576.9453125   2799174.01367188]
Vertex 2930↔ 2938 Dist=0.000671 - [ 4217231.76922607 -3869549.29492188  2799182.10546875] - [ 4217231.76855469 -3869549.29492188  2799182.10546875]
Vertex 2936↔ 2942 Dist=0.000000 - [ 4217244.12402344 -3869521.796875    2799190.30566406] - [ 4217244.12402344 -3869521.796875    2799190.30566406]
Vertex 2941↔ 2944 Dist=0.000565 - [ 4217256.6900177  -3869494.49365234  2799198.64648438] - [ 4217256.68945312 -3869494.49365234  2799198.64648438]
Vertex 2946↔ 2947 Dist=0.000565 - [ 4217269.18318176 -3869467.12353516  2799206.93847656] - [ 4217269.18261719 -3869467.12353516  2799206.93847656]
Vertex 2949↔ 2952 Dist=0.000397 - [ 4217280.26992798 -3869438.45458984  2799214.296875  ] - [ 4217280.26953125 -3869438.45458984  2799214.296875  ]
Vertex 2954↔ 2957 Dist=0.000381 - [ 4217290.07557678 -3869408.60205078  2799220.80566406] - [ 4217290.07519531 -3869408.60205078  2799220.80566406]
Vertex 2958↔ 2960 Dist=0.000458 - [ 4217300.03952026 -3869378.89599609  2799227.41894531] - [ 4217300.0390625  -3869378.89599609  2799227.41894531]
Vertex 2961↔ 2962 Dist=0.000046 - [ 4217311.86528015 -3869350.91015625  2799235.26855469] - [ 4217311.86523438 -3869350.91015625  2799235.26855469]
Vertex 2964↔ 2965 Dist=0.000153 - [ 4217324.64175415 -3869323.80175781  2799243.74902344] - [ 4217324.64160156 -3869323.80175781  2799243.74902344]
Vertex 2969↔ 2969 Dist=0.000549 - [ 4217337.32574463 -3869296.60839844  2799252.16796875] - [ 4217337.32519531 -3869296.60839844  2799252.16796875]
Vertex 2972↔ 2971 Dist=0.000488 - [ 4217350.73583984 -3869270.0859375   2799261.06933594] - [ 4217350.73535156 -3869270.0859375   2799261.06933594]
Vertex 2975↔ 2974 Dist=0.000092 - [ 4217364.1524353  -3869243.56933594  2799269.97460938] - [ 4217364.15234375 -3869243.56933594  2799269.97460938]
Vertex 2977↔ 2976 Dist=0.000122 - [ 4217377.7208252  -3869217.19287109  2799278.98046875] - [ 4217377.72070312 -3869217.19287109  2799278.98046875]
Vertex 3611↔ 2978 Dist=0.000153 - [ 4217393.38882446 -3869192.75585938  2799289.37988281] - [ 4217393.38867188 -3869192.75585938  2799289.37988281]

Below is the output of validation script, which reads the previously generated gltf files and compare the edge vertices world positions.

...
Vertex 2825↔ 2842 Dist=0.000381 - [ 4216956.54676819 -3870190.02490234  2798999.42675781] - [ 4216956.54638672 -3870190.02490234  2798999.42675781]
Vertex 2827↔ 2844 Dist=0.000008 - [ 4216972.90526581 -3870166.22460938  2799010.28417969] - [ 4216972.90527344 -3870166.22460938  2799010.28417969]
Vertex 2833↔ 2847 Dist=0.000214 - [ 4216991.23117065 -3870144.2421875   2799022.44824219] - [ 4216991.23095703 -3870144.2421875   2799022.44824219]
Vertex 2838↔ 2852 Dist=0.000008 - [ 4217009.1674881  -3870121.89941406  2799034.35351562] - [ 4217009.16748047 -3870121.89941406  2799034.35351562]
Vertex 2842↔ 2857 Dist=0.000034 - [ 4217027.35452652 -3870099.78808594  2799046.42480469] - [ 4217027.35449219 -3870099.78808594  2799046.42480469]
Vertex 2847↔ 2861 Dist=0.000163 - [ 4217046.40641308 -3870078.47607422  2799059.0703125 ] - [ 4217046.40625    -3870078.47607422  2799059.0703125 ]
Vertex 2850↔ 2865 Dist=0.000550 - [ 4217065.36578417 -3870057.07861328  2799071.65527344] - [ 4217065.36523438 -3870057.07861328  2799071.65527344]
Vertex 2854↔ 2869 Dist=0.000019 - [ 4217084.37794876 -3870035.72998047  2799084.27441406] - [ 4217084.37792969 -3870035.72998047  2799084.27441406]
Vertex 2859↔ 2872 Dist=0.000259 - [ 4217101.18482971 -3870012.34375     2799095.4296875 ] - [ 4217101.18457031 -3870012.34375     2799095.4296875 ]
Vertex 2866↔ 2879 Dist=0.000458 - [ 4217117.85299683 -3869988.82910156  2799106.49316406] - [ 4217117.85253906 -3869988.82910156  2799106.49316406]
Vertex 2871↔ 2882 Dist=0.000053 - [ 4217132.49419403 -3869963.44189453  2799116.2109375 ] - [ 4217132.49414062 -3869963.44189453  2799116.2109375 ]
Vertex 2875↔ 2886 Dist=0.000626 - [ 4217142.8238678  -3869934.07177734  2799123.06738281] - [ 4217142.82324219 -3869934.07177734  2799123.06738281]
Vertex 2877↔ 2889 Dist=0.000214 - [ 4217150.45974731 -3869902.21289062  2799128.13574219] - [ 4217150.45996094 -3869902.21289062  2799128.13574219]
Vertex 2882↔ 2896 Dist=0.000160 - [ 4217156.24007416 -3869868.63964844  2799131.97265625] - [ 4217156.24023438 -3869868.63964844  2799131.97265625]
Vertex 2890↔ 2899 Dist=0.000191 - [ 4217161.32050323 -3869834.42041016  2799135.34472656] - [ 4217161.3203125  -3869834.42041016  2799135.34472656]
Vertex 2896↔ 2903 Dist=0.000008 - [ 4217166.35448456 -3869800.15820312  2799138.68554688] - [ 4217166.35449219 -3869800.15820312  2799138.68554688]
Vertex 2902↔ 2910 Dist=0.000397 - [ 4217170.84024048 -3869765.39013672  2799141.66308594] - [ 4217170.83984375 -3869765.39013672  2799141.66308594]
Vertex 2906↔ 2913 Dist=0.000130 - [ 4217176.48131561 -3869731.68945312  2799145.40722656] - [ 4217176.48144531 -3869731.68945312  2799145.40722656]
Vertex 2913↔ 2917 Dist=0.000145 - [ 4217182.61733246 -3869698.44580078  2799149.48046875] - [ 4217182.6171875  -3869698.44580078  2799149.48046875]
Vertex 2916↔ 2924 Dist=0.000076 - [ 4217189.09660339 -3869665.52001953  2799153.78125   ] - [ 4217189.09667969 -3869665.52001953  2799153.78125   ]
Vertex 2918↔ 2927 Dist=0.000549 - [ 4217197.42437744 -3869634.30126953  2799159.30859375] - [ 4217197.42382812 -3869634.30126953  2799159.30859375]
Vertex 2921↔ 2930 Dist=0.000458 - [ 4217207.8119812  -3869604.98583984  2799166.203125  ] - [ 4217207.81152344 -3869604.98583984  2799166.203125  ]
Vertex 2927↔ 2934 Dist=0.000290 - [ 4217219.57939148 -3869576.9453125   2799174.01367188] - [ 4217219.57910156 -3869576.9453125   2799174.01367188]
Vertex 2930↔ 2938 Dist=0.000671 - [ 4217231.76922607 -3869549.29492188  2799182.10546875] - [ 4217231.76855469 -3869549.29492188  2799182.10546875]
Vertex 2936↔ 2942 Dist=0.000000 - [ 4217244.12402344 -3869521.796875    2799190.30566406] - [ 4217244.12402344 -3869521.796875    2799190.30566406]
Vertex 2941↔ 2944 Dist=0.000565 - [ 4217256.6900177  -3869494.49365234  2799198.64648438] - [ 4217256.68945312 -3869494.49365234  2799198.64648438]
Vertex 2946↔ 2947 Dist=0.000565 - [ 4217269.18318176 -3869467.12353516  2799206.93847656] - [ 4217269.18261719 -3869467.12353516  2799206.93847656]
Vertex 2949↔ 2952 Dist=0.000397 - [ 4217280.26992798 -3869438.45458984  2799214.296875  ] - [ 4217280.26953125 -3869438.45458984  2799214.296875  ]
Vertex 2954↔ 2957 Dist=0.000381 - [ 4217290.07557678 -3869408.60205078  2799220.80566406] - [ 4217290.07519531 -3869408.60205078  2799220.80566406]
Vertex 2958↔ 2960 Dist=0.000458 - [ 4217300.03952026 -3869378.89599609  2799227.41894531] - [ 4217300.0390625  -3869378.89599609  2799227.41894531]
Vertex 2961↔ 2962 Dist=0.000046 - [ 4217311.86528015 -3869350.91015625  2799235.26855469] - [ 4217311.86523438 -3869350.91015625  2799235.26855469]
Vertex 2964↔ 2965 Dist=0.000153 - [ 4217324.64175415 -3869323.80175781  2799243.74902344] - [ 4217324.64160156 -3869323.80175781  2799243.74902344]
Vertex 2969↔ 2969 Dist=0.000549 - [ 4217337.32574463 -3869296.60839844  2799252.16796875] - [ 4217337.32519531 -3869296.60839844  2799252.16796875]
Vertex 2972↔ 2971 Dist=0.000488 - [ 4217350.73583984 -3869270.0859375   2799261.06933594] - [ 4217350.73535156 -3869270.0859375   2799261.06933594]
Vertex 2975↔ 2974 Dist=0.000092 - [ 4217364.1524353  -3869243.56933594  2799269.97460938] - [ 4217364.15234375 -3869243.56933594  2799269.97460938]
Vertex 2977↔ 2976 Dist=0.000122 - [ 4217377.7208252  -3869217.19287109  2799278.98046875] - [ 4217377.72070312 -3869217.19287109  2799278.98046875]
Vertex 3611↔ 2978 Dist=0.000153 - [ 4217393.38882446 -3869192.75585938  2799289.37988281] - [ 4217393.38867188 -3869192.75585938  2799289.37988281]

If you compare the values in a text comparison tool, you will see the values are identical, which means I’m able to store the correct world positions as I calculated and read them back. The distances are so small, almost millimeter level (0.001)

Despite being theoretical vs. actual values are so close, when rendering there is almost an offset like displacement between the edges. Say it is like ~10cm through the whole edge. The distance being so alarms my anomaly senses and makes me think it may not be related to floating point precision errors, because in that case the distance between the edges would be random instead of β€˜offset like’ distance.

Below are some visual feedbacks from Unreal Engine 5.2, Cesium for unreal version 2.10.0:

The cube is 0.1 scaled, which means 10 cm each edge:

I’m attaching the tileset:
yunus_3dtiles.zip (7.4 MB)

The feedbacks I shared may boost your debugging in case there is a general problem, this is why I shared a lot of stuff above. In that case, at the end my problem will also be resolved :slight_smile: Though it may be completely unrelated and most probably I have some problems in my pipeline…

Support Team

Thank you for your response.
We are facing similar issues not only with the land use classification provided as a sample, but also with other CityGMLs such as flood forecasting,
Currently, we have to rely on other conversion tools such as FME.
We hope this issue will be resolved.

Thank you.