Advertisement

Cesium添加模型

阅读量:

Cesium添加模型指南

添加3D模型的基本流程

初始化Cesium地图

创建模型管理类

设置模型位置和旋转

加载模型

普通3D模型

倾斜摄影模型

白膜模型

设置模型属性

添加交互功能

一、普通3D模型添加方法 ⭐⭐⭐

1. 基本代码实现

复制代码
    // 创建模型管理类
    const model3D = new Model3D(appGis, viewer);
    
    // 加载3D模型的核心代码
    const entity = viewer.entities.add({
      name: modelName,
      position: Cesium.Cartesian3.fromDegrees(longitude, latitude, height),
      orientation: Cesium.Transforms.headingPitchRollQuaternion(
    position,
    new Cesium.HeadingPitchRoll(heading, pitch, roll)
      ),
      model: {
    uri: modelUri,            // 模型文件路径,通常是glTF/glb格式
    scale: scale,             // 模型缩放比例
    minimumPixelSize: 128,    // 最小像素大小
    maximumScale: 100,        // 最大缩放比例
    clampToGround: true,      // 是否贴合地面
    heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
      }
    });
    
    
    javascript
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/pgUTBYoINsQ6Xe1DnqjWVfJ3MkEC.png)

2. 封装方法使用示例

复制代码
    // 更方便的调用方式
    model3D.loadModel({
      name: 'Bus',                            // 模型名称
      longitude: 117.004364,                  // 经度
      latitude: 40.074728,                    // 纬度 
      height: 0,                              // 高度
      modelUri: '/static/model/ThreeD/busStation.glb', // 模型URI
      scale: 1.0,                             // 模型缩放比例
      headingDegrees: 189,                    // 航向角度
      pitchDegrees: 0,                        // 俯仰角度
      rollDegrees: 0                          // 滚转角度
    });
    
    
    javascript
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/F5hzb6iSJCfdQvVWjeY7I3EuRP8D.png)

二、倾斜摄影模型加载 ⭐⭐

倾斜摄影模型通常是大规模的3D城市模型,以3D Tiles格式加载:

复制代码
    async function load3dTiles() {
      // 加载倾斜摄影数据
      const tileset = await Cesium.Cesium3DTileset.fromUrl('/path/to/tileset.json', {
    shadows: true,
    preferLeaves: true,
    skipLevelOfDetail: true,              // 启用跳过级别的细节
    maximumScreenSpaceError: 0.75,        // 最大屏幕空间误差
    maximumMemoryUsage: 2048,             // 最大内存使用量
    dynamicScreenSpaceError: true         // 启用动态屏幕空间误差
      });
      
      viewer.scene.primitives.add(tileset);
      
      // 对模型进行位置调整
      const boundingSphere = tileset.boundingSphere;
      const cartographicCenter = Cesium.Cartographic.fromCartesian(boundingSphere.center);
      const surface = Cesium.Cartesian3.fromRadians(cartographicCenter.longitude, 
                                              cartographicCenter.latitude, 0);
      const offset = Cesium.Cartesian3.fromRadians(cartographicCenter.longitude,
                                             cartographicCenter.latitude, 50);
      const translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
      tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
    }
    
    
    javascript
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/skbmp6GPSg7EWMn3daBF0Ly2YeVr.png)

三、白膜模型加载 ⭐⭐

白膜模型是一种特殊的3D模型样式,通常用于城市规划:

复制代码
    async function loadWhiteModel(uri) {
      const tileset = await Cesium.Cesium3DTileset.fromUrl(uri + 'tileset.json', {
    shadows: Cesium.ShadowMode.CAST_ONLY,
    maximumScreenSpaceError: 20,
    dynamicScreenSpaceError: true
      });
      
      // 设置模型样式 - 使用白色或自定义颜色
      tileset.style = new Cesium.Cesium3DTileStyle({
    color: 'color("white")'  // 可以是条件表达式
      });
      
      // 添加自定义着色器效果
      let customShader = new Cesium.CustomShader({
    // 着色器代码
    // ...
    
    // 动态更新shader参数
    update: function(shader) {
      shader.setUniform("u_time", performance.now() * 0.001);
    }
      });
      
      tileset.customShader = customShader;
      viewer.scene.primitives.add(tileset);
    }
    
    
    javascript
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/i2Rms57Ba4g3DzyCZvuk9HpQ6Pd8.png)

四、常见模型属性设置 ⭐⭐

属性名称 说明 示例值
scale 模型缩放比例 1.0表示原始大小
minimumPixelSize 模型最小像素大小 128保证远处可见性
maximumScale 模型最大缩放比例 100限制最大尺寸
clampToGround 是否贴合地面 true/false
heightReference 高度参考 CLAMP_TO_GROUND
silhouetteColor 轮廓颜色 Cesium.Color.RED
silhouetteSize 轮廓宽度 2.0像素宽度
color 模型颜色 Cesium.Color.WHITE
colorBlendMode 颜色混合模式 HIGHLIGHT高亮效果

五、模型交互技巧

1. 模型动画

复制代码
    // 模型飞行动画
    async ModelFlip(entity, positionArr = [longitude, latitude, height], duration = 5) {
      // 设置目标位置
      const targetPosition = Cesium.Cartesian3.fromDegrees(
    positionArr[0], positionArr[1], positionArr[2]
      );
      
      // 动画时长
      const startTime = Cesium.JulianDate.now();
      
      // 动画帧更新
      const updateAnimation = () => {
    const time = Cesium.JulianDate.now();
    const t = Cesium.JulianDate.secondsDifference(time, startTime) / duration;
    
    if (t >= 1.0) {
      // 动画结束
      return;
    }
    
    // 插值计算当前位置
    const position = Cesium.Cartesian3.lerp(
      startPosition, targetPosition, t, new Cesium.Cartesian3()
    );
    
    // 更新实体位置
    entity.position = position;
    
    // 请求下一帧
    requestAnimationFrame(updateAnimation);
      };
      
      // 开始动画
      updateAnimation();
    }
    
    
    javascript
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/IhVcmxCS4Lp6rWwXT32t5HGOAbia.png)

2. 模型显示/隐藏控制

复制代码
    // 显示/隐藏模型
    function toggleModelVisibility(modelName, isVisible) {
      const entity = model3D.getGlb(modelName);
      if (entity) {
    entity.show = isVisible;
    
    // 可选:飞行到模型位置
    if (isVisible) {
      viewer.flyTo(entity, {
        duration: 1.5,
        offset: new Cesium.HeadingPitchRange(
          0.0,                             // 航向角
          Cesium.Math.toRadians(-30.0),    // 俯仰角
          100.0                            // 距离
        )
      });
    }
      }
    }
    
    
    javascript
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/lH2YVCyjSeKMoAmgtuv4FhxTzd8w.png)

六、实际应用示例

以下是项目中添加多个模型的实际应用示例:

复制代码
    // 模型列表定义
    const Model3DList = [
      ['ISCD', [116.999934, 40.045339, 0], true, 'synaesthesiaModelLayer', [0, 0, 0], 4, 4, '/static/model/ThreeD/SynaesthesiaIntegratedDevice.glb'],
      ['WD', [117.000058, 40.045449, 0], true, 'wirelessModelLayer', [90, 0, 0], 4, 4, '/static/model/ThreeD/WirelessDection.glb'],
      ['RD', [117.000213, 40.045700, 0], true, 'RadioDetectionModelLayer', [0, 0, 0], 4, 4, '/static/model/ThreeD/RadioDetection.glb'],
      ['NSP', [116.999898, 40.045342, 0], true, 'NavigationSpoofingModelLayer', [0, 0, 0], 4, 4, '/static/model/ThreeD/NavigationSpoofing.glb'],
      ['Bus', [117.004364, 40.074728, 0], true, 'busstationModelLayer', [189, 0, 0], 1, 1, '/static/model/ThreeD/busStation.glb'],
      ['Bus2', [117.004146, 40.074770, 0], true, 'busstationModelLayer', [10, 0, 0], 1, 1, '/static/model/ThreeD/busStation.glb'],
    ]
    
    // 批量加载模型
    function loadAllModels() {
      Model3DList.forEach(item => {
    model3D.loadModel({
      name: item[0],
      longitude: item[1][0],
      latitude: item[1][1], 
      height: item[1][2],
      show: item[2],
      typeMap: item[3],
      headingDegrees: item[4][0],
      pitchDegrees: item[4][1],
      rollDegrees: item[4][2],
      scale: item[5],
      minimumPixelSize: item[6] * 32,
      modelUri: item[7]
    });
      });
    }
    
    
    javascript
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/31bRwqd96KuAtihalmBZXOrCDenG.png)

七、进阶技巧

1. 模型裁剪

复制代码
    // 裁剪地形和模型
    async function clipTerrain(options) {
      viewer.scene.globe.clippingPlanesEnabled = true;
      
      // 计算裁剪平面
      const clippingPlanes = new Cesium.ClippingPlaneCollection({
    planes: [
      // 多个裁剪平面定义...
      new Cesium.ClippingPlane(new Cesium.Cartesian3(1.0, 0.0, 0.0), -width/2),
      new Cesium.ClippingPlane(new Cesium.Cartesian3(-1.0, 0.0, 0.0), -width/2),
      // ...
    ],
    edgeWidth: 100.0,
    edgeColor: Cesium.Color.BLACK
      });
      
      viewer.scene.globe.clippingPlanes = clippingPlanes;
    }
    
    
    javascript
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/rGZ5jKXHPkSIQhNstFgM0uawloVf.png)

2. 自定义着色器效果

可以通过自定义着色器为模型添加特殊效果,如发光、渐变色等:

复制代码
    // 创建自定义着色器
    const customShader = new Cesium.CustomShader({
      // 顶点着色器和片元着色器代码
      vertexShaderText: /* GLSL */ `
    // 着色器代码...
      `,
      fragmentShaderText: /* GLSL */ `
    // 着色器代码...
      `,
      uniforms: {
    u_glowColor: {
      type: Cesium.UniformType.VEC3,
      value: [0.0, 1.0, 1.0]  // 青色光晕
    },
    u_glowPower: {
      type: Cesium.UniformType.FLOAT,
      value: 0.25
    }
      }
    });
    
    // 应用到模型
    tileset.customShader = customShader;
    
    
    javascript
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-16/bk0UjeO1cGsVpgxHWrR5MSECJhBF.png)

学习建议

  1. 从简单开始 :先尝试添加一个基本的glTF模型
  2. 理解坐标系统 :掌握Cesium中WGS84坐标系的使用
  3. 性能优化 :大型模型使用时注意设置适当的maximumScreenSpaceErrormaximumMemoryUsage
  4. 模型格式转换 :使用工具将不同格式的模型转换为glTF/glb格式
  5. 交互设计 :为模型添加鼠标事件,实现点击、悬停等交互功能

全部评论 (0)

还没有任何评论哟~