Cesium 1.135.0におけるマーカー位置ズレ問題と解決方法
問題の概要 Cesium.js 1.135.0を使用したReactアプリケーションにおいて、CLAMP_TO_GROUND設定を使用したビルボードマーカーの位置が、カメラの移動やズーム操作後に不正確になる現象が確認された。 環境 Cesium.js : 1.135.0(問題発生)→ 1.134.0(問題解消) フレームワーク : Next.js 16.0.1 + React 19.2.0 地形データ : Cesium World Terrain (Cesium.Terrain.fromWorldTerrain()) マーカー設定 : clampToGround: true heightReference: Cesium.HeightReference.CLAMP_TO_GROUND 症状 特定のマーカーをクリックしてズーム(拡大) カメラの視点を変更(回転・パン) 遠くにあるマーカーを確認すると、地形から浮いているか、不正確な位置に表示される この問題は、カメラが近距離に移動した際に読み込まれる高解像度の地形データ(LOD: Level of Detail)と、遠方のマーカーが参照する低解像度の地形データとの不整合によって発生すると考えられる。 調査プロセス 試行1: カメラ制御の明示化 マーカークリック時にsampleTerrainMostDetailedを使用して地形高度を取得し、明示的にカメラを移動させる実装を試みたが、問題は解消されなかった。 試行2: heightReferenceの変更 heightReferenceをCLAMP_TO_GROUNDからNONEに変更し、disableDepthTestDistanceを使用する実装を試みたが、この場合はマーカーが地形に正しく配置されず、別の問題が発生した。 試行3: バージョン比較 動作確認用のHTMLファイル(Cesium 1.110.0使用)では同様の問題が発生しないことを確認。Cesiumのバージョンが問題の原因である可能性を特定。 解決策 Cesium.jsを1.135.0から1.134.0にダウングレードすることで問題が解消された。 npm install cesium@1.134.0 技術的背景 CLAMP_TO_GROUNDの動作 CesiumのCLAMP_TO_GROUND設定は、エンティティを地形の表面に固定する機能を提供する。この機能は地形タイルのLOD(Level of Detail)に依存しており、カメラの位置によって異なる解像度の地形データが使用される。 理論上、Cesiumは地形タイルの更新に応じてエンティティの位置を再計算する必要があるが、1.135.0ではこの再計算メカニズムに問題がある可能性が考えられる。 関連Issue CesiumGS/cesium GitHub repositoryで類似の問題が報告されている: Issue #13012: https://github.com/CesiumGS/cesium/issues/13012 このissueでは、clampToGroundの動作に関連する問題が議論されている。 コード比較 問題発生時(1.135.0) Cesium.GeoJsonDataSource.load(geojson, { markerColor: config.color, markerSize: 24, clampToGround: true // 地形LOD変化で位置ズレが発生 }).then((dataSource: any) => { // ... entity.billboard.heightReference = Cesium.HeightReference.CLAMP_TO_GROUND }) 解決後(1.134.0) 同一のコードで正常に動作。バージョンのみを変更。 ...

