当前位置: 首页 > article >正文

Cesium移动3D模型位置

对于json文件加载的3D模型,它通常会定位在无人机飞手建模的位置,并且寻常移动glb的方法对其并不适用,现在让我们来看看如何移动这样的模型。

首先,我们先来引入json文件,我用的是离线数据,将其放在public文件路径下,通常是一整个模型环境,只需要引入其中的json文件:

get3DmodelTest(){
  let that = this
  var tileset = new Cesium.Cesium3DTileset({  
      url: '/models/terra_b3dms/tileset.json'  
  });  
  this.viewer.scene.primitives.add(tileset);  
  // 可选:将视图定位到模型  
  tileset.readyPromise.then(function(tileset) {  
    that.viewer.zoomTo(tileset);  
  });
},

接下来,我们就看到该模型了,如果想移动它的位置,只需要:

// 等待tileset加载完成  
tileset.readyPromise.then(function(tileset) {  
    // 创建一个平移矩阵  
    // 如果要将tileset沿X轴平移10000米,可根据平移矩阵增加该数值实现(Cesium使用WGS84坐标系,单位通常是米)  
	// 为了更直观的效果,这里我改为定位到一个新坐标,其原理是相同的
    var translation = Cesium.Cartesian3.fromElements(120.37282636618222, 30.20652892963405, 0.0);  
    var translationMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(  
        Cesium.Cartesian3.ZERO, // 参考点,这里使用地球中心作为参考  
        Cesium.Ellipsoid.WGS84, // 椭球体  
        translation // 平移向量  
    );  
  
    // 注意:上面的translationMatrix实际上是一个从地球中心到平移后位置的局部坐标系的变换矩阵  
    // 但为了简化,我们假设只需要平移,并且tileset原本就在地球表面附近  
    // 因此,我们可以直接使用Cesium.Matrix4.fromTranslation来创建一个纯平移矩阵  
    var pureTranslationMatrix = Cesium.Matrix4.fromTranslation(translation);  
  
    // 将纯平移矩阵应用到tileset的modelMatrix上  
    // 注意:这里我们假设tileset原本没有应用任何变换(即modelMatrix是单位矩阵)  
    // 如果tileset已经应用了其他变换,你需要先获取当前的modelMatrix,然后与其相乘  
    tileset.modelMatrix = Cesium.Matrix4.multiply(  
        tileset.modelMatrix, // 当前的modelMatrix(如果是新创建的,则默认为单位矩阵)  
        pureTranslationMatrix, // 平移矩阵  
        new Cesium.Matrix4() // 结果矩阵  
    );  
  
    // 注意:上面的代码假设了tileset的初始modelMatrix是单位矩阵  
    // 如果tileset已经加载了并且有其自己的变换,你可能需要先将平移矩阵与当前的modelMatrix相乘  
    // 但由于Cesium3DTileset的modelMatrix在内部可能由Cesium自动管理,  
    // 因此直接修改它可能不是最佳实践。  
    // 在这种情况下,你可能需要寻找其他方法来达到你想要的效果,  
    // 比如通过调整场景中的相机位置来“移动”tileset的视觉效果。  
  
    // 另一种更简单的方法是,如果你只是想在视觉上移动tileset,  
    // 你可以通过调整相机的位置或视角来实现,而不是直接修改tileset的modelMatrix。  
});  
  
// 注意:上面的代码示例中,使用Cesium.Transforms.eastNorthUpToFixedFrame来创建平移矩阵可能不是最直接的方法,  
// 因为这通常用于创建一个从特定点出发的局部坐标系。对于简单的平移,使用Cesium.Matrix4.fromTranslation就足够了。


http://www.kler.cn/a/379377.html

相关文章:

  • EHOME视频平台EasyCVR萤石设备视频接入平台视频诊断技术可以识别哪些视频质量问题?
  • Windows换机华为擎云(银河麒麟V10+麒麟9000C CPU)后,使用selenium的程序怎么办(20241030)
  • 堆heap的讨论、习题与代码
  • 「Mac畅玩鸿蒙与硬件17」鸿蒙UI组件篇7 - Animation 组件基础
  • 支持 Mermaid 语言预览,用通义灵码画流程图
  • 【sqlmap使用】
  • docker desktop使用ubuntu18.04带图形化+运行qemu
  • 划界与分类的艺术:支持向量机(SVM)的深度解析
  • metasploit/modules/evasion 有哪些模块,以及具体使用案例
  • WebService详解
  • 服务器数据恢复—SAN环境中LUN映射错误导致文件系统一致性出错的数据恢复案例
  • 【neo4j】 图数据库neo4j cypher单一语句 optional 可选操作的技巧
  • “代码世界的必修课:Git完整指南“(3)
  • JVM基本结构和垃圾回收机制
  • 小白从零开始学c++之继承对象的内存空间
  • nodejs入门教程8:nodejs EventEmitter
  • 《Java 实现希尔排序:原理剖析与代码详解》
  • 三维测量与建模笔记 - 2.2 射影几何
  • Hive数据库操作语法
  • Java-I/O框架10:File类、文件操作
  • docker部署Flask+Vue3项目
  • Leetcode328奇偶链表,Leetcode21合并两个有序链表,Leetcode206反转链表 三者综合题
  • C++游戏开发前景讨论
  • [算法初阶]第二集 滑动窗口(已完结)
  • 【NCRE】全国计算机一级必刷选择题(真题476道)
  • 第三十三章 Vue路由进阶路由模块封装