背景:

3dtiles文件在Cesium场景中加载时,是自带中心的坐标的,在做某个功能时需要将其定位到指定的经纬度。

思路:

Cesium中每个3dtile对象都有modelMatrix属性,通过向该属性赋值,改变其变换矩阵,可以实现对模型的平移、旋转、缩放。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//移动3dtiles模型中心点到某个经纬度
async updateTilesetLocation(tileset, [lng, lat]) {
// 获取tileset的中心点坐标
let startPosition = tileset.boundingSphere.center;

// 获取tileset中心点高度
const height = Cesium.Cartographic.fromCartesian(startPosition).height

// 平移终点坐标
const endPosition = Cesium.Cartesian3.fromDegrees(lng, lat, height);

// 计算平移向量
const translationVector = Cesium.Cartesian3.subtract(
endPosition,
startPosition,
new Cesium.Cartesian3()
);

// 根据平移向量构建变换矩阵
const translateMatrix = Cesium.Matrix4.fromTranslation(translationVector);
const newMatrix = tileset.modelMatrix //如果已有矩阵,需要矩阵相乘才能叠加变换
? Cesium.Matrix4.multiply(
tileset.modelMatrix,
translateMatrix,
new Cesium.Matrix4()
)
: translateMatrix;

//应用矩阵到tileset
tileset.modelMatrix = newMatrix;
}