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


    引入倾斜模型数据

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

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

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

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

    效果展示

    调整倾斜模型位置

    1. let tileset;
    2. try {
    3. tileset = await Cesium.Cesium3DTileset.fromUrl("/api/3DTiles/b3dm_qx/tileset.json");
    4. viewer.value.scene.primitives.add(tileset);
    5. viewer.value.zoomTo(tileset);
    6. // +++++++++
    7. // 原始点
    8. let boundingSphere = tileset.boundingSphere;
    9. let cartographic = Cesium.Cartographic.fromCartesian(
    10. boundingSphere.center
    11. );
    12. let longitude = cartographic.longitude;
    13. let latitude = cartographic.latitude;
    14. let height = cartographic.height;
    15. // 世界坐标
    16. let origin = Cesium.Cartesian3.fromRadians(
    17. cartographic.longitude,
    18. cartographic.latitude,
    19. cartographic.height
    20. );
    21. // 偏移后点
    22. let offset = Cesium.Cartesian3.fromRadians(
    23. longitude,
    24. latitude,
    25. height - 10
    26. );
    27. // 计算向量
    28. let translate = Cesium.Cartesian3.subtract(
    29. offset,
    30. origin,
    31. new Cesium.Cartesian3()
    32. );
    33. tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translate);
    34. viewer.value.scene.globe.depthTestAgainstTerrain = false; // 开启深度测试
    35. } catch (error) {
    36. console.log(`Error loading tileset: ${error}`);
    37. }

    完整代码

    1. <template>
    2. <div id="cesiumContainer"></div>
    3. </template>
    4. <script setup>
    5. import { onMounted, ref } from "vue";
    6. const viewer = ref(null);
    7. const initCesium = async () => {
    8. // 1.引入token
    9. Cesium.Ion.defaultAccessToken = "xxxxxxxxx";
    10. // 2.三维地球初始化
    11. viewer.value = new Cesium.Viewer("cesiumContainer", {
    12. animation: true, //是否创建动画小器件,左下角仪表
    13. shouldAnimate: true,
    14. fullscreenButton: false, //是否显示全屏按钮
    15. geocoder: false, //是否显示geocoder小器件,右上角查询按钮
    16. homeButton: false, //是否显示Home按钮
    17. infoBox: false, //是否显示信息框
    18. sceneModePicker: false, //是否显示3D/2D选择器
    19. scene3DOnly: false, //如果设置为true,则所有几何图形以3D模式绘制以节约GPU资源
    20. selectionIndicator: false, // 是否显示选取指示器组件
    21. timeline: false, // 是否显示时间轴
    22. navigationHelpButton: false,// 是否显示右上角的帮助按钮
    23. baselLayerPicker: false, // 将图层选择的控件关掉,才能添加其他影像数据
    24. shadows: false, // 是否显示背影
    25. baseLayerPicker: false, // 是否显示图层选择器
    26. orderIndependentTranslucency: false, //去掉大气层黑圈
    27. });
    28. // 加载3DTiles数据
    29. let tileset;
    30. try {
    31. tileset = await Cesium.Cesium3DTileset.fromUrl("/api/3DTiles/b3dm_qx/tileset.json");
    32. viewer.value.scene.primitives.add(tileset);
    33. viewer.value.zoomTo(tileset);
    34. // 原始点
    35. let boundingSphere = tileset.boundingSphere;
    36. let cartographic = Cesium.Cartographic.fromCartesian(
    37. boundingSphere.center
    38. );
    39. let longitude = cartographic.longitude;
    40. let latitude = cartographic.latitude;
    41. let height = cartographic.height;
    42. // 世界坐标
    43. let origin = Cesium.Cartesian3.fromRadians(
    44. cartographic.longitude,
    45. cartographic.latitude,
    46. cartographic.height
    47. );
    48. // 偏移后点
    49. let offset = Cesium.Cartesian3.fromRadians(
    50. longitude,
    51. latitude,
    52. height - 10
    53. );
    54. // 计算向量
    55. let translate = Cesium.Cartesian3.subtract(
    56. offset,
    57. origin,
    58. new Cesium.Cartesian3()
    59. );
    60. tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translate);
    61. viewer.value.scene.globe.depthTestAgainstTerrain = false; // 开启深度测试
    62. } catch (error) {
    63. console.log(`Error loading tileset: ${error}`);
    64. }
    65. //缩放
    66. viewer.value.scene.screenSpaceCameraController.zoomEventTypes = [
    67. Cesium.CameraEventType.WHEEL,
    68. Cesium.CameraEventType.PINCH,
    69. ];
    70. //视图视角切换
    71. viewer.value.scene.screenSpaceCameraController.tiltEventTypes = [
    72. Cesium.CameraEventType.PINCH,
    73. Cesium.CameraEventType.RIGHT_DRAG,
    74. ];
    75. }
    76. onMounted(() => {
    77. initCesium();
    78. })
    79. </script>
    80. <style scoped>
    81. #cesiumContainer {
    82. position: relative;
    83. width: 100vw;
    84. height: 100vh;
    85. }
    86. </style>

  • 相关阅读:
    百度程序员:进来看看这个代码,值T几的水平?丨黑马头条
    基于轻量级YOLOv5s开发构建隧道基建裂痕、脱落等缺陷问题检测系统
    性能小课堂:Jmeter录制手机app脚本!
    docker--基础(一)
    赤霉素3β-羟化酶的下调增强了大豆的光合作用并提高了种子产量
    maven的详细下载和安装
    汇编原理 | 二进制、跳转指令、算数运算、
    distinct 和 group by有什么区别
    Redis(三)session共享
    数组的方法以及数组的创建以及概念
  • 原文地址:https://blog.csdn.net/m0_56023096/article/details/136376437