【CesiumJS-3】加载倾斜模型数据(3DTilest)以及修改位置

引入倾斜模型数据

复制代码
  // 加载3DTiles数据
  let tileset;
  try {
    tileset = await Cesium.Cesium3DTileset.fromUrl("/api/3DTiles/b3dm_qx/tileset.json");
    viewer.value.scene.primitives.add(tileset); // 倾斜模型添加到场景中
    viewer.value.zoomTo(tileset); // 视角定位到倾斜模型的位置
  } catch (error) {
    console.log(`Error loading tileset: ${error}`);
  }

await Cesium.Cesium3DTileset.fromUrl("/api/3DTiles/b3dm_qx/tileset.json")

倾斜模型的数据通过nginx代理本地文件夹以接口的形式获取;如果倾斜模型数据较小可直接放到项目文件Public目录下,以绝对路径的形式引入即可;

nginx代理本地文件夹相关操作链接

效果展示

调整倾斜模型位置

复制代码
  let tileset;
  try {
    tileset = await Cesium.Cesium3DTileset.fromUrl("/api/3DTiles/b3dm_qx/tileset.json");
    viewer.value.scene.primitives.add(tileset);
    viewer.value.zoomTo(tileset);

    // +++++++++
    // 原始点
    let boundingSphere = tileset.boundingSphere;
    let cartographic = Cesium.Cartographic.fromCartesian(
      boundingSphere.center
    );
    let longitude = cartographic.longitude;
    let latitude = cartographic.latitude;
    let height = cartographic.height;
    // 世界坐标
    let origin = Cesium.Cartesian3.fromRadians(
      cartographic.longitude,
      cartographic.latitude,
      cartographic.height
    );
    // 偏移后点
    let offset = Cesium.Cartesian3.fromRadians(
      longitude,
      latitude,
      height - 10
    );
    // 计算向量
    let translate = Cesium.Cartesian3.subtract(
      offset,
      origin,
      new Cesium.Cartesian3()
    );
    tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translate);

    viewer.value.scene.globe.depthTestAgainstTerrain = false; // 开启深度测试
  } catch (error) {
    console.log(`Error loading tileset: ${error}`);
  }

完整代码

复制代码
<template>
  <div id="cesiumContainer"></div>
</template>

<script setup>
import { onMounted, ref } from "vue";
const viewer = ref(null);

const initCesium = async () => {
  // 1.引入token
  Cesium.Ion.defaultAccessToken = "xxxxxxxxx";
  // 2.三维地球初始化
  viewer.value = new Cesium.Viewer("cesiumContainer", {
    animation: true, //是否创建动画小器件,左下角仪表
    shouldAnimate: true,
    fullscreenButton: false, //是否显示全屏按钮
    geocoder: false, //是否显示geocoder小器件,右上角查询按钮
    homeButton: false, //是否显示Home按钮
    infoBox: false, //是否显示信息框
    sceneModePicker: false, //是否显示3D/2D选择器
    scene3DOnly: false, //如果设置为true,则所有几何图形以3D模式绘制以节约GPU资源
    selectionIndicator: false, // 是否显示选取指示器组件
    timeline: false, // 是否显示时间轴
    navigationHelpButton: false,// 是否显示右上角的帮助按钮
    baselLayerPicker: false, // 将图层选择的控件关掉,才能添加其他影像数据
    shadows: false, // 是否显示背影
    baseLayerPicker: false, // 是否显示图层选择器
    orderIndependentTranslucency: false, //去掉大气层黑圈
  });

  // 加载3DTiles数据
  let tileset;
  try {
    tileset = await Cesium.Cesium3DTileset.fromUrl("/api/3DTiles/b3dm_qx/tileset.json");
    viewer.value.scene.primitives.add(tileset);
    viewer.value.zoomTo(tileset);
    
    // 原始点
    let boundingSphere = tileset.boundingSphere;
    let cartographic = Cesium.Cartographic.fromCartesian(
      boundingSphere.center
    );
    let longitude = cartographic.longitude;
    let latitude = cartographic.latitude;
    let height = cartographic.height;
    // 世界坐标
    let origin = Cesium.Cartesian3.fromRadians(
      cartographic.longitude,
      cartographic.latitude,
      cartographic.height
    );
    // 偏移后点
    let offset = Cesium.Cartesian3.fromRadians(
      longitude,
      latitude,
      height - 10
    );
    // 计算向量
    let translate = Cesium.Cartesian3.subtract(
      offset,
      origin,
      new Cesium.Cartesian3()
    );
    tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translate);

    viewer.value.scene.globe.depthTestAgainstTerrain = false; // 开启深度测试
  } catch (error) {
    console.log(`Error loading tileset: ${error}`);
  }

  //缩放
  viewer.value.scene.screenSpaceCameraController.zoomEventTypes = [
    Cesium.CameraEventType.WHEEL,
    Cesium.CameraEventType.PINCH,
  ];
  //视图视角切换
  viewer.value.scene.screenSpaceCameraController.tiltEventTypes = [
    Cesium.CameraEventType.PINCH,
    Cesium.CameraEventType.RIGHT_DRAG,
  ];

}

onMounted(() => {
  initCesium();
})
</script>

<style scoped>
#cesiumContainer {
  position: relative;
  width: 100vw;
  height: 100vh;
}
</style>
相关推荐
吴声子夜歌21 分钟前
Go——并发编程
开发语言·后端·golang
kyriewen38 分钟前
今天,百年巨头一次砍了9200人,而一个离职科学家的实话让全网睡不着觉
前端·openai·ai编程
ooseabiscuit40 分钟前
Laravel4.x:现代PHP框架的奠基之作
java·开发语言·php
问心无愧05131 小时前
ctf show web 入门42
android·前端·android studio
c1s2d3n4cs1 小时前
Qt模仿nlohmann::json进行序列化和反序列化
开发语言·qt·json
kyriewen1 小时前
老板逼我上AI,我偷偷在浏览器里跑LLaMA,省下20万API费
前端·react.js·llm
Beginner x_u2 小时前
前端八股整理(手写 02)|数组转树、数组扁平化、随机打乱一个数组
前端·数组·数组转树·数组扁平化
KaMeidebaby2 小时前
卡梅德生物技术快报|禽类成纤维细胞 FISH 实验:鸟类性别染色体基因定位技术实现与数据验证
前端·数据库·其他·百度·新浪微博
天若有情6732 小时前
前端高阶性能优化:跳出传统懒加载与预加载,基于用户行为做轻量预判加载
前端·性能优化
小小小小宇2 小时前
前端转后端:SQL 是什么
前端