【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>
相关推荐
TU不秃头1 小时前
JS逆向实战五:某海关公示平台分析(瑞数加密)
javascript·爬虫
南境十里·墨染春水3 小时前
C++传记(面向对象)虚析构函数 纯虚函数 抽象类 final、override关键字
开发语言·c++·笔记·算法
无巧不成书02183 小时前
30分钟入门Java:从历史到Hello World的小白指南
java·开发语言
2301_797172753 小时前
基于C++的游戏引擎开发
开发语言·c++·算法
anOnion4 小时前
构建无障碍组件之Carousel Pattern
前端·html·交互设计
ssshooter4 小时前
Tauri 2 iOS 开发避坑指南:文件保存、Dialog 和 Documents 目录的那些坑
前端·后端·ios
比昨天多敲两行4 小时前
C++ 二叉搜索树
开发语言·c++·算法
Можно5 小时前
深入理解 ES6 Proxy:与 Object.defineProperty 的全面对比
前端·javascript·vue.js
Birdy_x5 小时前
接口自动化项目实战(1):requests请求封装
开发语言·前端·python
海海不瞌睡(捏捏王子)5 小时前
C++ 知识点概要
开发语言·c++