美文网首页开源
vue3 + cesium基础学习

vue3 + cesium基础学习

作者: 妮儿_smile | 来源:发表于2023-08-25 20:15 被阅读0次

    个人学习笔记,本文采用的cesium版本为1.108.

    导入gltf模型

    注意, 模型资源要放在public下面.

    新手踩的坑: 资源导入可以直接写{ uri: "/static/model/1.glb"}, 不需要写import xx from 'xxx' 相对路径

    <template>
      <div ref="cesiumContainer">
      </div>
    </template>
    <script setup>
    //  本次作业: 在地球上导入3D模型
    //引入cesium
    import  * as Cesium from "cesium";
    import "cesium/Build/CesiumUnminified/Widgets/widgets.css"; // 这是样式文件, 但是.vue文件里如果不引用该文件的话 cesium会报错
    import { onMounted } from "vue";
    
    //定义viewer
    let viewers = null;
    
    let position = Cartesian3.fromDegrees(107.47371, 31.196359, 0);
    
    //初始化viewer
    function initViewer() {
      viewers = new Viewer("cesiumContainer") // 此处放的是div的id;
      const entity = viewers.entities.add({
        name: "demo",
        position: position, // 模型导入的位置
        model: {
          uri: "/static/model/1.glb", // 模型在项目里的位置, 会直接读取public下面的文件夹
        },
      });
      viewers.trackedEntity = entity;
    }
    
    //初始化viewer
    onMounted(() => {
      initViewer();
    });
    </script>
    
    

    导入3d lites 模型

    1.107之前导入 3dlites 可以通过readyPromise. 但是1.108中是废弃的, 找了好久找到的108写法, 通过 async await 写法导入后操作.

      async function addThreeDTiles(url, option) {
        viewer.scene.globe.depthTestAgainstTerrain = true;
        let tileset = {};
        tileset = await Cesium.Cesium3DTileset.fromUrl(url, option);
        viewer.scene.primitives.add(tileset);
        return tileset; // 返回模型对象
      }
    
      const modelPromise = addThreeDTiles("/static/model/3dtiles/tileset.json"); // 模型切瓦后的瓦片索引文件URL
    

    注意 3d lites模型自带经纬度. 如果想要修改模型位置, 可通过tileset.modelMatrix 修改

      modelPromise.then((tileset) => {
        // 把模型调整到达钢
        // 获取tileset的中心点坐标
        var boundingSphere = tileset.boundingSphere;
        var center = boundingSphere.center;
        // 将中心点坐标转换为WGS84坐标系下的经纬度
        // 模型精确到了小数点后14位
        var cartographic = Cesium.Cartographic.fromCartesian(center);
        var longitude = Cesium.Math.toDegrees(cartographic.longitude);
        var latitude = Cesium.Math.toDegrees(cartographic.latitude);
        // 35.60023558303877
    
        // 调整经纬度
        var translation = Cesium.Cartesian3.fromDegrees(
          modelLongitude,
          modelLatitude
        );
        var centerNew = Cesium.Cartesian3.fromDegrees(longitude, latitude);
    
        var translationVector = Cesium.Cartesian3.subtract(
          translation,
          centerNew,
          new Cesium.Cartesian3()
        );
    
        tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translationVector);
      });
    

    camera设置视角, setView 和flyTo的区别

    setView会卡顿, flyTo有动画效果.

    相关文章

      网友评论

        本文标题:vue3 + cesium基础学习

        本文链接:https://www.haomeiwen.com/subject/pmnemdtx.html