基于Cesium实现拖拽3D模型的示例代码

 更新时间:2022年06月22日 15:49:00   作者:王+V  
这篇文章主要为大家详细介绍了如何利用Cesium实现在地图上添加一个3D模型,并且可以实现拖拽效果。文中的示例代码讲解详细,感兴趣的可以了解一下

这个地方是想实现一个什么效果呢?就是使用 cesium 在地图上添加一个3D模型,然后实现拖拽效果。

添加基站模型

然后这篇博文介绍的主要不是添加模型,但是也简单把代码直接粘贴过来吧,就不详细说了。

  // 添加基站模型
  function addSite() {
    let position = Cesium.Cartesian3.fromDegrees(116.236393, 40.075119, 0);
    // 设置模型方向
    let hpRoll = new Cesium.HeadingPitchRoll(Cesium.Math.toRadians(0), 0, 0);
    let orientation = Cesium.Transforms.headingPitchRollQuaternion(position, hpRoll);
    // 添加模型
    let model = viewer.entities.add({
      id: 'site',   // 模型id
      position: position,   // 模型位置
      orientation: orientation,   // 模型方向
      model: {
        uri: './models/siteModel/scene.gltf',   // 模型路径,自己换成自己的模型
        scale: 1,
        show: true, // 模型是否可见
      },
      description: '基站模型'  // 添加模型描述
    });
    viewer.trackedEntity = model;    // 视角切换到模型
  }

上边的代码就完成了在界面上添加模型功能。

拖拽

其实拖拽就是给这个cesium加一个监听事件。

比如说这个拖拽的简单逻辑分析哈:

1、鼠标按下事件,如果有模型的话,可以给模型设置一个颜色,知道按下选中的是哪个模型。

2、然后再监听鼠标拖拽事件,获取鼠标拖拽的位置,赋值给模型。

3、鼠标抬起事件,结束鼠标移动事件,然后把颜色改回去。

   // 注册事件
  function setHandler() {
    handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
    // 注册鼠标按下事件
    handler.setInputAction((e) => {
      const pick = viewer.scene.pick(e.position);
      if (!Cesium.defined(pick)) { return; };// 如果点击空白区域,则不往下执行
      viewer.scene.screenSpaceCameraController.enableRotate = false;// 将相机锁定,不然后续移动实体时相机也会动
      pick.id.model.color = Cesium.Color.fromAlpha(Cesium.Color.RED, 1)  //设置颜色

      // 注册鼠标拖拽事件
      viewer.screenSpaceEventHandler.setInputAction((arg) => {// 为viewer绑定MOUSE_MOVE事件监听器(执行函数,监听的事件)
        const position = arg.endPosition;// arg有startPosition与endPosition两个属性,即移动前后的位置信息:Cartesian2对象
        const cartesian = viewer.scene.globe.pick(viewer.camera.getPickRay(position), viewer.scene);//将Cartesian2转为Cartesian3
        pick.id.position._value = cartesian
      }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);


      // 绑定鼠标抬起事件
      viewer.screenSpaceEventHandler.setInputAction(({ position }) => {//为viewer绑定LEFT_UP事件监听器(执行函数,监听的事件)
        viewer.scene.screenSpaceCameraController.enableRotate = true;// 取消相机锁定
        pick.id.model.color = null  //设置颜色
        viewer.screenSpaceEventHandler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);// 解除viewer的MOUSE_MOVE事件监听器
      }, Cesium.ScreenSpaceEventType.LEFT_UP)

    }, Cesium.ScreenSpaceEventType.LEFT_DOWN);
  }

完成了这就,就是这么的简单。

到此这篇关于基于Cesium实现拖拽3D模型的示例代码的文章就介绍到这了,更多相关Cesium拖拽3D模型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Javascript中Eval函数的使用说明

    Javascript中Eval函数的使用说明

    JavaScript有许多小窍门来使编程更加容易。 其中之一就是eval()函数,这个函数可以把一个字符串当作一个JavaScript表达式一样去执行它。
    2008-10-10
  • JS闭包原理与应用经典示例

    JS闭包原理与应用经典示例

    这篇文章主要介绍了JS闭包原理与应用,结合实例形式较为详细的分析了javascript闭包的原理、应用及相关操作注意事项,需要的朋友可以参考下
    2018-12-12
  • 微信小程序解除10个请求并发限制

    微信小程序解除10个请求并发限制

    这篇文章主要介绍了微信小程序解除10个请求并发限制,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • JS Generator 函数的含义与用法实例总结

    JS Generator 函数的含义与用法实例总结

    这篇文章主要介绍了JS Generator 函数的含义与用法,结合实例形式总结分析了JS Generator 函数基本含义、用法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • 转换json格式的日期为Javascript对象的函数

    转换json格式的日期为Javascript对象的函数

    项目中碰到了用jQuery从后台获取的json格式的日期的字符串,需要将此字符串转换成JavaScript的日期对象,记在此处,以备后用。
    2010-07-07
  • 最新Javascript程序员面试试题和解题方法

    最新Javascript程序员面试试题和解题方法

    本文主要给大家整理了最新的Javascript程序员面试试题以及相关的解题方法和思路。
    2017-11-11
  • JavaScript简单计算人的年龄示例

    JavaScript简单计算人的年龄示例

    这篇文章主要介绍了JavaScript简单计算人的年龄,涉及简单的javascript字符串转换及日期运算相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • 详解微信小程序(Taro)手动埋点和自动埋点的实现

    详解微信小程序(Taro)手动埋点和自动埋点的实现

    这篇文章主要介绍了详解微信小程序(Taro)手动埋点和自动埋点的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • js+html实现网页五子棋

    js+html实现网页五子棋

    这篇文章主要为大家详细介绍了js+html实现网页五子棋,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • JavaScript架构前端监控搭建过程步骤

    JavaScript架构前端监控搭建过程步骤

    这篇文章主要为大家介绍了JavaScript架构前端监控搭建过程步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论