3D Tile Rotation Model Matrix Calculation

Hi, I want to know how to calculate the rotation on 3D tileset.

The intension of the calculation is I want to create a platform to adjust the 3d tiles without using Cesium ion because I don’t want people to login my account but can twist and look at the preview of the model on my Platform.

To calculate the Matrix4 using longitude, latitude, altitude etc. I can use the following code to calculate a Matrix4 and pass into the 3dtile modelMatrix property.

const longitude = 114.25;
const latitude = 22.32331;
const height = -24.5000000013;

const position = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);

const heading = 180; // in degree
const pitch = 0; // in degree
const roll = 0; // in degree

const hpr = new Cesium.HeadingPitchRoll(
  Cesium.Math.toRadians(heading),
  Cesium.Math.toRadians(pitch),
  Cesium.Math.toRadians(roll),
);

const resultMatrix = Cesium.Transforms.headingPitchRollToFixedFrame(
  position,
  hpr,
);
3dtileset.modelMatrix = resultMatrix;

But this only works when the 3D tile location is not set. Obviously, I can ignore the process on adjusting the location on Cesium Ion and store in my side but that feels not right.

I can calculate the translation part of the model but of course planet earth is not flat, a rotation parameter is also needed.

const sourceMatrix = Cesium.Matrix4.transpose(
    new Cesium.Matrix4(...root.transform), // get by Cesium API
    new Cesium.Matrix4(),
  );

  const resultMatrix; // in above

  const modelMatrix = Cesium.Matrix4.fromTranslation(  Cesium.Cartesian3.subtract(
    Cesium.Matrix4.getTranslation(resultMatrix, new Cesium.Cartesian3()),
    Cesium.Matrix4.getTranslation(sourceMatrix, new Cesium.Cartesian3()),
    new Cesium.Cartesian3(),
  ););

But I try to calculate the model Quaternion from the Matrix with

Cesium.Quaternion.multiply(sourceQuaternion, Cesium.Quaternion.invserse(resultQuaternion), new Cesium.Quaternion())
Cesium.Quaternion.multiply(Cesium.Quaternion.invserse(sourceQuaternion), resultQuaternion, new Cesium.Quaternion())

and pass it into

const modelMatrix = Cesium.Matrix4.fromRotationTranslation(
                Cesium.Matrix3.fromQuaternion(
                  modelQuaternion,
                ),
                modelTranslation,
                new Cesium.Matrix4(),
              );

with no succeed.

So I want to know how to calculate modelMatrix given sourceMatrix from Cesium Ion and resultMatrix from Cesium.Transforms.headingPitchRollToFixedFrame