第一段代码:应用平移变换到子模型
这段代码的目的是获取子模型的变换矩阵,并将其平移 10 个单位。
if (submodel) {// 获取当前子模型的变换矩阵let transform = submodel.transform// 创建一个向上的平移矩阵,平移 10 个单位let translationMatrix = Cesium.Matrix4.fromTranslation(new Cesium.Cartesian3(0, 0, 10))// 将平移矩阵应用到子模型的原始变换矩阵上let newTransform = Cesium.Matrix4.multiply(transform, translationMatrix, new Cesium.Matrix4())// 将更新后的变换矩阵应用到子模型submodel.transform = newTransformconsole.log('子模型的新变换矩阵已更新。')} else {console.log('未找到 ID 为 3 的子模型。')}
参考:局部修改3dtiles子模型的位置
解释:
submodel.transform
是子模型的当前变换矩阵,它是一个 4x4 的矩阵,包含了子模型的平移、旋转和缩放信息。Cesium.Matrix4.fromTranslation(new Cesium.Cartesian3(0, 0, 10))
创建了一个只包含平移的变换矩阵,这里表示沿着 Z 轴平移 10 个单位。Cesium.Matrix4.multiply(transform, translationMatrix, new Cesium.Matrix4())
将原始的变换矩阵和新的平移矩阵相乘,生成一个新的变换矩阵newTransform
。submodel.transform = newTransform
最后将计算出来的新变换矩阵应用到子模型上,从而实现子模型的平移。
第二段代码:修改 3D Tiles 模型的模型矩阵
这段代码是用来计算模型的变换,并将其应用于 3D Tiles 模型的 modelMatrix
,目的是通过修改模型的 modelMatrix
来调整其在世界坐标系中的位置。
changeHeight(tileset, height) {let Cesium = this.ffCesium.Cesium;if (!tileset || !tileset.boundingSphere) {console.error("Invalid tileset.");return;}// 3D Tile 模型的边界球体var boundingSphere = tileset.boundingSphere;// 获取模型的原始地理坐标(经纬度和高度)var cartographic_original = Cesium.Cartographic.fromCartesian(boundingSphere.center);// 将原始地理坐标转换回直角坐标系(Cartesian3)var Cartesian3_original = Cesium.Cartesian3.fromRadians(cartographic_original.longitude, cartographic_original.latitude, cartographic_original.height);// 计算目标高度对应的新的直角坐标(Cartesian3)var Cartesian3_offset = Cesium.Cartesian3.fromRadians(cartographic_original.longitude, cartographic_original.latitude, height);// 计算偏移量var translation = Cesium.Cartesian3.subtract(Cartesian3_offset, Cartesian3_original, new Cesium.Cartesian3());// 获取原始模型矩阵(避免覆盖原有变换)var modelMatrix = tileset.modelMatrix || Cesium.Matrix4.IDENTITY;// 基于原有模型矩阵进行平移tileset.modelMatrix = Cesium.Matrix4.multiplyByTranslation(modelMatrix, translation, new Cesium.Matrix4());
}
使用:
promise.then((result) => {result.changeHeight(result, 100)
})
解释:
tileset.boundingSphere
获取模型的边界球体信息,boundingSphere.center
是模型的中心点位置(在世界坐标系中的Cartesian3
坐标)。Cesium.Cartographic.fromCartesian(boundingSphere.center)
将模型的中心位置从Cartesian3
坐标转换为地理坐标(经度、纬度、高度)。这一步是为了获取模型的中心点在地理坐标系中的位置。Cesium.Cartesian3.fromRadians(cartographic_original.longitude, cartographic_original.latitude, cartographic_original.height)
将地理坐标(弧度制)转换回Cartesian3
坐标。Cesium.Cartesian3.fromRadians(cartographic_original.longitude, cartographic_original.latitude, height)
通过给定新的高度height
来生成一个新的Cartesian3
坐标,表示在相同的经纬度上但不同的高度位置。Cesium.Cartesian3.subtract(Cartesian3_offset, Cartesian3_original, new Cesium.Cartesian3())
计算出新的平移向量translation
,表示从原始位置到新高度位置的偏移。tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation)
将这个平移向量转换为一个矩阵,并应用到模型的modelMatrix
上,从而将整个 3D Tiles 模型平移到新的位置。
两者关系和区别:
-
子模型的变换矩阵 (
submodel.transform
):- 适用于操作 子模型,比如将模型中的某个部件进行平移、旋转或缩放。
- 通过修改子模型的
transform
属性来控制其局部变换。 - 这种变换是局部的,即仅影响子模型本身,不会改变其他子模型或整个
tileset
的位置。
-
3D Tiles 模型的模型矩阵 (
tileset.modelMatrix
):- 适用于整个 3D Tiles 模型,即操作整个模型的位置、旋转和缩放。
- 通过修改
modelMatrix
,可以改变整个模型在世界坐标系中的位置和方向。 - 这里的变换通常涉及对模型进行全局的平移操作,可能是为了调整其位置或者适应其他空间要求。
总结:
- 第一段代码演示了如何平移子模型,通过变换矩阵调整子模型的局部位置。
- 第二段代码演示了如何平移整个 3D Tiles 模型,通过计算偏移量并应用到
tileset.modelMatrix
来调整整个模型的位置。
如果你想要同时操作多个子模型并进行全局平移,通常需要结合使用这些方法。你可以先对每个子模型应用局部变换(例如平移),然后再通过 tileset.modelMatrix
对整个模型进行全局变换。