ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

cesium实用功能-选中gltf、glb拖动修改位置,bim没试

2022-01-10 14:03:39  阅读:479  来源: 互联网

标签:实用功能 bim let viewer pickedObject params Cesium 没试 model


 function createModel() {
    var params = {
      tx: 94.94663004042711, //模型中心X轴坐标(经度,单位:十进制度)
      ty: 29.74529725388329,//模型中心Y轴坐标(纬度,单位:十进制度)
      tz: 3400.0, //模型中心Z轴坐标(高程,单位:米)
      rx: 0, //X轴(经度)方向旋转角度(单位:度)
      ry: 0, //Y轴(纬度)方向旋转角度(单位:度)
      rz: -90 //Z轴(高程)方向旋转角度(单位:度)
    };
    var point = viewer.entities.add({
      position: Cesium.Cartesian3.fromDegrees(params.tx, params.ty, 30),
      point: {
        pixelSize: 8,
        color: Cesium.Color.TRANSPARENT,
        outlineColor: Cesium.Color.RED,
        outlineWidth: 3,
      },
    });
    var model = viewer.scene.primitives.add(
      Cesium.Model.fromGltf({
        url: "./static/ceshi/hp3/滑坡原始位置/ys.gltf", //如果为bgltf则为.bgltf static\ceshi\滑坡原始位置(1)\滑坡原始位置\ys.gltf
        show: true,                     // default
        scale: 3.0,
        maximumScale: 1
      })
    );
    model.type = "model";
    model.tx = params.tx;
    model.ty = params.ty;
    model.tz = params.tz;
    model.rx = 0;
    model.ry = 0;
    model.rz = 0;

    update3dtilesMaxtrix(model, params)
    model.readyPromise.then(function (model) {
      viewer.camera.setView({
        destination: Cesium.Cartesian3.fromDegrees(params.tx,
          params.ty,
          60000.0),
        orientation: {
          heading: Cesium.Math.toRadians(0),
          pitch: Cesium.Math.toRadians(-90),
          roll: Cesium.Math.toRadians(0)
        }
      });
    }).otherwise(function (error) {
      window.alert(error);
    });
    let leftDownFlag = false;
    var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
    // 旋转的关键代码
    handler.setInputAction(function (movement) {
      pickedObject = viewer.scene.pick(movement.position);
      if (Cesium.defined(pickedObject)) {
        if (pickedObject.primitive.isCesium3DTileset == undefined) {
          leftDownFlag = true;
          document.body.style.cursor = 'pointer';
          viewer.scene.screenSpaceCameraController.enableRotate = false;//锁定相机
          pickedObject.primitive.color = new Cesium.Color(0, 1, 0, 1); //选中模型后高亮
          pickedObject.primitive.silhouetteSize = 3.0;//选中模型后高亮
        }
      }
    }, Cesium.ScreenSpaceEventType.LEFT_DOWN);
    handler.setInputAction(function () {
      if(Cesium.defined(pickedObject)){
        pickedObject.primitive.color = new Cesium.Color(1, 1, 1, 1);
        pickedObject.primitive.silhouetteSize = 0;
        leftDownFlag = false;
        pickedObject = null;
        viewer.scene.screenSpaceCameraController.enableRotate = true;//解除锁定相机
        document.body.style.cursor = 'default';
      }
    }, Cesium.ScreenSpaceEventType.LEFT_UP);
    handler.setInputAction((movement) => {
      if (leftDownFlag && pickedObject.primitive.modelMatrix) {
        // ************g关键代码:cartesian的值************
        // let ray = viewer.camera.getPickRay(movement.endPosition);
        // let cartesian = viewer.scene.globe.pick(ray, viewer.scene);
        
        // 屏幕转世界坐标
        let cartesian = viewer.scene.globe.pick(viewer.camera.getPickRay(movement.endPosition),viewer.scene);
        // 世界坐标转经纬度
        let ellipsoid = viewer.scene.globe.ellipsoid;
        let cartesian3=new Cesium.Cartesian3(cartesian.x,cartesian.y,cartesian.z);
        let cartographic=ellipsoid.cartesianToCartographic(cartesian3);
        let lat=Cesium.Math.toDegrees(cartographic.latitude);
        let lng=Cesium.Math.toDegrees(cartographic.longitude);
        params.tx = lng
        params.ty = lat
        console.log(lat,lng)
        update3dtilesMaxtrix(pickedObject,params)
      }
    }, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
  }
  function update3dtilesMaxtrix(model, params) {
    //旋转
    let mx = Cesium.Matrix3.fromRotationX(Cesium.Math.toRadians(params.rx));
    let my = Cesium.Matrix3.fromRotationY(Cesium.Math.toRadians(params.ry));
    let mz = Cesium.Matrix3.fromRotationZ(Cesium.Math.toRadians(params.rz));
    let rotationX = Cesium.Matrix4.fromRotationTranslation(mx);
    let rotationY = Cesium.Matrix4.fromRotationTranslation(my);
    let rotationZ = Cesium.Matrix4.fromRotationTranslation(mz);
    //平移
    let position = Cesium.Cartesian3.fromDegrees(params.tx, params.ty, params.tz);
    let m = Cesium.Transforms.eastNorthUpToFixedFrame(position);
    //旋转、平移矩阵相乘
    Cesium.Matrix4.multiply(m, rotationX, m);
    Cesium.Matrix4.multiply(m, rotationY, m);
    Cesium.Matrix4.multiply(m, rotationZ, m);
    //赋值给model
    if (Cesium.defined(model.primitive)) {
    model.primitive.modelMatrix = m;
    }
    model.modelMatrix = m;
    model.color = Cesium.Color.WHITE.withAlpha(1);
  }

标签:实用功能,bim,let,viewer,pickedObject,params,Cesium,没试,model
来源: https://blog.csdn.net/weixin_39216318/article/details/122409053

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有