diff --git a/CHANGES.md b/CHANGES.md index ed244a0b0c4a..d498628c99eb 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -12,6 +12,7 @@ - Improved performance and reduced memory usage of `Event` class. [#12896](https://github.com/CesiumGS/cesium/pull/12896) - Fixes vertical misalignment of glyphs in labels with small fonts [#8474](https://github.com/CesiumGS/cesium/issues/8474) - Prevent runtime errors for certain forms of invalid PNTS files [#12872](https://github.com/CesiumGS/cesium/issues/12872) +- Fixes precision issues with Gaussian splat tilesets where tiles have a world transform and the tileset does not [#12925](https://github.com/CesiumGS/cesium/issues/12925) #### Additions :tada: diff --git a/packages/engine/Source/Scene/GaussianSplatPrimitive.js b/packages/engine/Source/Scene/GaussianSplatPrimitive.js index 78538c47c416..f16965fb2b50 100644 --- a/packages/engine/Source/Scene/GaussianSplatPrimitive.js +++ b/packages/engine/Source/Scene/GaussianSplatPrimitive.js @@ -32,6 +32,7 @@ import Quaternion from "../Core/Quaternion.js"; import SplitDirection from "./SplitDirection.js"; import destroyObject from "../Core/destroyObject.js"; import ContextLimits from "../Renderer/ContextLimits.js"; +import Transforms from "../Core/Transforms.js"; const scratchMatrix4A = new Matrix4(); const scratchMatrix4B = new Matrix4(); @@ -427,6 +428,13 @@ GaussianSplatPrimitive.transformTile = function (tile) { const gltfPrimitive = tile.content.gltfPrimitive; const gaussianSplatPrimitive = tile.tileset.gaussianSplatPrimitive; + if (gaussianSplatPrimitive._rootTransform === undefined) { + gaussianSplatPrimitive._rootTransform = Transforms.eastNorthUpToFixedFrame( + tile.tileset.boundingSphere.center, + ); + } + const rootTransform = gaussianSplatPrimitive._rootTransform; + const computedModelMatrix = Matrix4.multiplyTransformation( computedTransform, gaussianSplatPrimitive._axisCorrectionMatrix, @@ -441,7 +449,7 @@ GaussianSplatPrimitive.transformTile = function (tile) { const toGlobal = Matrix4.multiply( tile.tileset.modelMatrix, - Matrix4.fromArray(tile.tileset.root.transform), + Matrix4.fromArray(rootTransform), scratchMatrix4B, ); const toLocal = Matrix4.inverse(toGlobal, scratchMatrix4C); @@ -765,7 +773,7 @@ GaussianSplatPrimitive.buildGSplatDrawCommand = function ( const modelMatrix = Matrix4.multiply( tileset.modelMatrix, - Matrix4.fromArray(tileset.root.transform), + Matrix4.fromArray(primitive._rootTransform), scratchMatrix4B, );