Cesium变换3DTiles的位置(平移旋转缩放)
function add3DTilesetDataTrans(url) { //viewer1.scene.globe.depthTestAgainstTerrain = true;//地形遮挡 //viewer1.scene.globe.depthTestAgainstTerrain = false;//去掉地形遮挡 tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({ url: url, //maximumScreenSpaceError: 20, //最大的屏幕空间误差 //maximumNumberOfLoadedTiles: 10, //最大加载瓦片个数 })); tileset.readyPromise.then(function () { }).then(function () { if (tileset._root.transform == undefined) { console.log("瓦片未变换"); } tileset._root.transform = update3dtilesMaxtrix(params); viewer.zoomTo(tileset); }); }; function remove3DTilesetData(dataConfig) { var url = dataConfig; var primitives = viewer.scene.primitives; for (var i = 0; i < primitives.length; i++) { if (primitives._primitives[i]._url == url) { viewer.scene.primitives.remove(primitives._primitives[i]); } } } function add3DTilesetData(dataConfig) { //viewer1.scene.globe.depthTestAgainstTerrain = true;//地形遮挡 //viewer1.scene.globe.depthTestAgainstTerrain = false;//去掉地形遮挡 var tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({ url: dataConfig, //maximumScreenSpaceError: 20, //最大的屏幕空间误差 //maximumNumberOfLoadedTiles: 10, //最大加载瓦片个数 })); tileset.readyPromise.then(function () { }); }; let params = { tx: 120.257, //模型中心X轴坐标(经度,单位:十进制度) ty: 31.226, //模型中心Y轴坐标(纬度,单位:十进制度) tz: 2800, //模型中心Z轴坐标(高程,单位:米) rx: 0, //X轴(经度)方向旋转角度(单位:度) ry: 0, //Y轴(纬度)方向旋转角度(单位:度) rz: -1 //Z轴(高程)方向旋转角度(单位:度) }; function update3dtilesMaxtrix(params) { //旋转 let mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(params.rx)); let my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(params.ry)); let mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(params.rz)); let rotationX = Cesium.Matrix4.fromRotationTranslation(mx); let rotationY = Cesium.Matrix4.fromRotationTranslation(my); let rotationZ = Cesium.Matrix4.fromRotationTranslation(mz); //平移 let position = Cesium.Cartesian3.fromDegrees(params.tx, params.ty, params.tz); let m = Cesium.Transforms.eastNorthUpToFixedFrame(position); let scale = Cesium.Matrix4.fromUniformScale(0.85); // //缩放 Cesium.Matrix4.multiply(m, scale, m); //旋转、平移矩阵相乘 Cesium.Matrix4.multiply(m, rotationX, m); Cesium.Matrix4.multiply(m, rotationY, m); Cesium.Matrix4.multiply(m, rotationZ, m); //赋值给tileset return m; }
1.定义一个目标位置,这个目标位置包括(目的地的经纬度(地理坐标系),高度,指定旋转轴的旋转角度)
2.通过使用update3dtilesMaxtrix这个方法,生成一个矩阵
3.修改3dtiles_root.transform将矩阵m赋值给它就可以实现变换(这个transform的属性一定要在
tileset.readyPromise.then()之后才会出现,所以这句话必须放在它之后写才行
)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了